[
  {
    "path": ".github/workflows/qt.yml",
    "content": "name: CI build\n\non: [push]\n\njobs:\n  build:\n    strategy:\n      fail-fast: false\n      matrix:\n        version:\n          - 5.15.0\n          \n        platform:\n          - gcc_64\n          - android\n          - msvc2019\n          - msvc2019_64\n          - mingw81_64\n          - mingw81_32\n          - clang_64\n\n        include:\n          - platform: gcc_64\n            os: ubuntu-latest\n          - platform: android\n            os: ubuntu-latest\n          - platform: msvc2019_64\n            os: windows-latest\n          - platform: msvc2019\n            os: windows-latest\n          - platform: mingw81_64\n            os: windows-latest\n          - platform: mingw81_32\n            os: windows-latest\n          - platform: clang_64\n            os: macos-latest\n            \n    runs-on: ${{matrix.os}}\n    steps:\n      - uses: actions/checkout@v1\n        with:\n          submodules: recursive\n      - uses: actions/setup-python@v1\n      - uses: Skycoder42/action-setup-qt@master\n        id: qt\n        with:\n          version: ${{matrix.version}}\n          platform: ${{matrix.platform}}\n          packages: qt.tools.ifw.32\n      - name: qmake\n        run: |\n          qmake CONFIG+=install_ok QT_PLATFORM=${{matrix.platform}} \"QT_TOOL_PATH=${{steps.qt.outputs.qtdir}}/Tools\" aseman.pro\n          ${{steps.qt.outputs.make}} qmake_all\n      - name: make module\n        run: |\n          ${{steps.qt.outputs.make}}\n          ${{steps.qt.outputs.make}} INSTALL_ROOT=\"${{steps.qt.outputs.installdir}}\" install\n      - name: upload module to releases\n        uses: Skycoder42/action-upload-release@master\n        if: startsWith(github.ref, 'refs/tags/')\n        with:\n          repo_token: ${{secrets.GITHUB_TOKEN}}\n          directory: ${{steps.qt.outputs.outdir}}\n          platform: ${{matrix.platform}}\n          asset_name: nut-${{matrix.platform}}-${{matrix.version}}\n          tag: ${{github.ref}}\n          overwrite: true\n\n  deploy:\n    if: startsWith(github.ref, 'refs/tags/')\n    needs: build\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v1\n        with:\n          submodules: recursive\n          path: source\n      - uses: actions/setup-python@v1\n      - uses: Skycoder42/action-deploy-qt@master\n        with:\n          token: ${{secrets.GITHUB_TOKEN}}\n          version: 5.15.0\n          host: ${{secrets.SSHFS_HOST}}\n          key: ${{secrets.SSHFS_KEY}}\n          port: ${{secrets.SSHFS_PORT}} \n"
  },
  {
    "path": ".gitignore",
    "content": "# C++ objects and libs\n\n*.slo\n*.lo\n*.o\n*.a\n*.la\n*.lai\n*.so\n*.dll\n*.dylib\n\n# Qt-es\n\n/build\n/old\n/.qmake.cache\n/.qmake.stash\n*.pro.user\n*.pro.user.*\n*.qbs.user\n*.qbs.user.*\n*.moc\nmoc_*.cpp\nmoc_*.h\nqrc_*.cpp\nui_*.h\nMakefile*\n*build-*\n\n# QtCreator\n\n*.autosave\n\n# QtCtreator Qml\n*.qmlproject.user\n*.qmlproject.user.*\n\n# QtCtreator CMake\nCMakeLists.txt.user*\n\n# OSX\n.DS_Store\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"src/httpserver/qhttp\"]\n\tpath = src/httpserver/qhttp\n\turl = https://github.com/Aseman-Land/qhttp.git\n"
  },
  {
    "path": ".qmake.conf",
    "content": "load(qt_build_config)\r\n\r\nMODULE_VERSION = 3.1.5\r\n"
  },
  {
    "path": "LICENSE",
    "content": "                   GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n  This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n  0. Additional Definitions.\n\n  As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n  \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n  An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n  A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library.  The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n  The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n  The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n  1. Exception to Section 3 of the GNU GPL.\n\n  You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n  2. Conveying Modified Versions.\n\n  If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n   a) under this License, provided that you make a good faith effort to\n   ensure that, in the event an Application does not supply the\n   function or data, the facility still operates, and performs\n   whatever part of its purpose remains meaningful, or\n\n   b) under the GNU GPL, with none of the additional permissions of\n   this License applicable to that copy.\n\n  3. Object Code Incorporating Material from Library Header Files.\n\n  The object code form of an Application may incorporate material from\na header file that is part of the Library.  You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n   a) Give prominent notice with each copy of the object code that the\n   Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the object code with a copy of the GNU GPL and this license\n   document.\n\n  4. Combined Works.\n\n  You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n   a) Give prominent notice with each copy of the Combined Work that\n   the Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the Combined Work with a copy of the GNU GPL and this license\n   document.\n\n   c) For a Combined Work that displays copyright notices during\n   execution, include the copyright notice for the Library among\n   these notices, as well as a reference directing the user to the\n   copies of the GNU GPL and this license document.\n\n   d) Do one of the following:\n\n       0) Convey the Minimal Corresponding Source under the terms of this\n       License, and the Corresponding Application Code in a form\n       suitable for, and under terms that permit, the user to\n       recombine or relink the Application with a modified version of\n       the Linked Version to produce a modified Combined Work, in the\n       manner specified by section 6 of the GNU GPL for conveying\n       Corresponding Source.\n\n       1) Use a suitable shared library mechanism for linking with the\n       Library.  A suitable mechanism is one that (a) uses at run time\n       a copy of the Library already present on the user's computer\n       system, and (b) will operate properly with a modified version\n       of the Library that is interface-compatible with the Linked\n       Version.\n\n   e) Provide Installation Information, but only if you would otherwise\n   be required to provide such information under section 6 of the\n   GNU GPL, and only to the extent that such information is\n   necessary to install and execute a modified version of the\n   Combined Work produced by recombining or relinking the\n   Application with a modified version of the Linked Version. (If\n   you use option 4d0, the Installation Information must accompany\n   the Minimal Corresponding Source and Corresponding Application\n   Code. If you use option 4d1, you must provide the Installation\n   Information in the manner specified by section 6 of the GNU GPL\n   for conveying Corresponding Source.)\n\n  5. Combined Libraries.\n\n  You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n   a) Accompany the combined library with a copy of the same work based\n   on the Library, uncombined with any other library facilities,\n   conveyed under the terms of this License.\n\n   b) Give prominent notice with the combined library that part of it\n   is a work based on the Library, and explaining where to find the\n   accompanying uncombined form of the same work.\n\n  6. Revised Versions of the GNU Lesser General Public License.\n\n  The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n  Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n  If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary.\n"
  },
  {
    "path": "README.md",
    "content": "<img src=\"icons/logo.png\" align=\"right\" />\n\n# Qt Aseman\n\n- [What is QtAseman?](https://github.com/Aseman-Land/QtAseman#what-is-qtaseman)\n- [New in QtAseman 3.1.x](https://github.com/Aseman-Land/QtAseman#new-in-qtaseman-31x)\n- [How to Install](https://github.com/Aseman-Land/QtAseman#how-to-install)\n- [How to Build](https://github.com/Aseman-Land/QtAseman#how-to-build)\n- [How to create a QML application using QtAseman](https://github.com/Aseman-Land/QtAseman#how-to-create-a-qml-application-using-qtaseman)\n- [QtAseman QML modules](https://github.com/Aseman-Land/QtAseman#qtaseman-qml-modules)\n- [Documents](https://github.com/Aseman-Land/QtAseman#documents)\n- [Donation](https://github.com/Aseman-Land/QtAseman#donation)\n\n## What is QtAseman\n\nQtAseman is a set of tools, design patterns and architectures that we have developed over the years in various projects for wide range of uses. Now, with it's proven stability, we have decided to release this collection with the name QtAseman as an Open Source and Free tool under the LGPLv3 license.\n\n![Snapshot](https://aseman.io/projects/qtaseman/snapshot.png)\n\nSome main features to use on QML are:\n\n- Viewport tools that provides unique page manager system (page, popup, stack, dialog and ...)\n- Gestures for viewports \n- Transparent statusbar and optional navigation bar on mobile devices\n- Some extra Qml controls components like Drawer, Header, TextField, CircularProgressBar and ...\n- BackHandler system\n- Font awesome and Material icons fonts\n- VideoPlayer component\n- Some graphical components like shadows for easy to use and better experiance\n- Network and Http Request handler\n- Models and Abstract models with better experience\n- Encrypt/Decrypt tools\n- Qt/C++ Like Hash, Map and List objects\n- Tools to get more device infos like deviceId, density, keyboard height, statusBar height and ...\n- Translation manager tools\n- Settings manager\n- Some other tools like file read/write methods, type convert methods and ...\n- Process executer tools from QML\n\n## New in QtAseman 3.9.x\n\n- QtAseman's Control Beta.\n  It's a simple example:\n\n```js\nimport QtQuick 2.15\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.MaterialIcons 2.0\n\nWindow {\n    title: qsTr(\"Hello World\")\n\n    Style.primaryColor: \"#3f51b5\"\n    Style.primaryTextColor: \"#fff\"\n    \n    Page {\n        id: page\n        anchors.fill: parent\n        title: \"Home\"\n        header: Header {\n            width: parent.width\n        }\n        \n        Button {\n            id: btn\n            anchors.centerIn: parent\n            highlighted: true\n            icon: MaterialIcons.mdi_dialpad\n            text: \"Test Page\"\n            onClicked: test_stack.open()\n        }\n    }\n\n    StackPage {\n        id: test_stack\n        Page {\n            id: testStack\n            header: Header {\n                height: 50\n                width: parent.width\n            }\n\n            Button {\n                anchors.centerIn: parent\n                highlighted: true\n                icon: MaterialIcons.mdi_chevron_left\n                text: \"Back\"\n                onClicked: test_stack.close()\n            }\n        }\n    }\n}\n```\n\n\n\n## How to Install\n\nCurrently binary packages only available on the ubuntu (launchpad) repositories. To install it on the ubuntu 20.04 LTS:\n\n```bash\nsudo add-apt-repository ppa:aseman/qt-modules\nsudo apt install qt5aseman\n```\n\nand to install development files install `qt5aseman-dev` package.\non Arch you can use [AUR](https://aur.archlinux.org/packages/qt-aseman) (Thanks [molaeiali](https://github.com/molaeiali)):\n\n```bash\nyay -S qt-aseman\n```\n\n## How to build\n\nQtAseman uses standard Qt module mechanisms and it only depends on Qt libraries. Therefor it's quite easy to build on all platforms. Just clone it and build it easily:\n\n```bash\ngit clone https://github.com/Aseman-Land/QtAseman.git --recursive\ncd QtAseman\nmkdir build && cd build\nqmake -r ..\nmake -j2\nmake install\n```\n\nThe easiest way to build is to open it using QtCreator and click on the build icon :)\nAfterwards just run `make install` command to install it in the Qt location.\n\n### QtCreator Wizard\n\nIt will install automatically on Linux based operating systems.\n\nFor other Operating systems, to install QtCreator's wizards, Just copy `src/wizards/qtcreator/qtasemanapplication/` directory to `share/qtcreator/templates/wizards/projects/` directory of the QtCreator.\n\n## How to create a QML application using QtAseman\n\nOne of the main assets of QtAseman is that you can add it to your project without any extra change to the standard structure of the default QML app.\n\nSo To create an application using QtAseman, Just create a new QML project in your QtCreator and add AsemanQML module to the project. Now you can use all QtAseman components:\n\n```js\nimport AsemanQml.Controls 2.0\nimport QtQuick.Controls 2.12\n\nAsemanWindow {\n    visible: true\n    width: 480\n    height: 720\n    title: qsTr(\"QtAseman Example\")\n    \n    Label {\n        anchors.centerIn: parent\n        text: \"Hello World! :)\"\n    }\n}\n```\n\nIf you wish to change any application attribute like applicationName or applicationOrganization you can create an `AsemanApp` object in the parent of  `AsemanWindow`. Although it's completely optional and you can ignore it.\n\n```js\nimport AsemanQml.Controls 2.0\n\nAsemanApplication {\n    id: app\n    applicationAbout: \"QtAseman Application\"\n    applicationDisplayName: \"QtAseman\"\n    applicationId: \"be2a1f0c-34aa-44ed-8e65-4b1720e560b8\"\n    organizationDomain: \"aseman.io\"\n    \n    AsemanWindow {\n        visible: true\n        width: 480\n        height: 720\n    }\n}\n```\n\nWe suggest you to also create an AsemanApplication object, because QtAseman handles config file paths better while this attributes is set.\n\n**Note**: In order to make all modules work correctly on android devices you must replace `io.aseman.android.AsemanApplication` and `io.aseman.android.AsemanActivity` with Qt's values in the android manifest file.\n\n## QtAseman QML Modules\n\nThere are many modules and components in QtAseman that will help you create applications without use of any extra C++ code.\nAlso QtAseman offers a great software architecture for each module that makes development much more easier and faster.\n\n### AsemanQml.Base\n\nAsemanQml.Base module provides many base and core modules for your application. For example modules like Device infos, Desktop functions tools, data type converters, lists, hashes and etc. are placed in Base module.\n\nhere is one of the main uses of Base module:\n\n```js\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Base 2.0\n\nAsemanWindow {\n    visible: true\n    width: 480\n    height: 720\n    title: qsTr(\"QtAseman Example\")\n    \n    Rectangle {\n        height: Devices.statusBarHeight\n        width: parent.width\n        color: \"blue\"\n    }\n}\n```\n\nQtAseman makes mobile status bars transparent by default and `Devices.statusBarHeight` returns the status bar height of the device. The above example makes the status bar color blue. If there is no status bar on the device (like desktop operation systems) it returns zero as the result.\n\nYou can get other useful values like screen density, suggested font density, main OS folder locations, platform details, device type and etc. using `Devices` component.\n\nAlso there is `Tools` component that provides some extra tools for applications, like methods to read or write to/from files or methods to convert json to variant map or convert url to local path and etc.\n\nFor example below codes create sha256 hash:\n\n```js\nvar sha = Tools.hash(\"12345\", Tools.Sha256);\n```\n\nOr below codes read text from file:\n\n```js\nvar text = Tools.readText(\"/home/bardia/file.txt\");\n```\n\nThere is also a `Process` component that runs processes or a great back handler component named `BackHandler`.\n\n#### BackHandler\n\n`BackHandler` component provides back mechanism for your application. It's simple and easy to work with, plus all components of QtAseman support it by default, therefore it handles back actions automatically without the direct interference of developer.\n\nBelow example shows you how to use `BackHandler` component in your code:\n\n```js\n\nButton {\n    anchors.centerIn: parent\n    text: \"Show\"\n    onClicked: subRect.visible = true\n}\n\nRectangle {\n    id: subRect\n    anchors.fill: parent\n    visible: false\n    onVisibleChanged: {\n        if (visible)\n            BackHandler.pushHandler(subRect, function(){ subRect.visible = false })\n        else\n            BackHandler.removeHandler(subRect)\n    }\n\n    Button {\n        anchors.centerIn: parent\n        text: \"Hide\"\n        onClicked: BackHandler.back()\n    }\n}\n```\n\nBeside clicking on the hide button to trigger back function, you can press Esc button or the physical back button of device. On mobile devices if there is no back function in the BackHandler stack and back() method is called, application will try to quit.\n\n**Note**: You must use AsemanWindow object to make Esc or Physical back button work.\n\n#### Settings\n\nCreates a settings file in a specific path and stores settings values there:\n\n````js\nSettings {\n    id: settings\n    category: \"General\"\n    source: AsemanApp.homePath + \"/ui-settings.ini\"\n\n    property bool languageInited: false\n    property int nightMode: 0\n    property int colorTheme: 0\n    property int darkColorTheme: 3\n}\n````\n\nEvery change in setting's property is saved and can be restored within the next load of application.\n\n#### Translations\n\n`Translations` and `TranslationManager` provide functions and tools to manage translation in your application:\n\n```js\nTranslationManager {\n    id: translationManager\n    \n    // Finds all lang-*.qm files in the sourceDirectory using three below lines\n    sourceDirectory: \"../translations\"\n    delimiters: \"-\"\n    fileName: \"lang\"\n    \n    localeName: \"fa\"\n}\n\nButton {\n    // Everytime translation changed to other language, Every refresher texts\n    // will refreshed and translated to the new language\n    text: qsTr(\"Dismiss\") + Translations.refresher\n}\n```\n\n#### RoundedItem\n\nIt renders every included child item as rounded. For example below code shows an image with rounded corners:\n\n```js\nRoundedItem {\n    width: 100\n    height: 100\n    radius: 10\n    \n    Image {\n        anchors.fill: parent\n        source: \"image.png\"\n    }\n}\n```\n\n#### DelegateSwitch\n\n`DelegateSwitch` provides a component to switch between two or more children components on the fly. For example:\n\n```js\nListView {\n    model: 20\n    delegate: DelegateSwitch {\n        current: model.index % 2\n        Component {\n            Rectangle {\n                width: 100; height: 40\n                color: \"red\"\n            }\n        }\n        Component {\n            Rectangle {\n                width: 40; height: 40\n                color: \"blue\"\n            }\n        }\n    }\n}\n```\n\nThis example shows red rectangles on even indexes and blue squeres on odd indexes.\n\n#### ReadMore\n\n To read more about Base module, please read [this document](documents/AsemanQml.Base.md).\n\n### AsemanQml.Controls\n\nControls module provides any control module like QtQuick.Controls. For example It provides `AsemanApplication ` , `AsemanWindow`, `SideMenu`, `Header` and many other components.\n\nBelow example shows a simple usage of the `Controls` component.\n\n```js\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\n\nAsemanWindow {\n    visible: true\n    width: 480\n    height: 720\n    title: qsTr(\"Hello World\")\n    \n    Header {\n        width: parent.width\n        text: \"Hello\"\n        color: \"#18f\"\n    }\n\n    Drawer {\n        id: menu\n        anchors.fill: parent\n        delegate: Rectangle {\n            anchors.fill: parent\n            color: \"#333\"\n        }\n    }\n\n    HeaderMenuButton {\n        id: btn\n        /* \n         * If BackHandler stack is not empty, It shows back \n         * button instead of hamburger btn. \n         */\n        ratio: BackHandler.count? 1 : menu.percent\n        onClicked: BackHandler.count? BackHandler.back() : menu.show()\n    }\n}\n```\n\n### AsemanQml.Viewport\n\nViewport module provides a new design architecture for applications. \n\nThere is a `Viewport` component that provides a manage mechanism for your page, popup, dialogs and etc.\n\n[![Viewport Video](https://aseman.io/aseman/viewport.jpg)](https://youtu.be/hqBt8GOXQB0ase)\n\nBelow example shows you the usage of the `Viewport` component.\n\n```js\nimport AsemanQml.Viewport 2.0\n/*\n * Viewport component manage pages and Way of the they opened.\n * Like popups, pages, dialogs or ...\n * It also supports BackHandler by default like other QtAseman components\n */\nViewport {\n    id: viewPort\n    anchors.fill: parent\n    mainItem: Page {\n        // Main/Default Viewport item\n        anchors.fill: parent\n\n        Button {\n            text: \"Open\"\n            anchors.centerIn: parent\n            \n            // append hiComponent to the viewPort stack and open it as page\n            // append() returns a refrence to the created ui object.\n            // Types are: page, activity, popup, dialog, menu and drawer\n            onClicked: viewPort.append(hiComponent, undefined, \"page\")\n        }\n    }\n}\n\nComponent {\n    id: hiComponent\n    Page {\n        id: page\n        anchors.fill: parent\n        property int cnt\n\n        Button {\n            id: btn\n            text: \"Open \" + (page.cnt+1)\n            anchors.centerIn: parent\n            \n            // append method could also pass properties to the dest object\n            onClicked: viewPort.append(hiComponent, {\"counter\": page.cnt+1}, \"popup\")\n        }\n    }\n}\n```\n\nThere is also an attached property, you can use to call append function in the Viewport's childeren components:\n\n```js\nViewport.viewport.append(...)\n```\n\n#### ViewportController\n\nUsing `ViewportController` components you won't need to create a complicated architecture. It helps you to make your architecture quite easy and dynamic.\n\nBelow example shows you how to create UI and open them easily in the apps.\n\nUsing this design architecture, you create separated UI files, link them to their specific path and just call them using controllers anywhere in the App.\n`ViewportController` opens them automatically in the `Viewport`.\n\n```js\nViewport {\n    id: viewPort\n    anchors.fill: parent\n    mainItem: Page {\n        anchors.fill: parent\n\n        Button {\n            text: \"Open\"\n            anchors.centerIn: parent\n            // Trigger the path and open UI item that linked to the path.\n            // trigger() returns a refrence to the created ui object.\n            onClicked: controller.trigger(\"main://test/bardia\")\n        }\n    }\n}\n\nViewportController {\n    id: controller\n    viewport: viewPort\n\n    // Define all your UI routes that connect paths to UI components.\n    ViewportControllerRoute {\n        route: /main:\\/\\/test\\/.*/\n        sourceComponent: hiComponent\n        viewportType: \"popup\" \n    }\n\n    ViewportControllerRoute {\n        route: /about:\\/\\/aseman\\/.*/\n        // You can also use `source` property and pass component's url to it.\n        sourceComponent: aboutComponent\n        viewportType: \"page\" \n    }\n}\n\nComponent {\n    id: hiComponent\n    Page {\n        anchors.fill: parent\n        \n        Button {\n            text: \"About\"\n            anchors.centerIn: parent\n            /*\n             * You can also pass properties to object using js map\n             * or using html query way (about://aseman/test?text=about&color=blue)\n             */\n            onClicked: controller.trigger(\"about://aseman/test\", {\"text\": \"about\"})\n        }\n    }\n}\nComponent {\n    id: aboutComponent\n    Label {\n        anchors.fill: parent\n        verticalAlignment: Text.AlignVCenter\n        horizontalAlignment: Text.AlignHCenter\n        \n         // If you specify a url property, triggered url will put to this property\n        property string url\n        \n         // If you specify a properties property, initial properties will put to this property\n        property variant properties\n    }\n}\n```\n\nThere is also an attached property, you can use to call trigger function in the Viewport's childeren components:\n\n```js\nMouseArea {\n    onClicked: Viewport.controller.trigger(\"about://aseman/test\", {\"text\": \"about\"})\n}\n```\n\n`Viewport.controller` method returns first controller of the parent Viewport. If you wish to get all controllers as array, use `Viewport.allController` method instead.\n\n#### ViewportType Attached Property\n\nUsing `ViewportType` attached property, you can change some attributes on the current Viewport's type item:\n\n```js\nViewportType.gestureWidth: 10 // Change touch/mouse gesture area's width\nViewportType.touchToClose: false // Disable touch background to close feature\nViewportType.blockBack: true // Disable press back to close feature\nViewportType.open: false // Close current page of the viewport\nViewportType.transformOrigin: Qt.point(10, 20) // Sets transform origin on some types like menu\n```\n\n### AsemanQml.Network\n\nNetwork module provides components to send network requests. For Example `NetworkRequestManager` and `NetworkRequest` could send http requests like post, get, put and etc.\nBelow example shows you a simple usage of network module.\n\n```js\nimport AsemanQml.Network 2.0\n\nButton {\n    text: \"Signup\"\n    onClicked: networkManager.post(signInRequest) // get, post, put or ...\n}\n\nBusyIndicator { running: signInRequest.refreshing }\n\nNetworkRequestManager { id: networkManager }\n\nNetworkRequest {\n    id: signInRequest\n    contentType: NetworkRequest.TypeJson\n    url: \"https://example.com/auth/signIn\"\n    headers: {\n        \"Authorization\": \"Bearer ...\",\n    }\n\n    // Properties will post as json file map\n    property string username: \"test\"\n    property string password: \"pass1234\"\n        \n    // If you specified url property with TypeForm, It will send file, Else send it as string\n    property url filePath\n\n    onServerError: ; // server error codes\n    onClientError: ; // client error codes\n    onSuccessfull: {\n        // Response contains response map if it's json\n        // or if not response text\n        console.debug(response.token)\n    }\n}\n```\n\nYou can create many simple request files in your project and every time you need them, just send them to the server using NetworkRequestManager and get your response.\n\n### AsemanQml.Models\n\nModels module provide some ready to use models like `CountriesModel` and `FileSystemModel` and Also provide a new Model mechanism that make works with models easier on the QML.\n\n#### AsemanListModel\n\nAsemanListModel provides a model component for advanced usage of QML. Below example shows how to use AsemanListModel in your code:\n\n```js\nAsemanListModel {\n    id: model\n    data: [\n        {\n            \"name\": \"bardia\",\n            \"age\": 30 + 2 // It supports js values too.\n        },\n        {\n            \"name\": \"amir\",\n            \"age\": 31\n        }\n    ]\n    // cachePath store model data to the file and restore it everytime\n    // Application load again\n    cachePath: AsemanApp.homePath + \"/ages.model\"\n}\n```\n\n**Note**: `AsemanApp.homePath` returns standard path to store config files.\n\nAnd You can manage your model using below methods:\n\n```js\nvar value = model.get(idx, \"propertyName\");\nvar allValues = model.get(idx); // allValues.propertyName is equal to value\nmodel.clear();\nmodel.append({\"name\", \"bardia\", \"age\": 30});\nvar data = model.data; // Get all data of the model as list\nvar json = Tools.variantToJson(data); // Convert data to json string\n```\n\n#### AsemanListModelSource\n\nYou can use `AsemanListModelSource` component to pass two or more different sources to the `AsemanListModel`:\n\n```js\nAsemanListModel {\n    AsemanListModelSource {\n        // obj is an object that has a result property, returns variant/array/map\n        source: obj.result\n        path: \"data->users[2]->childeren\"\n    }\n    AsemanListModelSource {\n        source: { title: \"test\", list: [a, b, c, d] }\n        path: \"list\"\n    }\n}\n```\n\nIt useful when for example you want to merge two or more requests responses to one model.\n\n#### Model's Hints\n\nThere is a mechanism to arrange and change model's data in easier way without even one line JavaScript code using Aseman's Models mechanism.\nThis feature is Hints. You can rename keys (for example change user_name to userName), even change paths of them (for example change results.user.name to userName), change values formats (for example change gregorian date to jalali date), or ... using hints.\n\n```js\nAsemanListModel {\n    ...\n\t\n    // Copy \"results.user.name\" to \"userName\"\n    ModelCopyHint {\n        path: \"results->user->name\"\n        targetPath: \"userName\"\n    }\n    \n    // Make all \"results.user.nickname\" values upperCase\n    ModelFormatHint {\n        path: \"results->user->nickname\"\n        method: function(arg) { return arg.toUpperCase() }\n    }\n    \n    // Convert all keys to camel case.\n    ModelCamelCaseHint {\n    }\n    \n    // Delete \"results.images[0].caption\"\n    ModelDeleteHint {\n\t\tpath: \"results->images[0]->caption\"\n    }\n}\n```\n\n### AsemanQml.Sql\n\nSql module provides some tools to add SQL features to your applications. It supports SQLite, MySQL, PostgreSQL and also MSSQL. Below example shows how to use it:\n\n```js\nimport AsemanQml.Sql 2.0\n\nAsemanListModel {\n    id: model\n    data: mysql.select(\"INNER JOIN ...\", \"title LIKE :title and id > :id\", {title: \"hi%\", id: 10})\n    // Also you can use it without join and also where arguments.\n}\n\nSqlObject {\n    id: mysql\n    databaseName: \"TestDB\"\n    driver: SqlObject.MySQL\n    host: \"127.0.0.1\"; port: 3306\n    userName: \"user\"; password: \"password\"\n    \n    table: \"TestTable\"\n    primaryKeys: [\"id\"]\n    property int id: 10\n    property string title\n    property date updateTime\n    \n    Component.onCompleted: {\n    \t// It fetchs title and updateTime of id=10 to title and updateTime properties\n        fetch();\n        \n        title = \"Hi :)\"\n        update(); // Update value,\n    }\n}\n\nSqlObject {\n    id: sqlite\n    databaseName: \"/Path/to/db\"\n    driver: SqlObject.SQLite\n    \n    Component.onCompleted: {\n        var result = query(\"SOME QUERY\");\n        // You can use queryAsync(\"SOME QUERY\", {...binds...}, function(res){...})\n        // Method to run queries in async mode\n        console.debug( Tools.variantToJson(result) );\n    }\n}\n```\n\n### AsemanQml.MaterialIcons and AsemanQml.Awesome\n\nThese two modules provide access to the MaterialIcons and FontAwesome font icons. The usage is easy:\n\n```js\nimport AsemanQml.MaterialIcons 2.0\nimport AsemanQml.Awesome 2.0\n\nLabel {\n    font.family: Awesome.family\n    text: Awesome.fa_github\n}\nLabel {\n    font.family: MaterialIcons.family\n    text: MaterialIcons.mdi_github\n}\n```\n\n## Advanced options using C++\n\nIf you need to access advanced options or create components inherited from QtAseman or even have further use using C++  simply add below line to your `.pro` file and use components there:\n\n```\nQT += asemancore asemangui asemanqml asemannetwork asemanwidgets asemangeo\n```\n\n### AsemanHttpServer\n\nAsemanHttpServer is a [qhttp](https://github.com/azadkuh/qhttp) fork, that create routing API for it. So it's async, thread supports and easy to use:\n\n```c++\nAsemanHttpServer server;\n\n// Sync\nserver.route(\"/hello/sync\", AsemanHttpServer::HttpMethod::GET, [](const AsemanHttpServer::Request &) {\n    return QStringLiteral(\"Hello Sync\");\n});\n\n// ASync\nserver.route(\"/hello/async\", AsemanHttpServer::HttpMethod::GET, [](const AsemanHttpServer::Request &, AsemanHttpServer::Responder *responder) {\n    responder->write(QStringLiteral(\"Hello ASync\"));\n});\n\n// ASync Threaded (It will run on another thread automatically)\nserver.route(\"/hello/async\", AsemanHttpServer::HttpMethod::GET, [](const AsemanHttpServer::Request &, AsemanHttpServer::Responder *responder) {\n    // Runs on another thread\n    responder->write(QStringLiteral(\"Hello ASync\"));\n}, true);\n```\n\n## Documents\n\nWe have started to document all modules and their essential details using Doxygen standards we will put them in documents folder, but the full documentation process is under developing and not completed yet.\n\n## Donation\n\n[Help us to keep QtAseman up to date](https://aseman-land.github.io/QtAseman)\n"
  },
  {
    "path": "SourceDiary.sh",
    "content": "#! /bin/sh\n# Set the home if not already set.\nif [ \"${ASEMAN_SRC_PATH}\" = \"\" ]; then\n    ASEMAN_SRC_PATH=\"`echo $0 | grep ^/`\"\n    if [ \"$ASEMAN_SRC_PATH\" = \"\" ]; then\n\tASEMAN_SRC_PATH=\"$PWD\"/\"$0\"\n    fi\n    cd `dirname $ASEMAN_SRC_PATH`\n    ASEMAN_SRC_PATH=$PWD\n    cd -\nfi\n\ncd $ASEMAN_SRC_PATH\nOUTPUT=\"`find -name '*.h' -type f` `find -name '*.cpp' -type f` `find -name '*.ui' -type f` `find -name '*.qrc' -type f` `find -name '*.pro' -type f` `find -name '*.pri' -type f` `find -name '*.qml' -type f` `find -name '*.py' -type f` `find -name '*.java' -type f` `find -name '*.js' -type f` `find -name '*.html' -type f` `find -name '*xml' -type f` `find -name '*.ts' -type f` \"\n\nwc -mwl $OUTPUT\necho \"  in the \"`echo $OUTPUT | wc -w`\" Files\"\n"
  },
  {
    "path": "aseman.pri",
    "content": "DEFINES += QASEMAN_STATIC\r\ninclude (src/src.pri)\r\n"
  },
  {
    "path": "aseman.pro",
    "content": "load(qt_parts)\r\nsystem($$[QT_INSTALL_BINS]/syncqt.pl -version 3.1.5 -outdir $$OUT_PWD)\r\n"
  },
  {
    "path": "debian/.directory",
    "content": "[Dolphin]\nGroupedSorting=true\nSortRole=type\nTimestamp=2020,4,18,0,53,2\nVersion=4\nViewMode=1\n"
  },
  {
    "path": "debian/changelog",
    "content": "qtaseman (3.1.5-1aseman-focal) focal; urgency=medium\n\n  * Add error callback to queryAsync.\n  * Add statusBarStyle on iOS\n\n -- Aseman IO <contact@aseman.io>  Sun, 06 Sep 2020 13:40:00 +0330\n\n\nqtaseman (3.1.4-1aseman-focal) focal; urgency=medium\n\n  * Add queryAsync to SqlObject which run sql queries in async mode.\n\n -- Aseman IO <contact@aseman.io>  Sat, 06 Jun 2020 13:40:00 +0330\n\n\nqtaseman (3.1.3-1aseman-focal) focal; urgency=medium\n\n  * Add keys and values properties to HashObject and MapObject\n  * Add compact support to Tools.variantToJson function\n  * Transparent background for none viewport type\n  * ViewportType.sourceObject property which is not used on any types currently\n  * Improve Viewport's ContextMenu on Android\n  * Add Viewport's float type which is ios-popup on ios and android-activity on android\n  * Some improvement and bugfixes\n\n -- Aseman IO <contact@aseman.io>  Fri, 29 May 2020 00:30:00 +0330\n\n\nqtaseman (3.1.2-1aseman-focal) focal; urgency=medium\n\n  * Network multipart requests bugfix\n  * Add close support for items placed on the middle of the Viewport's\n  * Add ViewportControllers initial properties to `property variant properies`\n  * Add ViewportType.transformOrigin. It currently used on the Viewport's menu type\n  * Checkboxes wrong colors bugfix\n  * Add js values support for NetworkRequestObjects\n  * Add DelayPropertySwitch component\n\n -- Aseman IO <contact@aseman.io>  Thu, 21 May 2020 04:27:00 +0330\n\n\nqtaseman (3.1.1-1aseman-focal) focal; urgency=medium\n\n  * Update Wizards\n  * Change insert query to replace on SQL module\n  * Many bugfix and Improvements on Viewports\n\n -- Aseman IO <contact@aseman.io>  Tue, 12 May 2020 23:27:00 +0330\n\n\nqtaseman (3.1.0-3aseman-focal) focal; urgency=medium\n\n  * Increase ios-page gesture width\n  * Bugfix on ios-page\n  * iOS style for QtQuickControls \n  * Viewport's context menu type \n  * AsemanQml.Models module \n  * AsemanQml.Sql module \n  * Rewrite Viewport's types \n  * Add Attached property to the Viewports \n  * QtCreator wizards to create Aseman Apps easily \n\n -- Aseman IO <contact@aseman.io>  Wed, 06 May 2020 15:30:00 +0330\n\n\nqtaseman (3.00.1-2aseman-focal) focal; urgency=medium\n\n  * Increase ios-page gesture width\n  * Bugfix on ios-page\n\n -- Aseman IO <contact@aseman.io>  Sat, 18 Apr 2020 20:50:00 +0330\n\n\nqtaseman (3.00.1-1aseman-focal) focal; urgency=medium\n\n  * Bugfix on TextField and TextArea components\n\n -- Aseman IO <contact@aseman.io>  Sat, 18 Apr 2020 10:50:00 +0330\n\n\nqtaseman (3.00.0-1aseman-focal) focal; urgency=medium\n\n  * RC version of QtAseman 3.0.0\n\n -- Aseman IO <contact@aseman.io>  Sat, 18 Apr 2020 10:50:00 +0330\n"
  },
  {
    "path": "debian/compat",
    "content": "9\n"
  },
  {
    "path": "debian/control",
    "content": "Source: qtaseman\nSection: libs\nPriority: optional\nMaintainer: Aseman Team <contact@aseman.io>\nBuild-Depends:\n debhelper (>= 8.0.0),\n g++ (>= 4:4.7),\n gcc (>= 4:4.7),\n qtbase5-dev (>= 5.9.0),\n libqt5sql5-sqlite (>= 5.9.0),\n libqt5multimediaquick5 (>= 5.9.0),\n libqt5multimedia5-plugins (>= 5.9.0),\n libqt5multimedia5 (>= 5.9.0),\n qtpositioning5-dev (>= 5.9.0),\n libqt5sensors5-dev (>= 5.9.0),\n qtchooser,\n qt5keychain-dev,\n qt5-qmake,\n qt5-default,\n libqt5qml5 (>= 5.9.0),\n libqt5qml-graphicaleffects (>= 5.9.0) | qml-module-qtgraphicaleffects,\n qtdeclarative5-controls-plugin (>= 5.9.0) | qml-module-qtquick-controls,\n qtdeclarative5-dev (>= 5.9.0),\n libqt5quick5 (>= 5.9.0),\n qtmultimedia5-dev (>= 5.9.0),\n libqt5webkit5-dev (>= 5.1.0)\nStandards-Version: 3.9.5\nHomepage: https://github.com/Aseman-Land/QtAseman\nVcs-Git: https://github.com/Aseman-Land/QtAseman\n\nPackage: libqt5asemancore\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends}\nDescription: QtCore Aseman tools, \n It's free and released under the GPLv3 license.\n\nPackage: libqt5asemancore-dev\nSection: libdevel\nArchitecture: any\nDepends: libqt5asemancore (= ${binary:Version})\nDescription: QtCore Aseman tools development files, \n It's free and released under the GPLv3 license.\n\nPackage: libqt5asemangui\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends}\nDescription: QtGui Aseman tools, \n It's free and released under the GPLv3 license.\n\nPackage: libqt5asemangui-dev\nSection: libdevel\nArchitecture: any\nDepends: libqt5asemangui (= ${binary:Version})\nDescription: QtGui Aseman tools development files, \n It's free and released under the GPLv3 license.\n\nPackage: libqt5asemanwidgets\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends}\nDescription: QtWidgets Aseman tools, \n It's free and released under the GPLv3 license.\n\nPackage: libqt5asemanwidgets-dev\nSection: libdevel\nArchitecture: any\nDepends: libqt5asemanwidgets (= ${binary:Version})\nDescription: QtWidgets Aseman tools development files, \n It's free and released under the GPLv3 license.\n\nPackage: libqt5asemannetwork\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends}\nDescription: QtNetwork Aseman tools, \n It's free and released under the GPLv3 license.\n\nPackage: libqt5asemannetwork-dev\nSection: libdevel\nArchitecture: any\nDepends: libqt5asemannetwork (= ${binary:Version})\nDescription: QtNetwork Aseman tools development files, \n It's free and released under the GPLv3 license.\n\nPackage: libqt5asemansql\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends}\nDescription: QtSql Aseman tools, \n It's free and released under the GPLv3 license.\n\nPackage: libqt5asemansql-dev\nSection: libdevel\nArchitecture: any\nDepends: libqt5asemansql (= ${binary:Version})\nDescription: QtSql Aseman tools development files, \n It's free and released under the GPLv3 license.\n\nPackage: libqt5asemangeo\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends}\nDescription: QtGeo Aseman tools, \n It's free and released under the GPLv3 license.\n\nPackage: libqt5asemangeo-dev\nSection: libdevel\nArchitecture: any\nDepends: libqt5asemangeo (= ${binary:Version})\nDescription: QtGeo Aseman tools development files, \n It's free and released under the GPLv3 license.\n\nPackage: libqt5asemanmultimedia\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends}\nDescription: QtMultimedia Aseman tools, \n It's free and released under the GPLv3 license.\n\nPackage: libqt5asemanmultimedia-dev\nSection: libdevel\nArchitecture: any\nDepends: libqt5asemanmultimedia (= ${binary:Version})\nDescription: QtMultimedia Aseman tools development files, \n It's free and released under the GPLv3 license.\n\nPackage: libqt5asemanqml\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends}\nDescription: QtQml Aseman tools, \n It's free and released under the GPLv3 license.\n\nPackage: libqt5asemanqml-dev\nSection: libdevel\nArchitecture: any\nDepends: libqt5asemanqml (= ${binary:Version})\nDescription: QtQml Aseman tools,  development files, \n It's free and released under the GPLv3 license.\n\nPackage: qml-module-asemanbase\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends}, \n libqt5qml-graphicaleffects (>= 5.9.0) | qml-module-qtgraphicaleffects,\n qtdeclarative5-controls-plugin (>= 5.9.0) | qml-module-qtquick-controls\nDescription: QtQml Aseman Base components for the Qml, \n It's free and released under the GPLv3 license.\n\nPackage: qml-module-asemanwidgets\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends},\n qml-module-asemanbase\nDescription: QtQml Aseman Widgets components for the Qml, \n It's free and released under the GPLv3 license.\n\nPackage: qml-module-asemannetwork\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends}\nDescription: QtQml Aseman Network components for the Qml, \n It's free and released under the GPLv3 license.\n\nPackage: qml-module-asemansql\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends}\nDescription: QtQml Aseman Sql components for the Qml, \n It's free and released under the GPLv3 license.\n\nPackage: qml-module-asemanmultimedia\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends},\n qml-module-asemanbase\nDescription: QtQml Aseman Multimedia components for the Qml, \n It's free and released under the GPLv3 license.\n\nPackage: qml-module-asemanviewport\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends},\n qml-module-asemanbase\nDescription: QtQml Aseman Viewport components for the Qml, \n It's free and released under the GPLv3 license.\n\nPackage: qml-module-asemanmodern\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends},\n qml-module-asemanbase\nDescription: QtQml Aseman Modern components for the Qml, \n It's free and released under the GPLv3 license.\n\nPackage: qml-module-asemancontrols\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends},\n qml-module-asemanbase\nDescription: QtQml Aseman Controls components for the Qml, \n It's free and released under the GPLv3 license.\n\nPackage: qml-module-asemanmodels\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends},\n qml-module-asemanbase\nDescription: QtQml Aseman Models components for the Qml, \n It's free and released under the GPLv3 license.\n\nPackage: qml-module-asemanawesome\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends},\n qml-module-asemanbase\nDescription: QtQml Aseman Font Awesome components for the Qml, \n It's free and released under the GPLv3 license.\n\nPackage: qml-module-asemanmaterial\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends},\n qml-module-asemanbase\nDescription: QtQml Material font icons components for the Qml, \n It's free and released under the GPLv3 license.\n\nPackage: qt5aseman\nSection: libs\nArchitecture: any\nDepends: libqt5asemancore (= ${binary:Version}),\n libqt5asemangui (= ${binary:Version}),\n libqt5asemanwidgets (= ${binary:Version}),\n libqt5asemannetwork (= ${binary:Version}),\n libqt5asemansql (= ${binary:Version}),\n libqt5asemangeo (= ${binary:Version}),\n libqt5asemanmultimedia (= ${binary:Version}),\n libqt5asemanqml (= ${binary:Version}),\n qml-module-asemanbase, qml-module-asemanwidgets,\n qml-module-asemanmultimedia, qml-module-asemanawesome,\n qml-module-asemanmaterial, qml-module-asemanmodern,\n qml-module-asemancontrols, qml-module-asemanviewport,\n qml-module-asemannetwork, qml-module-asemanmodels,\n qml-module-asemansql\nDescription: Qt Aseman full package, \n It's free and released under the GPLv3 license.\n\nPackage: qt5aseman-dev\nSection: libdevel\nArchitecture: any\nDepends: libqt5asemancore-dev (= ${binary:Version}),\n libqt5asemangui-dev (= ${binary:Version}),\n libqt5asemanwidgets-dev (= ${binary:Version}),\n libqt5asemannetwork-dev (= ${binary:Version}),\n libqt5asemansql-dev (= ${binary:Version}),\n libqt5asemangeo-dev (= ${binary:Version}),\n libqt5asemanmultimedia-dev (= ${binary:Version}),\n libqt5asemanqml-dev (= ${binary:Version}),\n qt5aseman (= ${binary:Version}),\n qt5aseman-wizards-qtcreator (= ${binary:Version})\nDescription: Qt Aseman full development package, \n It's free and released under the GPLv3 license.\n\nPackage: qt5aseman-wizards-qtcreator\nSection: libdevel\nArchitecture: any\nDepends: qt5aseman (= ${binary:Version})\nDescription: Qt Aseman qtcreator wizards, \n It's free and released under the GPLv3 license.\n"
  },
  {
    "path": "debian/copyright",
    "content": "Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/\nUpstream-Name: telegramqml\nSource: aseman.co/telegramqml\n\nFiles: *\nCopyright: 2015 Aseman Team\nLicense: GPL-3.0+\n\nFiles: debian/*\nCopyright: 2015 Aseman Team <contact@aseman.co>\nLicense: GPL-3.0+\n\nLicense: GPL-3.0+\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n .\n This package is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n .\n You should have received a copy of the GNU General Public License\n along with this program. If not, see <http://www.gnu.org/licenses/>.\n .\n On Debian systems, the complete text of the GNU General\n Public License version 3 can be found in \"/usr/share/common-licenses/GPL-3\".\n\n# Please also look if there are files or directories which have a\n# different copyright/license attached and list them here.\n# Please avoid to pick license terms that are more restrictive than the\n# packaged work, as it may make Debian's contributions unacceptable upstream.\n"
  },
  {
    "path": "debian/files",
    "content": "qtaseman_3.1.5-1aseman-focal_source.buildinfo libs optional\n"
  },
  {
    "path": "debian/libqt5asemancore-dev.dirs",
    "content": "usr/include\n"
  },
  {
    "path": "debian/libqt5asemancore-dev.install",
    "content": "usr/include/*-linux-gnu/qt5/QAsemanCore/*\n"
  },
  {
    "path": "debian/libqt5asemancore.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/libqt5asemancore.install",
    "content": "usr/lib/*-linux-gnu/libQAsemanCore*\nusr/lib/*-linux-gnu/cmake/Qt5QAsemanCore/*\nusr/lib/*-linux-gnu/pkgconfig/QAsemanCore.pc\nusr/lib/*-linux-gnu/qt5/mkspecs/modules/qt_lib_asemancore*\n"
  },
  {
    "path": "debian/libqt5asemangeo-dev.dirs",
    "content": "usr/include\n"
  },
  {
    "path": "debian/libqt5asemangeo-dev.install",
    "content": "usr/include/*-linux-gnu/qt5/QAsemanGeo/*\n"
  },
  {
    "path": "debian/libqt5asemangeo.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/libqt5asemangeo.install",
    "content": "usr/lib/*-linux-gnu/libQAsemanGeo*\nusr/lib/*-linux-gnu/cmake/Qt5QAsemanGeo/*\nusr/lib/*-linux-gnu/pkgconfig/QAsemanGeo.pc\nusr/lib/*-linux-gnu/qt5/mkspecs/modules/qt_lib_asemangeo*\n"
  },
  {
    "path": "debian/libqt5asemangui-dev.dirs",
    "content": "usr/include\n"
  },
  {
    "path": "debian/libqt5asemangui-dev.install",
    "content": "usr/include/*-linux-gnu/qt5/QAsemanGui/*\n"
  },
  {
    "path": "debian/libqt5asemangui.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/libqt5asemangui.install",
    "content": "usr/lib/*-linux-gnu/libQAsemanGui*\nusr/lib/*-linux-gnu/cmake/Qt5QAsemanGui/*\nusr/lib/*-linux-gnu/pkgconfig/QAsemanGui.pc\nusr/lib/*-linux-gnu/qt5/mkspecs/modules/qt_lib_asemangui*\n"
  },
  {
    "path": "debian/libqt5asemanmultimedia-dev.dirs",
    "content": "usr/include\n"
  },
  {
    "path": "debian/libqt5asemanmultimedia-dev.install",
    "content": "usr/include/*-linux-gnu/qt5/QAsemanMultimedia/*\n"
  },
  {
    "path": "debian/libqt5asemanmultimedia.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/libqt5asemanmultimedia.install",
    "content": "usr/lib/*-linux-gnu/libQAsemanMultimedia*\nusr/lib/*-linux-gnu/cmake/Qt5QAsemanMultimedia/*\nusr/lib/*-linux-gnu/pkgconfig/QAsemanMultimedia.pc\nusr/lib/*-linux-gnu/qt5/mkspecs/modules/qt_lib_asemanmultimedia*\n"
  },
  {
    "path": "debian/libqt5asemannetwork-dev.dirs",
    "content": "usr/include\n"
  },
  {
    "path": "debian/libqt5asemannetwork-dev.install",
    "content": "usr/include/*-linux-gnu/qt5/QAsemanNetwork/*\n"
  },
  {
    "path": "debian/libqt5asemannetwork.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/libqt5asemannetwork.install",
    "content": "usr/lib/*-linux-gnu/libQAsemanNetwork*\nusr/lib/*-linux-gnu/cmake/Qt5QAsemanNetwork/*\nusr/lib/*-linux-gnu/pkgconfig/QAsemanNetwork.pc\nusr/lib/*-linux-gnu/qt5/mkspecs/modules/qt_lib_asemannetwork*\n"
  },
  {
    "path": "debian/libqt5asemanqml-dev.dirs",
    "content": "usr/include\n"
  },
  {
    "path": "debian/libqt5asemanqml-dev.install",
    "content": "usr/include/*-linux-gnu/qt5/QAsemanQml/*\n"
  },
  {
    "path": "debian/libqt5asemanqml.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/libqt5asemanqml.install",
    "content": "usr/lib/*-linux-gnu/libQAsemanQml*\nusr/lib/*-linux-gnu/cmake/Qt5QAsemanQml/*\nusr/lib/*-linux-gnu/pkgconfig/QAsemanQml.pc\nusr/lib/*-linux-gnu/qt5/mkspecs/modules/qt_lib_asemanqml*\n"
  },
  {
    "path": "debian/libqt5asemansql-dev.dirs",
    "content": "usr/include\n"
  },
  {
    "path": "debian/libqt5asemansql-dev.install",
    "content": "usr/include/*-linux-gnu/qt5/QAsemanSql/*\n"
  },
  {
    "path": "debian/libqt5asemansql.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/libqt5asemansql.install",
    "content": "usr/lib/*-linux-gnu/libQAsemanSql*\nusr/lib/*-linux-gnu/cmake/Qt5QAsemanSql/*\nusr/lib/*-linux-gnu/pkgconfig/QAsemanSql.pc\nusr/lib/*-linux-gnu/qt5/mkspecs/modules/qt_lib_asemansql*\n"
  },
  {
    "path": "debian/libqt5asemanwidgets-dev.dirs",
    "content": "usr/include\n"
  },
  {
    "path": "debian/libqt5asemanwidgets-dev.install",
    "content": "usr/include/*-linux-gnu/qt5/QAsemanWidgets/*\n"
  },
  {
    "path": "debian/libqt5asemanwidgets.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/libqt5asemanwidgets.install",
    "content": "usr/lib/*-linux-gnu/libQAsemanWidgets*\nusr/lib/*-linux-gnu/cmake/Qt5QAsemanWidgets/*\nusr/lib/*-linux-gnu/pkgconfig/QAsemanWidgets.pc\nusr/lib/*-linux-gnu/qt5/mkspecs/modules/qt_lib_asemanwidgets*\n"
  },
  {
    "path": "debian/qml-module-asemanawesome.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/qml-module-asemanawesome.install",
    "content": "usr/lib/*-linux-gnu/qt5/qml/AsemanQml/Awesome/*\n"
  },
  {
    "path": "debian/qml-module-asemanbase.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/qml-module-asemanbase.install",
    "content": "usr/lib/*-linux-gnu/qt5/qml/AsemanQml/Base/*\n"
  },
  {
    "path": "debian/qml-module-asemancontrols.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/qml-module-asemancontrols.install",
    "content": "usr/lib/*-linux-gnu/qt5/qml/AsemanQml/Controls/*\n"
  },
  {
    "path": "debian/qml-module-asemanmaterial.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/qml-module-asemanmaterial.install",
    "content": "usr/lib/*-linux-gnu/qt5/qml/AsemanQml/MaterialIcons/*\n"
  },
  {
    "path": "debian/qml-module-asemanmodels.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/qml-module-asemanmodels.install",
    "content": "usr/lib/*-linux-gnu/qt5/qml/AsemanQml/Models/*\n"
  },
  {
    "path": "debian/qml-module-asemanmodern.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/qml-module-asemanmodern.install",
    "content": "usr/lib/*-linux-gnu/qt5/qml/AsemanQml/Modern/*\n"
  },
  {
    "path": "debian/qml-module-asemanmultimedia.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/qml-module-asemanmultimedia.install",
    "content": "usr/lib/*-linux-gnu/qt5/qml/AsemanQml/Multimedia/*\n"
  },
  {
    "path": "debian/qml-module-asemannetwork.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/qml-module-asemannetwork.install",
    "content": "usr/lib/*-linux-gnu/qt5/qml/AsemanQml/Network/*\n"
  },
  {
    "path": "debian/qml-module-asemansql.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/qml-module-asemansql.install",
    "content": "usr/lib/*-linux-gnu/qt5/qml/AsemanQml/Sql/*\n"
  },
  {
    "path": "debian/qml-module-asemanviewport.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/qml-module-asemanviewport.install",
    "content": "usr/lib/*-linux-gnu/qt5/qml/AsemanQml/Viewport/*\n"
  },
  {
    "path": "debian/qml-module-asemanwidgets.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "debian/qml-module-asemanwidgets.install",
    "content": "usr/lib/*-linux-gnu/qt5/qml/AsemanQml/Widgets/*\n"
  },
  {
    "path": "debian/qt5aseman-wizards-qtcreator.dirs",
    "content": "usr/share\n"
  },
  {
    "path": "debian/qt5aseman-wizards-qtcreator.install",
    "content": "usr/share/qtcreator/templates/wizards/projects/qtasemanapplication/*\n"
  },
  {
    "path": "debian/rules",
    "content": "#!/usr/bin/make -f\n# -*- makefile -*-\n\n# Uncomment this to turn on verbose mode.\n#export DH_VERBOSE=1\n\n%:\n\tdh $@ \n\noverride_dh_auto_configure:\n\tdh_auto_configure -- \n\noverride_dh_install:\n\tdh_install\n\noverride_dh_clean:\n\tdh_clean\n"
  },
  {
    "path": "debian/source/format",
    "content": "3.0 (native)\n"
  },
  {
    "path": "demos/RegularApp/.gitignore",
    "content": "# This file is used to ignore files which are generated\n# ----------------------------------------------------------------------------\n\n*~\n*.autosave\n*.a\n*.core\n*.moc\n*.o\n*.obj\n*.orig\n*.rej\n*.so\n*.so.*\n*_pch.h.cpp\n*_resource.rc\n*.qm\n.#*\n*.*#\ncore\n!core/\ntags\n.DS_Store\n.directory\n*.debug\nMakefile*\n*.prl\n*.app\nmoc_*.cpp\nui_*.h\nqrc_*.cpp\nThumbs.db\n*.res\n*.rc\n/.qmake.cache\n/.qmake.stash\n\n# qtcreator generated files\n*.pro.user*\n\n# xemacs temporary files\n*.flc\n\n# Vim temporary files\n.*.swp\n\n# Visual Studio generated files\n*.ib_pdb_index\n*.idb\n*.ilk\n*.pdb\n*.sln\n*.suo\n*.vcproj\n*vcproj.*.*.user\n*.ncb\n*.sdf\n*.opensdf\n*.vcxproj\n*vcxproj.*\n\n# MinGW generated files\n*.Debug\n*.Release\n\n# Python byte code\n*.pyc\n\n# Binaries\n# --------\n*.dll\n*.exe\n\n"
  },
  {
    "path": "demos/RegularApp/AppWindow.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.7\nimport QtQuick.Window 2.2\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Viewport 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls 2.3\nimport QtQuick.Controls.Material 2.0\nimport QtQuick.Dialogs 1.2\nimport \"graphical\"\nimport \"nongraphical\"\nimport \"static\"\nimport \"models\"\nimport \"global\"\n\nAsemanWindow {\n    id: mainWin\n    width: 480\n    height: 720\n    title: qsTr(\"Hello World\")\n    visible: true\n    backController: true\n\n    Material.accent: Material.LightBlue\n    Material.theme: Material.Light\n\n    property bool mirror\n\n    LayoutMirroring.enabled: mirror\n    LayoutMirroring.childrenInherit: true\n\n    Rectangle {\n        anchors.fill: parent\n        color: \"#000000\"\n    }\n\n    Viewport {\n        id: viewport\n        anchors.fill: parent\n\n        mainItem: Rectangle {\n            anchors.fill: parent\n\n            AsemanFlickable {\n                id: flick\n                width: parent.width\n                anchors.top: header.bottom\n                anchors.bottom: parent.bottom\n                contentWidth: column.width\n                contentHeight: column.height\n\n                Column {\n                    id: column\n                    width: flick.width\n\n                    MainMenuItem {\n                        text: \"Right To Left\"\n                        onClicked: layoutSwitch.checked = !layoutSwitch.checked\n                        Switch {\n                            id: layoutSwitch\n                            anchors.verticalCenter: parent.verticalCenter\n                            anchors.right: parent.right\n                            onCheckedChanged: mirror = checked\n                        }\n                    }\n                    MainMenuItem {\n                        text: \"Graphical Components\"\n                        onClicked: viewport.append(graphicalComponents, {}, \"stack\")\n                    }\n                    MainMenuItem {\n                        text: \"Model Components\"\n                        onClicked: viewport.append(modelComponents, {}, \"ios-bottomdrawer\")\n                    }\n                    MainMenuItem {\n                        text: \"Non-Graphical Components\"\n                        onClicked: viewport.append(nonGraphicalComponents, {}, \"popup\")\n                    }\n                    MainMenuItem {\n                        text: \"Static Components\"\n                        onClicked: viewport.append(staticComponents, {}, \"activity\")\n                    }\n                }\n            }\n\n            RoundButton {\n                anchors.left: parent.left\n                anchors.right: parent.right\n                anchors.bottom: parent.bottom\n                anchors.margins: 10 * Devices.density\n                highlighted: true\n                text: qsTr(\"Github\")\n                onClicked: Qt.openUrlExternally(\"https://github.com/Aseman-Land/aseman-qt-tools\")\n            }\n\n            HScrollBar {\n                anchors.right: flick.right\n                anchors.top: flick.top\n                height: flick.height\n                width: 6*Devices.density\n                color: \"#18f\"\n                scrollArea: flick\n            }\n\n            Header {\n                id: header\n                width: parent.width\n                color: \"#18f\"\n                text: qsTr(\"SlidePageManager\")\n                shadow: true\n            }\n        }\n    }\n\n    Component {\n        id: staticComponents\n        StaticComponentsExample {\n            anchors.fill: parent\n            onAppendRequest: viewport.append(component, {}, \"stack\")\n        }\n    }\n\n    Component {\n        id: graphicalComponents\n        GraphicalComponentsExample {\n            anchors.fill: parent\n            onAppendRequest: viewport.append(component, {}, \"popup\")\n        }\n    }\n\n    Component {\n        id: modelComponents\n        ModelComponentExamples {\n            width: Viewport.viewport.width\n            height: Viewport.viewport.height * 0.6\n            onAppendRequest: viewport.append(component, {}, \"popup\")\n        }\n    }\n\n    Component {\n        id: nonGraphicalComponents\n        NonGraphicalComponentsExample {\n            anchors.fill: parent\n            onAppendRequest: viewport.append(component, {}, \"activity\")\n        }\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/RegularApp.pro",
    "content": "QT += quick network\nandroid: QT += androidextras\nCONFIG += c++11\n\nSOURCES += main.cpp \nRESOURCES += qml.qrc\n\nANDROID_PACKAGE_SOURCE_DIR = $$PWD/android\n"
  },
  {
    "path": "demos/RegularApp/android/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\"?>\n<manifest package=\"co.aseman.demo.regular\" xmlns:android=\"http://schemas.android.com/apk/res/android\" android:versionName=\"1.0\" android:versionCode=\"1\" android:installLocation=\"auto\">\n<application android:hardwareAccelerated=\"true\" android:name=\"land.aseman.android.AsemanApplication\" android:icon=\"@mipmap/ic_launcher\" android:label=\"RegularApp\">\n        <activity android:configChanges=\"orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation\" android:name=\"land.aseman.android.AsemanActivity\" android:label=\"RegularApp\" android:screenOrientation=\"unspecified\" android:theme=\"@style/splashScreenTheme\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n\n            <!-- Application arguments -->\n            <!-- meta-data android:name=\"android.app.arguments\" android:value=\"arg1 arg2 arg3\"/ -->\n            <!-- Application arguments -->\n\n            <meta-data android:name=\"android.app.lib_name\" android:value=\"-- %%INSERT_APP_LIB_NAME%% --\"/>\n            <meta-data android:name=\"android.app.qt_sources_resource_id\" android:resource=\"@array/qt_sources\"/>\n            <meta-data android:name=\"android.app.repository\" android:value=\"default\"/>\n            <meta-data android:name=\"android.app.qt_libs_resource_id\" android:resource=\"@array/qt_libs\"/>\n            <meta-data android:name=\"android.app.bundled_libs_resource_id\" android:resource=\"@array/bundled_libs\"/>\n            <!-- Deploy Qt libs as part of package -->\n            <meta-data android:name=\"android.app.bundle_local_qt_libs\" android:value=\"-- %%BUNDLE_LOCAL_QT_LIBS%% --\"/>\n            <meta-data android:name=\"android.app.bundled_in_lib_resource_id\" android:resource=\"@array/bundled_in_lib\"/>\n            <meta-data android:name=\"android.app.bundled_in_assets_resource_id\" android:resource=\"@array/bundled_in_assets\"/>\n            <!-- Run with local libs -->\n            <meta-data android:name=\"android.app.use_local_qt_libs\" android:value=\"-- %%USE_LOCAL_QT_LIBS%% --\"/>\n            <meta-data android:name=\"android.app.libs_prefix\" android:value=\"/data/local/tmp/qt/\"/>\n            <meta-data android:name=\"android.app.load_local_libs\" android:value=\"-- %%INSERT_LOCAL_LIBS%% --\"/>\n            <meta-data android:name=\"android.app.load_local_jars\" android:value=\"-- %%INSERT_LOCAL_JARS%% --\"/>\n            <meta-data android:name=\"android.app.static_init_classes\" android:value=\"-- %%INSERT_INIT_CLASSES%% --\"/>\n            <!--  Messages maps -->\n            <meta-data android:value=\"@string/ministro_not_found_msg\" android:name=\"android.app.ministro_not_found_msg\"/>\n            <meta-data android:value=\"@string/ministro_needed_msg\" android:name=\"android.app.ministro_needed_msg\"/>\n            <meta-data android:value=\"@string/fatal_error_msg\" android:name=\"android.app.fatal_error_msg\"/>\n            <!--  Messages maps -->\n\n            <!-- Splash screen -->\n            <!-- meta-data android:name=\"android.app.splash_screen_drawable\" android:resource=\"@drawable/logo\"/ -->\n            <!-- meta-data android:name=\"android.app.splash_screen_sticky\" android:value=\"true\"/ -->\n            <!-- Splash screen -->\n\n            <!-- Background running -->\n            <!-- Warning: changing this value to true may cause unexpected crashes if the\n                          application still try to draw after\n                          \"applicationStateChanged(Qt::ApplicationSuspended)\"\n                          signal is sent! -->\n            <meta-data android:name=\"android.app.background_running\" android:value=\"false\"/>\n            <!-- Background running -->\n\n            <!-- auto screen scale factor -->\n            <meta-data android:name=\"android.app.auto_screen_scale_factor\" android:value=\"false\"/>\n            <!-- auto screen scale factor -->\n\n            <!-- extract android style -->\n            <!-- available android:values :\n                * full - useful QWidget & Quick Controls 1 apps\n                * minimal - useful for Quick Controls 2 apps, it is much faster than \"full\"\n                * none - useful for apps that don't use any of the above Qt modules\n                -->\n            <meta-data android:name=\"android.app.extract_android_style\" android:value=\"minimal\"/>\n            <!-- extract android style -->\n    </activity>\n\n    <!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices -->\n\n    </application>\n\n    <uses-sdk android:minSdkVersion=\"16\" android:targetSdkVersion=\"18\"/>\n    <supports-screens android:largeScreens=\"true\" android:normalScreens=\"true\" android:anyDensity=\"true\" android:smallScreens=\"true\"/>\n\n    <!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.\n         Remove the comment if you do not require these default permissions. -->\n    <!-- %%INSERT_PERMISSIONS -->\n\n    <!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.\n         Remove the comment if you do not require these default features. -->\n    <!-- %%INSERT_FEATURES -->\n\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>\n\n</manifest>\n"
  },
  {
    "path": "demos/RegularApp/android/res/drawable/splash.xml",
    "content": "<bitmap xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:src=\"@drawable/splash_image\"\n        android:gravity=\"center\"\n        tools:ignore=\"ResourceCycle\"/>"
  },
  {
    "path": "demos/RegularApp/android/res/values/style.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"splashScreenTheme\" parent=\"@android:style/Theme.DeviceDefault.Light.NoActionBar\">\n        <item name=\"android:windowBackground\">@drawable/splash</item>\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:adjustViewBounds\">true</item>\n        <item name=\"android:scaleType\">centerCrop</item>\n    </style>\n\n<!--    \n    <style name=\"AppTheme\" parent=\"@android:style/Theme.Material\">\n        <item name=\"android:colorPrimary\">#efefef</item>\n        <item name=\"android:colorPrimaryDark\">#333333</item>\n        <item name=\"android:colorAccent\">#F44336</item> \n    </style>\n-->\n</resources>\n"
  },
  {
    "path": "demos/RegularApp/global/MainMenuItem.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport QtQuick.Controls 2.3\n\nItemDelegate {\n    id: item\n    width: parent.width\n    height: 60*Devices.density\n\n    Rectangle {\n        width: parent.width\n        anchors.bottom: parent.bottom\n        height: 1\n        color: \"#eee\"\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/global/MainPage.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.7\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.0\nimport AsemanQml.Base 2.0\n\nItem {\n    clip: true\n\n    SwipeView {\n        id: swipeView\n        width: parent.width\n        anchors.top: tabBar.bottom\n        anchors.bottom: parent.bottom\n        onCurrentIndexChanged: {\n            BackHandler.removeHandler(swipeView)\n            if(currentIndex > 0)\n                BackHandler.pushHandler(swipeView, function(){currentIndex = 0})\n        }\n\n        QmlControls {}\n        Item {}\n    }\n\n    TabBar {\n        id: tabBar\n        width: parent.width\n        currentIndex: swipeView.currentIndex\n        onCurrentIndexChanged: swipeView.currentIndex = currentIndex\n\n        TabButton { text: qsTr(\"Home\") }\n        TabButton { text: qsTr(\"Page\") }\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/global/QmlControls.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.7\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.0\n\nItem {\n\n    ColumnLayout {\n        anchors.centerIn: parent\n\n        Switch {\n            text: qsTr(\"Switch\")\n        }\n\n        SpinBox {\n        }\n\n        Slider {\n            value: 0.5\n        }\n\n        CheckBox {\n            text: qsTr(\"Check Box\")\n        }\n\n        RowLayout {\n            anchors.horizontalCenter: parent.horizontalCenter\n\n            Button {\n                text: qsTr(\"Press Me 1\")\n            }\n\n            Button {\n                text: qsTr(\"Press Me 2\")\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/graphical/GraphicalComponentsExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\nimport \"../global\"\n\nRectangle {\n    id: gcItem\n    color: masterPalette.window\n\n    signal appendRequest(variant component)\n\n    AsemanFlickable {\n        id: flick\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n        contentWidth: column.width\n        contentHeight: column.height\n\n        Column {\n            id: column\n            width: flick.width\n\n            MainMenuItem {\n                text: \"Side Menu\"\n                onClicked: appendRequest(sideMenu_component)\n            }\n            MainMenuItem {\n                text: \"Show Popup\"\n                onClicked: msgDialog.visible = true\n            }\n        }\n    }\n\n    HScrollBar {\n        anchors.right: flick.right\n        anchors.top: flick.top\n        height: flick.height\n        width: 6*Devices.density\n        color: \"#18f\"\n        scrollArea: flick\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"Graphical Components\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"#ffffff\"\n        onClicked: BackHandler.back()\n    }\n\n    Popup {\n        id: msgDialog\n        x: (gcItem.width - width) / 2\n        y: (gcItem.height - height) / 2\n        width: Math.min(gcItem.width, gcItem.height) / 3 * 2\n        height: settingsColumn.implicitHeight + topPadding + bottomPadding\n        modal: true\n        focus: true\n\n        contentItem: ColumnLayout {\n            id: settingsColumn\n            spacing: 20\n            z: 100\n\n            Label {\n                text: \"Message\"\n                font.bold: true\n            }\n\n            Label {\n                text: \"It's just a test message :)\"\n            }\n\n            RowLayout {\n                spacing: 10\n\n                Button {\n                    id: okButton\n                    text: \"Ok\"\n                    onClicked: msgDialog.close()\n\n                    Material.foreground: Material.LightBlue\n                    Material.background: \"transparent\"\n                    Material.elevation: 0\n\n                    Layout.preferredWidth: 0\n                    Layout.fillWidth: true\n                }\n            }\n        }\n    }\n\n    Component {\n        id: sideMenu_component\n        SideMenuExample {\n            anchors.fill: parent\n        }\n    }\n\n    Component {\n        id: qmlcontrols_component\n        Rectangle {\n            height: gcItem.height/2\n            width: gcItem.width\n            NullMouseArea { anchors.fill: parent }\n            QmlControls { anchors.fill: parent }\n        }\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/graphical/SideMenuExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport \"../global\"\n\nRectangle {\n    color: masterPalette.window\n\n    MainPage {\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"SideMenu\")\n        shadow: true\n    }\n\n    Drawer {\n        id: sidebar\n        anchors.fill: parent\n        delegate: MouseArea {\n            anchors.fill: parent\n\n            Rectangle {\n                anchors.fill: parent\n                color: \"#f0f0f0\"\n            }\n        }\n    }\n\n    HeaderMenuButton {\n        ratio: sidebar.percent\n        buttonColor: Qt.rgba(1-ratio, 1-ratio, 1-ratio, 1)\n        onClicked: {\n            if(sidebar.showed)\n                sidebar.discard()\n            else\n                sidebar.show()\n        }\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/main.cpp",
    "content": "#include <QGuiApplication>\n#include <QQmlApplicationEngine>\n\nint main(int argc, char *argv[])\n{\n    QGuiApplication app(argc, argv);\n\n    QQmlApplicationEngine engine;\n    engine.load(QUrl(QStringLiteral(\"qrc:/main.qml\")));\n    if (engine.rootObjects().isEmpty())\n        return -1;\n\n    return app.exec();\n}\n"
  },
  {
    "path": "demos/RegularApp/main.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.7\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\n\nAsemanApplication {\n    id: app\n    applicationName: \"Regular App\"\n    applicationAbout: \"It's an regular app\"\n    applicationDisplayName: \"Regular App\"\n    applicationVersion: \"1.0.0\"\n    applicationId: \"5371c896-7f09-4013-a657-e6338fae82b0\"\n    organizationDomain: \"io.aseman\"\n    organizationName: \"Aseman Team\"\n\n    AppWindow {\n        visible: true\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/models/CountriesModelExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Models 2.0\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\nimport \"../global\"\n\nRectangle {\n    color: masterPalette.window\n    clip: true\n\n    TextField {\n        id: filterBar\n        anchors.top: header.bottom\n        anchors.left: parent.left\n        anchors.right: parent.right\n        anchors.margins: 10*Devices.density\n        placeholderText: qsTr(\"Filter...\")\n    }\n\n    AsemanListView {\n        id: listv\n        width: parent.width\n        anchors.top: filterBar.bottom\n        anchors.bottom: parent.bottom\n        anchors.topMargin: 10*Devices.density\n        clip: true\n        model: CountriesModel {\n            filter: filterBar.text\n        }\n\n        delegate: MainMenuItem {\n            width: listv.width\n            text: \"%1 (+%2)\".arg(model.name).arg(model.callingCode)\n        }\n    }\n\n    HScrollBar {\n        anchors.right: listv.right\n        anchors.top: listv.top\n        height: listv.height\n        width: 6*Devices.density\n        color: \"#18f\"\n        scrollArea: listv\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"CountriesModel\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"#ffffff\"\n        onClicked: BackHandler.back()\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/models/FileSystemModelExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Models 2.0\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\nimport \"../global\"\n\nRectangle {\n    color: masterPalette.window\n    clip: true\n\n    Button {\n        id: backBtn\n        anchors.bottom: parent.bottom\n        anchors.left: parent.left\n        anchors.right: parent.right\n        anchors.margins: 10*Devices.density\n        text: qsTr(\"Parent Folder\")\n        onClicked: listv.model.folder = listv.model.parentFolder\n    }\n\n    AsemanListView {\n        id: listv\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: backBtn.top\n        anchors.topMargin: 10*Devices.density\n        clip: true\n        model: FileSystemModel {\n            folder: AsemanApp.startPath\n        }\n\n        delegate: MainMenuItem {\n            width: listv.width\n            text: model.fileName\n            onClicked: {\n                if(model.fileIsDir)\n                    listv.model.folder = model.filePath\n                else\n                    Qt.openUrlExternally(model.fileUrl)\n            }\n        }\n    }\n\n    HScrollBar {\n        anchors.right: listv.right\n        anchors.top: listv.top\n        height: listv.height\n        width: 6*Devices.density\n        color: \"#18f\"\n        scrollArea: listv\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"FileSystemModel\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"#ffffff\"\n        onClicked: BackHandler.back()\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/models/ModelComponentExamples.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Models 2.0\nimport \"../global\"\n\nItem {\n    id: scItem\n\n    signal appendRequest(variant component)\n\n    Rectangle {\n        anchors.fill: parent\n        color: masterPalette.window\n        opacity: 0.5\n    }\n\n    AsemanFlickable {\n        id: flick\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n        contentWidth: column.width\n        contentHeight: column.height\n\n        Column {\n            id: column\n            width: flick.width\n\n            MainMenuItem {\n                text: \"CountriesModel\"\n                onClicked: appendRequest(countriesModel_component)\n            }\n\n            MainMenuItem {\n                text: \"FileSystemModel\"\n                onClicked: appendRequest(fileSystemModel_component)\n            }\n        }\n    }\n\n    HScrollBar {\n        anchors.right: flick.right\n        anchors.top: flick.top\n        height: flick.height\n        width: 6*Devices.density\n        color: \"#18f\"\n        scrollArea: flick\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"transparent\"\n        text: qsTr(\"Model Components\")\n        shadow: true\n        light: false\n        shadowOpacity: 0\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"#ffffff\"\n        onClicked: BackHandler.back()\n    }\n\n    Component {\n        id: countriesModel_component\n        CountriesModelExample {\n            anchors.fill: parent\n        }\n    }\n\n    Component {\n        id: fileSystemModel_component\n        FileSystemModelExample {\n            anchors.fill: parent\n        }\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/nongraphical/DownloaderExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.7\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\n\nItem {\n\n    Downloader {\n        id: downloader\n        path: linkTxt.text\n    }\n\n    Item {\n        id: listv\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n\n        ColumnLayout {\n            anchors.left: parent.left\n            anchors.right: parent.right\n            anchors.top: parent.top\n            anchors.margins: 20*Devices.density\n\n            TextField {\n                id: linkTxt\n                placeholderText: qsTr(\"Download Link: http://...\")\n                enabled: !downloader.downloading\n                Layout.fillWidth: true\n            }\n\n            Button {\n                text: downloader.downloading? \"Stop\" : \"Download\"\n                Layout.fillWidth: true\n                Material.foreground: Material.LightBlue\n                onClicked: {\n                    if(downloader.downloading)\n                        downloader.stop()\n                    else\n                        downloader.start()\n                }\n            }\n\n            Label {\n                text: qsTr(\"Downloading to the RAM...\\nTo download to memory, use destination property.\")\n                visible: downloader.downloading\n            }\n\n            ProgressBar {\n                value: downloader.recievedBytes/downloader.totalBytes\n                visible: downloader.downloading\n                Layout.fillWidth: true\n            }\n        }\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"Downloader\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"white\"\n        onClicked: AsemanApp.back()\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/nongraphical/EncrypterExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.7\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\n\nItem {\n\n    property variant encryptedData: null\n\n    Encrypter {\n        id: encrypter\n        key: keyTxt.text\n    }\n\n    Item {\n        id: listv\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n\n        ColumnLayout {\n            anchors.left: parent.left\n            anchors.right: parent.right\n            anchors.top: parent.top\n            anchors.margins: 20*Devices.density\n\n            TextField {\n                id: keyTxt\n                placeholderText: qsTr(\"Encrypt Key\")\n                Layout.fillWidth: true\n            }\n\n            TextArea {\n                id: txt\n                Layout.fillWidth: true\n                Layout.preferredHeight: 200*Devices.density\n                enabled: encryptedData == null\n            }\n\n            Button {\n                text: encryptedData? \"Decrypt\" : \"Encrypt\"\n                Layout.fillWidth: true\n                Material.foreground: Material.LightBlue\n                onClicked: {\n                    if(encryptedData) {\n                        var data = encrypter.decrypt(encryptedData)\n                        if(data == \"\") {\n                            txt.color = \"#ff0000\"\n                            txt.text = \"No valid key\"\n                            return\n                        }\n\n                        txt.text = data\n                        txt.color = \"#000000\"\n                        encryptedData = null\n                    } else {\n                        encryptedData = encrypter.encrypt(txt.text)\n                        txt.text = encryptedData\n                    }\n                }\n            }\n        }\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"Encrypter\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"white\"\n        onClicked: AsemanApp.back()\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/nongraphical/ImageColorAnalizorExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.7\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\n\nRectangle {\n    color: analizer.color!=\"#000000\"? analizer.color : \"#ffffff\"\n\n    property variant encryptedData: null\n\n    Behavior on color {\n        ColorAnimation { easing.type: Easing.OutCubic; duration: 1000 }\n    }\n\n    ImageColorAnalizor {\n        id: analizer\n        method: algorithm.currentIndex\n    }\n\n    Connections {\n        target: Devices\n        onSelectImageResult: analizer.source = Devices.localFilesPrePath + path\n    }\n\n    Item {\n        id: listv\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n\n        ColumnLayout {\n            id: column\n            anchors.left: parent.left\n            anchors.right: parent.right\n            anchors.top: parent.top\n            anchors.margins: 20*Devices.density\n\n            Label {\n                text: \"Algorithm:\"\n                Layout.fillWidth: true\n                font.bold: true\n            }\n\n            ComboBox {\n                id: algorithm\n                Layout.fillWidth: true\n                model: [\"Normal\", \"Saturation\"]\n            }\n\n            Button {\n                text: \"Select Image\"\n                Layout.fillWidth: true\n                Material.foreground: Material.LightBlue\n                onClicked: Devices.getOpenPictures()\n            }\n        }\n\n        Image {\n            anchors.top: column.bottom\n            anchors.bottom: parent.bottom\n            anchors.left: parent.left\n            anchors.right: parent.right\n            anchors.margins: 20*Devices.density\n            verticalAlignment: Image.AlignTop\n            horizontalAlignment: Image.AlignHCenter\n            fillMode: Image.PreserveAspectFit\n            source: analizer.source\n        }\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"ImageColorAnalizor\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"white\"\n        onClicked: AsemanApp.back()\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/nongraphical/MapDownloaderExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.7\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\n\nItem {\n\n//    MapDownloader {\n//        id: mapDownloader\n//        destination: Devices.localFilesPrePath + AsemanApp.tempPath\n//        mapProvider: mapProviderCombo.currentIndex\n//        size: Qt.size(img.width, img.height)\n//        zoom: 16\n//    }\n\n    Item {\n        id: listv\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n\n        ColumnLayout {\n            id: column\n            anchors.left: parent.left\n            anchors.right: parent.right\n            anchors.top: parent.top\n            anchors.margins: 20*Devices.density\n\n            ComboBox {\n                id: mapProviderCombo\n                Layout.fillWidth: true\n                model: [\"Google Map\"]\n            }\n\n            TextArea {\n                id: altTxt\n                placeholderText: qsTr(\"Altitude\")\n                Layout.fillWidth: true\n            }\n\n            TextField {\n                id: longTxt\n                placeholderText: qsTr(\"Longitude\")\n                Layout.fillWidth: true\n            }\n\n            Button {\n                text: \"Download\"\n                Layout.fillWidth: true\n                Material.foreground: Material.LightBlue\n                onClicked: mapDownloader.download( Qt.point(altTxt.text, longTxt.text) )\n            }\n        }\n\n        Image {\n            id: img\n            anchors.top: column.bottom\n            anchors.bottom: parent.bottom\n            anchors.left: parent.left\n            anchors.right: parent.right\n            anchors.margins: 20*Devices.density\n            verticalAlignment: Image.AlignTop\n            horizontalAlignment: Image.AlignHCenter\n            fillMode: Image.PreserveAspectFit\n//            source: mapDownloader.image\n\n            BusyIndicator {\n                anchors.centerIn: parent\n                width: 40*Devices.density\n                height: width\n                running: false //mapDownloader.downloading\n            }\n        }\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"MapDownloader\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"white\"\n        onClicked: AsemanApp.back()\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/nongraphical/NetworkSleepManagerExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.7\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\n\nItem {\n\n    NetworkSleepManager {\n        id: nwsManager\n        host: \"aseman.co\"\n        port: 80\n        interval: 5000\n        networkManager: true\n    }\n\n    Item {\n        id: listv\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n\n        ColumnLayout {\n            anchors.left: parent.left\n            anchors.right: parent.right\n            anchors.top: parent.top\n            anchors.margins: 20*Devices.density\n\n            Label {\n                text: nwsManager.available? \"Network Available\" : \"Network Unreachable\"\n                color: nwsManager.available? \"#009900\" : \"#990000\"\n            }\n        }\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"NetworkSleepManager\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"white\"\n        onClicked: AsemanApp.back()\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/nongraphical/NonGraphicalComponentsExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport \"../global\"\n\nRectangle {\n    id: scItem\n    color: masterPalette.window\n\n    signal appendRequest(variant component)\n\n    AsemanFlickable {\n        id: flick\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n        contentWidth: column.width\n        contentHeight: column.height\n\n        Column {\n            id: column\n            width: flick.width\n\n            MainMenuItem {\n                text: \"Downloader\"\n                onClicked: appendRequest(downloader_component)\n            }\n            MainMenuItem {\n                text: \"Encrypter\"\n                onClicked: appendRequest(encrypter_component)\n            }\n            MainMenuItem {\n                text: \"ImageColorAnalizor\"\n                onClicked: appendRequest(imageColorAnalizor_component)\n            }\n            MainMenuItem {\n                text: \"MapDownloader\"\n                onClicked: appendRequest(mapDownloader_component)\n            }\n            MainMenuItem {\n                text: \"NetworkSleepManager\"\n                onClicked: appendRequest(networkSleepManager_component)\n            }\n            MainMenuItem {\n                text: \"Notification\"\n                onClicked: appendRequest(notification_component)\n            }\n            MainMenuItem {\n                text: \"Settings\"\n                onClicked: appendRequest(settings_component)\n            }\n        }\n    }\n\n    HScrollBar {\n        anchors.right: flick.right\n        anchors.top: flick.top\n        height: flick.height\n        width: 6*Devices.density\n        color: \"#18f\"\n        scrollArea: flick\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"Non-Graphical Components\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"#ffffff\"\n        onClicked: BackHandler.back()\n    }\n\n    Component {\n        id: settings_component\n        SettingsExample {\n            anchors.fill: parent\n        }\n    }\n\n    Component {\n        id: downloader_component\n        DownloaderExample {\n            anchors.fill: parent\n        }\n    }\n\n    Component {\n        id: encrypter_component\n        EncrypterExample {\n            anchors.fill: parent\n        }\n    }\n\n    Component {\n        id: imageColorAnalizor_component\n        ImageColorAnalizorExample {\n            anchors.fill: parent\n        }\n    }\n\n    Component {\n        id: mapDownloader_component\n        MapDownloaderExample {\n            anchors.fill: parent\n        }\n    }\n\n    Component {\n        id: networkSleepManager_component\n        NetworkSleepManagerExample {\n            anchors.fill: parent\n        }\n    }\n\n    Component {\n        id: notification_component\n        NotificationExample {\n            anchors.fill: parent\n        }\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/nongraphical/NotificationExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.7\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Widgets 2.0\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\n\nItem {\n\n    Notification {\n        id: notification\n    }\n\n    Item {\n        id: listv\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n\n        ColumnLayout {\n            anchors.left: parent.left\n            anchors.right: parent.right\n            anchors.top: parent.top\n            anchors.margins: 20*Devices.density\n\n            TextField {\n                id: titleTxt\n                placeholderText: qsTr(\"Title\")\n                Layout.fillWidth: true\n            }\n\n            TextArea {\n                id: body\n                placeholderText: qsTr(\"Body text\")\n                Layout.fillWidth: true\n                Layout.preferredHeight: 200*Devices.density\n            }\n\n            Button {\n                text: \"Send\"\n                Layout.fillWidth: true\n                Material.foreground: Material.LightBlue\n                onClicked: notification.sendNotify(titleTxt.text, body.text, \"\")\n            }\n        }\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"Notification\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"white\"\n        onClicked: AsemanApp.back()\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/nongraphical/SettingsExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.7\nimport QtQuick.Controls 2.0\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Base 2.0\n\nItem {\n\n    Settings {\n        id: settings\n        source: AsemanApp.homePath + \"/settings.ini\"\n        category: \"General\"\n\n        property int number: 10\n        property string text: \"test Text\"\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"Settings\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"white\"\n        onClicked: AsemanApp.back()\n    }\n\n    Label {\n        anchors.left: parent.left\n        anchors.right: parent.right\n        anchors.top: header.bottom\n        anchors.margins: 10*Devices.density\n        text: \"Every changes in this page will be saved.\"\n    }\n\n    Column {\n        anchors.centerIn: parent\n\n        SpinBox {\n            anchors.horizontalCenter: parent.horizontalCenter\n            value: settings.number\n            onValueChanged: settings.number = value\n        }\n\n        TextField {\n            anchors.horizontalCenter: parent.horizontalCenter\n            text: settings.text\n            onTextChanged: settings.text = text\n        }\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/qml.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/\">\n        <file>qtquickcontrols2.conf</file>\n        <file>main.qml</file>\n        <file>AppWindow.qml</file>\n        <file>static/AsemanAppExample.qml</file>\n        <file>static/BackHandlerExample.qml</file>\n        <file>static/DesktopExample.qml</file>\n        <file>static/DevicesExample.qml</file>\n        <file>static/StaticComponentsExample.qml</file>\n        <file>static/TextToolsExample.qml</file>\n        <file>static/ToolsExample.qml</file>\n        <file>static/ViewExample.qml</file>\n        <file>nongraphical/DownloaderExample.qml</file>\n        <file>nongraphical/EncrypterExample.qml</file>\n        <file>nongraphical/ImageColorAnalizorExample.qml</file>\n        <file>nongraphical/MapDownloaderExample.qml</file>\n        <file>nongraphical/NetworkSleepManagerExample.qml</file>\n        <file>nongraphical/NonGraphicalComponentsExample.qml</file>\n        <file>nongraphical/NotificationExample.qml</file>\n        <file>nongraphical/SettingsExample.qml</file>\n        <file>models/CountriesModelExample.qml</file>\n        <file>models/FileSystemModelExample.qml</file>\n        <file>models/ModelComponentExamples.qml</file>\n        <file>graphical/GraphicalComponentsExample.qml</file>\n        <file>graphical/SideMenuExample.qml</file>\n        <file>global/MainMenuItem.qml</file>\n        <file>global/MainPage.qml</file>\n        <file>global/QmlControls.qml</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "demos/RegularApp/qtquickcontrols2.conf",
    "content": "[Controls]\nStyle=Material\n\n[Universal]\nTheme=Dark\nAccent=Red\n\n[Material]\nTheme=Light\nAccent=Blue\n \n"
  },
  {
    "path": "demos/RegularApp/static/AsemanAppExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\n\nRectangle {\n    color: masterPalette.window\n    clip: true\n\n    AsemanFlickable {\n        id: flick\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n        contentWidth: column.width\n        contentHeight: column.height\n\n        Column {\n            id: column\n            width: flick.width\n            spacing: 20*Devices.density\n\n            Item { height: 20*Devices.density; width: 10 }\n            GroupBox {\n                title: qsTr(\"Paths\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                clip: true\n\n                GridLayout {\n                    width: parent.width\n                    columns: Math.floor(width/(180*Devices.density))\n\n                    Label { text: \"homePath: <b>\" + AsemanApp.homePath + \"</b>\" }\n                    Label { text: \"startPath: <b>\" + AsemanApp.startPath + \"</b>\" }\n                    Label { text: \"appPath: <b>\" + AsemanApp.appPath + \"</b>\" }\n                    Label { text: \"appFilePath: <b>\" + AsemanApp.appFilePath + \"</b>\" }\n                    Label { text: \"logPath: <b>\" + AsemanApp.logPath + \"</b>\" }\n                    Label { text: \"confsPath: <b>\" + AsemanApp.confsPath + \"</b>\" }\n                    Label { text: \"tempPath: <b>\" + AsemanApp.tempPath + \"</b>\" }\n                    Label { text: \"backupsPath: <b>\" + AsemanApp.backupsPath + \"</b>\" }\n                    Label { text: \"cameraPath: <b>\" + AsemanApp.cameraPath + \"</b>\" }\n                }\n            }\n\n            GroupBox {\n                title: qsTr(\"Statuses\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                clip: true\n\n                GridLayout {\n                    width: parent.width\n                    columns: Math.floor(width/(180*Devices.density))\n\n                    Label { text: \"isDebug: \" + (AsemanApp.isDebug? \"<b>true</b>\" : \"false\") }\n                    Label {\n                        text: \"appType: <b>\" + appTypeName + \"</b>\"\n                        property string appTypeName: {\n                            switch(AsemanApp.appType) {\n                            case AsemanApp.NoneApplication:\n                                return \"NoneApplication\"\n                            case AsemanApp.CoreApplication:\n                                return \"CoreApplication\"\n                            case AsemanApp.GuiApplication:\n                                return \"GuiApplication\"\n                            case AsemanApp.WidgetApplication:\n                                return \"WidgetApplication\"\n                            }\n                        }\n                    }\n                    Label { text: \"isRunning: \" + (AsemanApp.isRunning? \"<b>true</b>\" : \"false\") }\n                    Label {\n                        text: \"applicationState: <b>\" + applicationStateName + \"</b>\"\n                        property string applicationStateName: {\n                            switch(AsemanApp.applicationState) {\n                            case AsemanApp.ApplicationSuspended:\n                                return \"Suspended\"\n                            case AsemanApp.ApplicationHidden:\n                                return \"Hidden\"\n                            case AsemanApp.ApplicationInactive:\n                                return \"Inactive\"\n                            case AsemanApp.ApplicationActive:\n                                return \"Active\"\n                            }\n                        }\n                    }\n                    Label { text: \"quitOnLastWindowClosed: \" + (AsemanApp.quitOnLastWindowClosed? \"<b>true</b>\" : \"false\") }\n                }\n            }\n\n            GroupBox {\n                title: qsTr(\"App Details\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                clip: true\n\n                GridLayout {\n                    width: parent.width\n                    columns: 1\n\n                    Label { text: \"applicationName: <b>\" + AsemanApp.applicationName + \"</b>\" }\n                    Label { text: \"applicationVersion: <b>\" + AsemanApp.applicationVersion + \"</b>\" }\n                    Label { text: \"organizationName: <b>\" + AsemanApp.organizationName + \"</b>\" }\n                    Label { text: \"organizationDomain: <b>\" + AsemanApp.organizationDomain + \"</b>\" }\n                    Label { text: \"applicationAbout: <b>\" + AsemanApp.applicationAbout + \"</b>\" }\n                    Label { text: \"applicationId: <b>\" + AsemanApp.applicationId + \"</b>\" }\n                    Label { text: \"applicationDisplayName: <b>\" + AsemanApp.applicationDisplayName + \"</b>\" }\n                }\n            }\n\n            GroupBox {\n                title: qsTr(\"Methods\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                clip: true\n\n                GridLayout {\n                    width: parent.width\n                    columns: 1\n\n                    RowLayout {\n                        Button { text: \"back\"; onClicked: AsemanApp.back() }\n                    }\n                }\n            }\n            Item { height: 20*Devices.density; width: 10 }\n        }\n    }\n\n    HScrollBar {\n        anchors.right: flick.right\n        anchors.top: flick.top\n        height: flick.height\n        width: 6*Devices.density\n        color: \"#18f\"\n        scrollArea: flick\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"AsemanApp\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"#ffffff\"\n        onClicked: BackHandler.back()\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/static/BackHandlerExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.7\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick.Controls 2.0\n\nItem {\n\n    Item {\n        id: listv\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n\n        Column {\n            anchors.left: parent.left\n            anchors.top: parent.top\n            anchors.margins: 20*Devices.density\n\n            Repeater {\n                model: 5\n                CheckBox {\n                    id: checkBox\n                    text: \"Check \" + index\n                    onCheckedChanged: {\n                        if(checked)\n                            BackHandler.pushHandler(checkBox, function(){checkBox.checked = false})\n                        else\n                            BackHandler.removeHandler(checkBox)\n                    }\n                }\n            }\n        }\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"BackHandler\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"white\"\n        onClicked: AsemanApp.back()\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/static/DesktopExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\n\nRectangle {\n    color: masterPalette.window\n    clip: true\n\n    AsemanFlickable {\n        id: flick\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n        contentWidth: column.width\n        contentHeight: column.height\n\n        Column {\n            id: column\n            width: flick.width\n\n            Item { height: 20*Devices.density; width: 10 }\n            GroupBox {\n                title: qsTr(\"Methods\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                clip: true\n\n                GridLayout {\n                    width: parent.width\n                    columns: 1\n\n                    RowLayout {\n                        Button { text: \"Open File\"; onClicked: resultLabel.text = Desktop.getOpenFileName() }\n                        Button { text: \"Open Files\"; onClicked: resultLabel.text = Desktop.getOpenFileNames().join(\"\\n\") }\n                    }\n                    RowLayout {\n                        Button { text: \"Save File\"; onClicked: resultLabel.text = Desktop.getSaveFileName() }\n                        Button { text: \"Get Directory\"; onClicked: resultLabel.text = Desktop.getExistingDirectory() }\n                    }\n                    RowLayout {\n                        Button { text: \"Get Font\"; onClicked: resultLabel.text = Desktop.getFont() }\n                        Button { text: \"Get Color\"; onClicked: resultLabel.text = Desktop.getColor() }\n                    }\n                    RowLayout {\n                        Button { text: \"Get Text\"; onClicked: resultLabel.text = Desktop.getText(View.window, \"Title\", \"Enter the text\") }\n                        Button { text: \"Show Menu\"; onClicked: resultLabel.text = Desktop.showMenu([\"Zero\", \"One\", \"\", \"Three\"]) }\n                    }\n                    RowLayout {\n                        Button { text: \"YES or NO\"; onClicked: resultLabel.text = Desktop.yesOrNo(View.window, \"Title\", \"Just yes or no?\") }\n                        Button { text: \"Show Message\"; onClicked: Desktop.showMessage(View.window, \"Title\", \"It's the message\") }\n                    }\n                }\n            }\n\n            Item { height: 20*Devices.density; width: 10 }\n            Label {\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                text: \"Result:\"\n                font.bold: true\n            }\n\n            Label {\n                id: resultLabel\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n            }\n\n            Item { height: 20*Devices.density; width: 10 }\n\n            GroupBox {\n                title: qsTr(\"Properties\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                clip: true\n\n                GridLayout {\n                    width: parent.width\n                    columns: 1\n\n                    RowLayout {\n                        Button { text: \"Show Tooltip\"; onClicked: Desktop.tooltip = \"Just a test tooltip\" }\n                    }\n\n                    Label {\n                        text: \"Desktop Session: <b>\" + desktopName + \"</b>\"\n                        property string desktopName: {\n                            switch(Desktop.desktopSession) {\n                            case Desktop.Gnome:\n                                return \"Unknown\"\n                            case Desktop.GnomeFallBack:\n                                return \"GnomeFallBack\"\n                            case Desktop.Unity:\n                                return \"Unity\"\n                            case Desktop.Kde:\n                                return \"Kde\"\n                            case Desktop.Plasma:\n                                return \"Plasma\"\n                            case Desktop.Windows:\n                                return \"Windows\"\n                            case Desktop.Mac:\n                                return \"Mac\"\n                            default:\n                            case Desktop.Unknown:\n                                return \"Unknown\"\n                            }\n                        }\n                    }\n                }\n            }\n\n            Item { height: 20*Devices.density; width: 10 }\n        }\n    }\n\n    HScrollBar {\n        anchors.right: flick.right\n        anchors.top: flick.top\n        height: flick.height\n        width: 6*Devices.density\n        color: \"#18f\"\n        scrollArea: flick\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"Desktop\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"#ffffff\"\n        onClicked: BackHandler.back()\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/static/DevicesExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\n\nRectangle {\n    color: masterPalette.window\n    clip: true\n\n    AsemanFlickable {\n        id: flick\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n        contentWidth: column.width\n        contentHeight: column.height\n\n        Column {\n            id: column\n            width: flick.width\n            spacing: 20*Devices.density\n\n            Item { height: 20*Devices.density; width: 10 }\n            GroupBox {\n                title: qsTr(\"Device Properties\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                clip: true\n\n                GridLayout {\n                    width: parent.width\n                    columns: Math.floor(width/(180*Devices.density))\n\n                    Label { text: \"isMobile: \" + (Devices.isMobile? \"<b>true</b>\" : \"false\") }\n                    Label { text: \"isTablet: \" + (Devices.isTablet? \"<b>true</b>\" : \"false\") }\n                    Label { text: \"isLargeTablet: \" + (Devices.isLargeTablet? \"<b>true</b>\" : \"false\") }\n                    Label { text: \"isTouchDevice: \" + (Devices.isTouchDevice? \"<b>true</b>\" : \"false\") }\n                    Label { text: \"isDesktop: \" + (Devices.isDesktop? \"<b>true</b>\" : \"false\") }\n                    Label { text: \"isMacX: \" + (Devices.isMacX? \"<b>true</b>\" : \"false\") }\n                    Label { text: \"isWindows: \" + (Devices.isWindows? \"<b>true</b>\" : \"false\") }\n                    Label { text: \"isWindows8: \" + (Devices.isWindows8? \"<b>true</b>\" : \"false\") }\n                    Label { text: \"isLinux: \" + (Devices.isLinux? \"<b>true</b>\" : \"false\") }\n                    Label { text: \"isAndroid: \" + (Devices.isAndroid? \"<b>true</b>\" : \"false\") }\n                    Label { text: \"isIOS: \" + (Devices.isIOS? \"<b>true</b>\" : \"false\") }\n                    Label { text: \"isUbuntuTouch: \" + (Devices.isUbuntuTouch? \"<b>true</b>\" : \"false\") }\n                    Label { text: \"isWindowsPhone: \" + (Devices.isWindowsPhone? \"<b>true</b>\" : \"false\") }\n                }\n            }\n\n            GroupBox {\n                title: qsTr(\"Screen Properties\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                clip: true\n\n                GridLayout {\n                    width: parent.width\n                    columns: Math.floor(width/(180*Devices.density))\n\n                    Label { text: \"lcdPhysicalSize: <b>\" + Math.floor(Devices.lcdPhysicalSize*10)/10 + \"</b>\" }\n                    Label { text: \"lcdPhysicalWidth: <b>\" + Math.floor(Devices.lcdPhysicalWidth*10)/10 + \"</b>\" }\n                    Label { text: \"lcdPhysicalHeight: <b>\" + Math.floor(Devices.lcdPhysicalHeight*10)/10 + \"</b>\" }\n                    Label { text: \"lcdDpiX: <b>\" + Math.floor(Devices.lcdDpiX*10)/10 + \"</b>\" }\n                    Label { text: \"lcdDpiY: <b>\" + Math.floor(Devices.lcdDpiY*10)/10 + \"</b>\" }\n                    Label { text: \"screenSize: <b>\" + Devices.screenSize.width + \"x\" + Devices.screenSize.height + \"</b>\" }\n                    Label { text: \"keyboardHeight: <b>\" + Devices.keyboardHeight + \"</b>\" }\n                }\n            }\n\n            GroupBox {\n                title: qsTr(\"Densities\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                clip: true\n\n                GridLayout {\n                    width: parent.width\n                    columns: Math.floor(width/(180*Devices.density))\n\n                    Label { text: \"density: <b>\" + Math.floor(Devices.density*10)/10 + \"</b>\" }\n                    Label { text: \"densityDpi: <b>\" + Math.floor(Devices.densityDpi*10)/10 + \"</b>\" }\n                    Label { text: \"fontDensity: <b>\" + Math.floor(Devices.fontDensity*10)/10 + \"</b>\" }\n                }\n            }\n\n            GroupBox {\n                title: qsTr(\"Operating System\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                clip: true\n\n                GridLayout {\n                    width: parent.width\n                    columns: Math.floor(width/(180*Devices.density))\n\n                    Label { text: \"transparentStatusBar: <b>\" + Devices.transparentStatusBar + \"</b>\" }\n                    Label { text: \"transparentNavigationBar: <b>\" + Devices.transparentNavigationBar + \"</b>\" }\n                    Label { text: \"standardTitleBarHeight: <b>\" + Math.floor(Devices.standardTitleBarHeight*10)/10 + \"</b>\" }\n                    Label { text: \"statusBarHeight: <b>\" + Math.floor(Devices.statusBarHeight*10)/10 + \"</b>\" }\n                    Label { text: \"navigationBarHeight: <b>\" + Math.floor(Devices.navigationBarHeight*10)/10 + \"</b>\" }\n\n                    Label { text: \"clipboard: <b>\" + Devices.clipboard + \"</b>\" }\n                    Label { text: \"keyboard: <b>\" + Devices.keyboard + \"</b>\" }\n\n                    Label { text: \"deviceName: <b>\" + Devices.deviceName + \"</b>\" }\n                    Label { text: \"localFilesPrePath: <b>\" + Devices.localFilesPrePath + \"</b>\" }\n                }\n            }\n\n            GroupBox {\n                title: qsTr(\"Paths\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                clip: true\n\n                GridLayout {\n                    width: parent.width\n                    columns: 1\n\n                    Label { text: \"cameraLocation: <b>\" + Devices.cameraLocation + \"</b>\" }\n                    Label { text: \"picturesLocation: <b>\" + Devices.picturesLocation + \"</b>\" }\n                    Label { text: \"musicsLocation: <b>\" + Devices.musicsLocation + \"</b>\" }\n                    Label { text: \"documentsLocation: <b>\" + Devices.documentsLocation + \"</b>\" }\n                    Label { text: \"downloadsLocation: <b>\" + Devices.downloadsLocation + \"</b>\" }\n                    Label { text: \"resourcePath: <b>\" + Devices.resourcePathQml + \"</b>\" }\n                    Label { text: \"libsPath: <b>\" + Devices.libsPath + \"</b>\" }\n                }\n            }\n\n            GroupBox {\n                title: qsTr(\"Methods\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                clip: true\n\n                GridLayout {\n                    width: parent.width\n                    columns: 1\n\n                    RowLayout {\n                        Button { text: \"showKeyboard\"; onClicked: Devices.showKeyboard() }\n                        Button { text: \"hideKeyboard\"; onClicked: Devices.hideKeyboard() }\n                    }\n                    RowLayout {\n                        Button { text: \"Share\"; onClicked: Devices.share(\"AsemanQtTools\", \"It's a message from AsemanQtTools\") }\n                        Button { text: \"Open File\"; onClicked: Devices.openFile(\"/path/to/file\") }\n                    }\n                    RowLayout {\n                        Button { text: \"Share File\"; onClicked: Devices.shareFile(\"/path/to/file\") }\n                        Button { text: \"Camera\"; onClicked: Devices.startCameraPicture() }\n                    }\n                }\n            }\n            Item { height: 20*Devices.density; width: 10 }\n        }\n    }\n\n    HScrollBar {\n        anchors.right: flick.right\n        anchors.top: flick.top\n        height: flick.height\n        width: 6*Devices.density\n        color: \"#18f\"\n        scrollArea: flick\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"Devices\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"#ffffff\"\n        onClicked: BackHandler.back()\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/static/StaticComponentsExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport \"../global\"\n\nRectangle {\n    id: scItem\n    color: masterPalette.window\n\n    signal appendRequest(variant component)\n\n    AsemanFlickable {\n        id: flick\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n        contentWidth: column.width\n        contentHeight: column.height\n\n        Column {\n            id: column\n            width: flick.width\n\n            MainMenuItem {\n                text: \"AsemanApp\"\n                onClicked: appendRequest(asemanApp_component)\n            }\n            MainMenuItem {\n                text: \"BackHandler\"\n                onClicked: appendRequest(backHandler_component)\n            }\n            MainMenuItem {\n                text: \"Devices\"\n                onClicked: appendRequest(devices_component)\n            }\n            MainMenuItem {\n                text: \"Desktop\"\n                onClicked: appendRequest(desktop_component)\n            }\n            MainMenuItem {\n                text: \"TextTools\"\n                onClicked: appendRequest(textToolsComponent)\n            }\n            MainMenuItem {\n                text: \"Tools\"\n                onClicked: appendRequest(toolsComponent)\n            }\n            MainMenuItem {\n                text: \"View\"\n                onClicked: appendRequest(view_component)\n            }\n        }\n    }\n\n    HScrollBar {\n        anchors.right: flick.right\n        anchors.top: flick.top\n        height: flick.height\n        width: 6*Devices.density\n        color: \"#18f\"\n        scrollArea: flick\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"Static Components\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"#ffffff\"\n        onClicked: BackHandler.back()\n    }\n\n    Component {\n        id: asemanApp_component\n        AsemanAppExample {\n            anchors.fill: parent\n        }\n    }\n\n    Component {\n        id: backHandler_component\n        BackHandlerExample {\n            anchors.fill: parent\n        }\n    }\n\n    Component {\n        id: devices_component\n        DevicesExample {\n            anchors.fill: parent\n        }\n    }\n\n    Component {\n        id: desktop_component\n        DesktopExample {\n            anchors.fill: parent\n        }\n    }\n\n    Component {\n        id: textToolsComponent\n        TextToolsExample {\n            anchors.fill: parent\n        }\n    }\n\n    Component {\n        id: toolsComponent\n        ToolsExample {\n            anchors.fill: parent\n        }\n    }\n\n    Component {\n        id: view_component\n        ViewExample {\n            anchors.fill: parent\n        }\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/static/TextToolsExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\n\nRectangle {\n    color: masterPalette.window\n    clip: true\n\n    AsemanFlickable {\n        id: flick\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n        contentWidth: column.width\n        contentHeight: column.height\n\n        Column {\n            id: column\n            width: flick.width\n            spacing: 20*Devices.density\n\n            Item { height: 20*Devices.density; width: 10 }\n            GroupBox {\n                title: qsTr(\"htmlWidth(string)\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n\n                ColumnLayout {\n                    width: parent.width\n\n                    TextArea {\n                        id: htmlText\n                        Layout.preferredWidth: parent.width\n                        Layout.preferredHeight: 200*Devices.density\n                        placeholderText: \"Write html code to calculate width\"\n                    }\n\n                    Label { text: \"The width is: \" + TextTools.htmlWidth(htmlText.text) }\n                }\n            }\n        }\n    }\n\n    HScrollBar {\n        anchors.right: flick.right\n        anchors.top: flick.top\n        height: flick.height\n        width: 6*Devices.density\n        color: \"#18f\"\n        scrollArea: flick\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"TextTools\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"#ffffff\"\n        onClicked: BackHandler.back()\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/static/ToolsExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\nimport \"../global\"\n\nRectangle {\n    color: masterPalette.window\n    clip: true\n\n    AsemanFlickable {\n        id: flick\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n        contentWidth: column.width\n        contentHeight: column.height\n\n        Column {\n            id: column\n            width: flick.width\n\n            MainMenuItem {\n                text: \"Visit Documents on Github\"\n                onClicked: Qt.openUrlExternally(\"https://github.com/Aseman-Land/aseman-qt-tools/blob/master/documents/tools.md\")\n            }\n        }\n    }\n\n    HScrollBar {\n        anchors.right: flick.right\n        anchors.top: flick.top\n        height: flick.height\n        width: 6*Devices.density\n        color: \"#18f\"\n        scrollArea: flick\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"Tools\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"#ffffff\"\n        onClicked: BackHandler.back()\n    }\n}\n"
  },
  {
    "path": "demos/RegularApp/static/ViewExample.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick.Controls 2.0\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\n\nRectangle {\n    color: masterPalette.window\n    clip: true\n\n    AsemanFlickable {\n        id: flick\n        width: parent.width\n        anchors.top: header.bottom\n        anchors.bottom: parent.bottom\n        contentWidth: column.width\n        contentHeight: column.height\n\n        Column {\n            id: column\n            width: flick.width\n            spacing: 20*Devices.density\n\n            Item { height: 20*Devices.density; width: 10 }\n            GroupBox {\n                title: qsTr(\"Heights\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                clip: true\n\n                GridLayout {\n                    width: parent.width\n                    columns: Math.floor(width/(180*Devices.density))\n\n                    Label { text: \"statusBarHeight: <b>\" + Math.floor(View.statusBarHeight*10)/10 + \"</b>\" }\n                    Label { text: \"navigationBarHeight: <b>\" + Math.floor(View.navigationBarHeight*10)/10 + \"</b>\" }\n                }\n            }\n\n            GroupBox {\n                title: qsTr(\"Objects\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                clip: true\n\n                GridLayout {\n                    width: parent.width\n                    columns: 1\n\n                    Label { text: \"root: <b>\" + View.root + \"</b>\" }\n                    Label { text: \"window: <b>\" + View.window + \"</b>\" }\n                }\n            }\n\n            GroupBox {\n                title: qsTr(\"Other\")\n                width: parent.width - 40*Devices.density\n                anchors.horizontalCenter: parent.horizontalCenter\n                clip: true\n\n                GridLayout {\n                    width: parent.width\n                    columns: 1\n\n                    Label {\n                        text: \"layoutDirection: <b>\" + layoutDirectionName + \"</b>\"\n                        property string layoutDirectionName: {\n                            switch(View.layoutDirection) {\n                            case Qt.LeftToRight:\n                                return \"LeftToRight\"\n                            case Qt.RightToLeft:\n                                return \"RightToLeft\"\n                            }\n                        }\n                    }\n                    Label { text: \"offlineStoragePath: <b>\" + View.offlineStoragePath + \"</b>\" }\n                }\n            }\n            Item { height: 20*Devices.density; width: 10 }\n        }\n    }\n\n    HScrollBar {\n        anchors.right: flick.right\n        anchors.top: flick.top\n        height: flick.height\n        width: 6*Devices.density\n        color: \"#18f\"\n        scrollArea: flick\n    }\n\n    Header {\n        id: header\n        width: parent.width\n        color: \"#18f\"\n        text: qsTr(\"View\")\n        shadow: true\n    }\n\n    HeaderMenuButton {\n        ratio: 1\n        buttonColor: \"#ffffff\"\n        onClicked: BackHandler.back()\n    }\n}\n"
  },
  {
    "path": "demos/template/app.pro",
    "content": "QT += quick qml\nCONFIG += c++11\n\nQML_IMPORT_PATH += \\\n    $$PWD/qml/imports\n\nRESOURCES += \\\n    qml/qml.qrc\n\nSOURCES += \\\n    main.cpp\n"
  },
  {
    "path": "demos/template/main.cpp",
    "content": "#include <QGuiApplication>\n#include <QQmlApplicationEngine>\n\nint main(int argc, char *argv[])\n{\n    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);\n\n    QGuiApplication app(argc, argv);\n\n    QQmlApplicationEngine engine;\n    engine.addImportPath(\":/imports/\");\n    const QUrl url(QStringLiteral(\"qrc:/main.qml\"));\n    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,\n                     &app, [url](QObject *obj, const QUrl &objUrl) {\n        if (!obj && url == objUrl)\n            QCoreApplication::exit(-1);\n    }, Qt::QueuedConnection);\n    engine.load(url);\n\n    return app.exec();\n}\n"
  },
  {
    "path": "demos/template/qml/MainWindow.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Viewport 2.0\nimport QtQuick.Controls 2.3\nimport forms 1.0\nimport models 1.0\nimport \"routes\"\n\nAsemanWindow {\n    width: 500\n    height: 820\n\n    Viewport {\n        id: viewport\n        anchors.fill: parent\n        mainItem: MainForm {\n            anchors.fill: parent\n            listView.model: ExampleModel {}\n            onItemClicked: Viewport.controller.trigger(\"popup:/dialog/example\", {\"id\": id})\n        }\n    }\n\n    ViewController {\n        viewport: viewport\n    }\n}\n"
  },
  {
    "path": "demos/template/qml/imports/forms/ErrorDialogForm.ui.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Base 2.0\nimport QtQuick.Controls 2.3\nimport QtQuick.Layouts 1.3\nimport globals 1.0\n\nItem {\n    id: element\n    width: Constants.width\n    height: columnLayout.height\n\n    property alias bodyLabel: bodyLabel\n    property alias titleLabel: titleLabel\n    property alias repeater: repeater\n\n    signal itemClicked(int index, string title)\n\n    Frame {\n        anchors.fill: parent\n        opacity: 0.7\n    }\n\n    ColumnLayout {\n        id: columnLayout\n        anchors.verticalCenter: parent.verticalCenter\n        anchors.right: parent.right\n        anchors.left: parent.left\n        spacing: 0\n\n        ColumnLayout {\n            Layout.topMargin: 12\n            Layout.fillHeight: true\n            Layout.fillWidth: true\n            Layout.margins: 10\n            spacing: 6\n\n            Label {\n                id: titleLabel\n                Layout.fillWidth: true\n                font.bold: true\n                font.pixelSize: 10 * Devices.fontDensity\n                horizontalAlignment: Devices.isAndroid ? Text.AlignLeft : Text.AlignHCenter\n                wrapMode: Text.WrapAtWordBoundaryOrAnywhere\n                text: \"Title\"\n            }\n\n            Label {\n                id: bodyLabel\n                Layout.fillWidth: true\n                Layout.fillHeight: true\n                font.pixelSize: 9 * Devices.fontDensity\n                horizontalAlignment: Devices.isAndroid ? Text.AlignLeft : Text.AlignHCenter\n                wrapMode: Text.WrapAtWordBoundaryOrAnywhere\n                text: \"Message's body\"\n            }\n        }\n\n        Rectangle {\n            Layout.topMargin: 6\n            Layout.fillWidth: true\n            Layout.preferredHeight: 1\n            color: \"#88888888\"\n            visible: !Devices.isAndroid\n            opacity: 0.4\n        }\n\n        RowLayout {\n            spacing: 0\n            Layout.fillWidth: true\n\n            Repeater {\n                id: repeater\n                model: [\"Ok\"]\n                Button {\n                    id: btn\n                    Layout.fillWidth: true\n                    topInset: 0\n                    bottomInset: 0\n                    leftInset: 0\n                    rightInset: 0\n                    highlighted: true\n                    flat: true\n                    hoverEnabled: false\n                    text: modelData\n\n                    Connections {\n                        target: btn\n                        onClicked: element.itemClicked(model.index, modelData)\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "demos/template/qml/imports/forms/MainForm.ui.qml",
    "content": "import QtQuick 2.12\nimport QtQuick.Controls 2.3\nimport QtQuick.Controls.Material 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Viewport 2.0\nimport globals 1.0\n\nPage {\n    width: Constants.width\n    height: Constants.height\n\n    property alias listView: listView\n\n    signal itemClicked(int id)\n\n    Label {\n        anchors.centerIn: parent\n        font.pixelSize: 12 * Devices.fontDensity\n        text: qsTr(\"List is empty\") + Translations.refresher\n        visible: listView.count == 0\n    }\n\n    ListView {\n        id: listView\n        anchors.top: header.bottom\n        anchors.left: parent.left\n        anchors.right: parent.right\n        anchors.bottom: parent.bottom\n        delegate: ItemDelegate {\n            id: del\n            height: 60\n            width: listView.width\n            text: model.title\n\n            Connections {\n                target: del\n                onClicked: itemClicked(model.id)\n            }\n        }\n    }\n\n    Header {\n        id: header\n        anchors.left: parent.left\n        anchors.right: parent.right\n        color: Material.primary\n        text: qsTr(\"App\") + Translations.refresher\n    }\n}\n"
  },
  {
    "path": "demos/template/qml/imports/forms/WaitDialog.ui.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Base 2.0\nimport QtQuick.Controls 2.3\nimport QtQuick.Layouts 1.3\nimport globals 1.0\n\nItem {\n    id: element\n    width: 200 * Devices.density\n    height: 150 * Devices.density\n\n    Frame {\n        id: dialogBackground\n        anchors.fill: parent\n        opacity: 0.7\n    }\n\n    ColumnLayout {\n        id: dialogLayout\n        spacing: 4 * Devices.density\n        anchors.verticalCenter: parent.verticalCenter\n        anchors.horizontalCenter: parent.horizontalCenter\n\n        BusyIndicator {\n            id: busyIndicator\n            Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter\n            running: element.visible\n        }\n\n        Label {\n            id: waitLabel\n            text: qsTr(\"Please Wait...\") + Translations.refresher\n            Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter\n            font.pixelSize: 9 * Devices.fontDensity\n        }\n    }\n}\n"
  },
  {
    "path": "demos/template/qml/imports/forms/qmldir",
    "content": "ErrorDialogForm 1.0 ErrorDialogForm.ui.qml\nMainForm 1.0 MainForm.ui.qml\nWaitDialog 1.0 WaitDialog.ui.qml\n"
  },
  {
    "path": "demos/template/qml/imports/globals/Colors.qml",
    "content": "pragma Singleton\n\nimport QtQuick 2.10\nimport AsemanQml.Base 2.0\n\nQtObject {\n}\n"
  },
  {
    "path": "demos/template/qml/imports/globals/Constants.qml",
    "content": "pragma Singleton\n\nimport QtQuick 2.10\nimport AsemanQml.Base 2.0\n\nQtObject {\n    readonly property int width: 480\n    readonly property int height: 800\n    \n    readonly property string cachePath: AsemanApp.homePath + \"/cache\"\n\n    Component.onCompleted: {\n        Tools.mkDir(cachePath)\n    }\n}\n"
  },
  {
    "path": "demos/template/qml/imports/globals/Fonts.qml",
    "content": "pragma Singleton\n\nimport QtQuick 2.10\nimport AsemanQml.Base 2.0\n\nAsemanObject\n{\n    property alias ubuntuFont: ubuntu_font.name\n\n    FontLoader { id: ubuntu_font; source: \"fonts/Ubuntu-R.ttf\" }\n\n    function init() {\n    }\n}\n"
  },
  {
    "path": "demos/template/qml/imports/globals/GlobalSettings.qml",
    "content": "pragma Singleton\n\nimport QtQuick 2.7\nimport AsemanQml.Base 2.0\n\nSettings {\n        category: \"General\"\n        source: AsemanApp.homePath + \"/settings.ini\"\n\n        property bool languageInited: false\n}\n\n"
  },
  {
    "path": "demos/template/qml/imports/globals/qmldir",
    "content": "singleton Constants 1.0 Constants.qml\nsingleton GlobalSettings 1.0 GlobalSettings.qml\nsingleton Fonts 1.0 Fonts.qml\nsingleton Colors 1.0 Colors.qml\n"
  },
  {
    "path": "demos/template/qml/imports/models/ExampleModel.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Models 2.0\nimport requests 1.0\nimport globals 1.0\n\nAsemanListModel {\n    cachePath: Constants.cachePath + \"/example.cache\"\n\n    ExampleRequest {\n        id: req\n        allowGlobalBusy: true\n    }\n\n    AsemanListModelSource {\n        source: req.response\n    }\n}\n"
  },
  {
    "path": "demos/template/qml/imports/models/qmldir",
    "content": " ExampleModel 1.0 ExampleModel.qml\n"
  },
  {
    "path": "demos/template/qml/imports/requests/BaseRequest.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Network 2.0\nimport AsemanQml.Viewport 2.0\nimport globals 1.0\n\nNetworkRequest {\n    id: req\n    contentType: 0 //NetworkRequest.TypeJson\n    ignoreKeys: [\"baseUrl\", \"refreshingState\", \"allowGlobalBusy\"]\n    ignoreRegExp: /^_\\w+$/\n    headers: {\n        \"Content-Type\": \"application/json\"\n    }\n\n    readonly property string baseUrl: \"https://jsonplaceholder.typicode.com\"\n    readonly property bool refreshingState: req.refreshing\n    property bool allowGlobalBusy: false\n\n    property alias _networkManager: networkManager\n    property bool _debug: false\n\n    signal refreshRequest()\n\n    onResponseChanged: if (_debug) console.debug(Tools.variantToJson(response))\n    onHeadersChanged: if (!refreshing) refreshRequest()\n    onRefreshingStateChanged: {\n        if (!allowGlobalBusy)\n            return;\n\n        if (refreshingState)\n            Viewport.controller.waitCount++\n        else\n            Viewport.controller.waitCount--\n    }\n\n    Component.onDestruction: if (refreshingState && allowGlobalBusy) Viewport.controller.waitCount--\n\n    onServerError: {\n        try {\n            _showError(\"Server Error\", response.message)\n        } catch (e) {}\n    }\n    onClientError: {\n        try {\n            _showError(\"Client Error\", response.message);\n        } catch (e) {}\n    }\n\n    function _showError(title, body) {\n        Tools.jsDelayCall(500, function() {\n            Viewport.controller.trigger(\"dialog:/general/error\", {\"title\": title, \"body\": body})\n        })\n    }\n\n    NetworkRequestManager {\n        id: networkManager\n    }\n\n    Timer {\n        repeat: false\n        running: true\n        interval: 100\n        onTriggered: refreshRequest()\n    }\n}\n"
  },
  {
    "path": "demos/template/qml/imports/requests/ExampleRequest.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport globals 1.0\n\nBaseRequest {\n    id: todoRequest\n    url: baseUrl + \"/todos\"\n\n    onRefreshRequest: refresh()\n\n    function refresh() {\n        if (refreshing)\n            return;\n\n        _networkManager.get(todoRequest);\n    }\n}\n"
  },
  {
    "path": "demos/template/qml/imports/requests/qmldir",
    "content": "ExampleRequest 1.0 ExampleRequest.qml\n"
  },
  {
    "path": "demos/template/qml/main.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport globals 1.0\n\nAsemanApplication {\n    id: app\n    applicationAbout: \"It's template app\"\n    applicationDisplayName: \"Template\"\n    Component.onCompleted: {\n        Fonts.init()\n\n        if (Devices.isDesktop) Devices.fontScale = 1.1\n        if (Devices.isAndroid) Devices.fontScale = 0.92\n        if (Devices.isIOS) Devices.fontScale = 1.1\n    }\n\n    MainWindow {\n        visible: true\n        font.family: Fonts.ubuntuFont\n    }\n}\n"
  },
  {
    "path": "demos/template/qml/qml.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/\">\n        <file>qtquickcontrols2.conf</file>\n        <file>imports/forms/ErrorDialogForm.ui.qml</file>\n        <file>imports/forms/MainForm.ui.qml</file>\n        <file>imports/forms/qmldir</file>\n        <file>imports/forms/WaitDialog.ui.qml</file>\n        <file>imports/globals/Colors.qml</file>\n        <file>imports/globals/Constants.qml</file>\n        <file>imports/globals/Fonts.qml</file>\n        <file>imports/globals/GlobalSettings.qml</file>\n        <file>imports/globals/qmldir</file>\n        <file>imports/models/ExampleModel.qml</file>\n        <file>imports/models/qmldir</file>\n        <file>imports/requests/BaseRequest.qml</file>\n        <file>imports/requests/ExampleRequest.qml</file>\n        <file>imports/requests/qmldir</file>\n        <file>routes/ViewController.qml</file>\n        <file>main.qml</file>\n        <file>MainWindow.qml</file>\n        <file>qml.qrc</file>\n        <file>routes/ErrorDialog.qml</file>\n        <file>routes/WaitDialog.qml</file>\n        <file>imports/globals/fonts/Ubuntu-R.ttf</file>\n        <file>routes/ExamplePopup.qml</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "demos/template/qml/qtquickcontrols2.conf",
    "content": "[Controls]\nStyle=IOSStyle\n\n[Material]\nPrimary=Blue\nAccent=Teal\nTheme=Light\n\n[IOSStyle]\nPrimary=Blue\nAccent=Blue\nTheme=System\n"
  },
  {
    "path": "demos/template/qml/routes/ErrorDialog.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Base 2.0\nimport AsemanQml.Viewport 2.0\nimport forms 1.0\n\nErrorDialogForm {\n    width: Math.min(300, Viewport.viewport.width*0.8)\n\n    property variant buttons\n    property string title\n    property string body\n\n    titleLabel.text: title\n    bodyLabel.text: body\n    repeater.model: buttons? buttons : [ qsTr(\"Ok\") + Translations.refresher ]\n\n    onItemClicked: if (!buttons && index == 0) Viewport.viewport.closeLast()\n}\n"
  },
  {
    "path": "demos/template/qml/routes/ExamplePopup.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Viewport 2.0\nimport QtQuick.Controls 2.3\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\n\nPage {\n    RowLayout {\n        anchors.centerIn: parent\n\n        Button {\n            text: qsTr(\"Popup\") + Translations.refresher\n            onClicked: Viewport.controller.trigger(\"popup:/dialog/example\")\n            highlighted: true\n        }\n\n        Button {\n            text: qsTr(\"Page\") + Translations.refresher\n            onClicked: Viewport.controller.trigger(\"page:/dialog/example\")\n        }\n    }\n\n    Header {\n        id: header\n        anchors.left: parent.left\n        anchors.right: parent.right\n        color: Material.primary\n        text: qsTr(\"App\") + Translations.refresher\n\n        HeaderMenuButton {\n            ratio: 1\n            onClicked: Viewport.viewport.closeLast()\n        }\n    }\n}\n"
  },
  {
    "path": "demos/template/qml/routes/ViewController.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Viewport 2.0\n\nViewportController {\n    id: viewController\n\n    property int waitCount: 0\n    property variant waitObj\n\n    onWaitCountChanged: {\n        if (waitCount) {\n            if (!waitObj) waitObj = trigger(\"dialog:/wait\");\n        } else {\n            if (waitObj) waitObj.close()\n        }\n    }\n\n    ViewportControllerRoute {\n        route: /dialog:\\/general\\/error.*/\n        source: \"ErrorDialog.qml\"\n    }\n\n    ViewportControllerRoute {\n        route: /dialog:\\/wait/\n        source: \"WaitDialog.qml\"\n    }\n\n    ViewportControllerRoute {\n        route: /\\w+\\:\\/dialog\\/example.*/\n        source: \"ExamplePopup.qml\"\n    }\n}\n\n"
  },
  {
    "path": "demos/template/qml/routes/WaitDialog.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Viewport 2.0\nimport forms 1.0\n\nWaitDialog {\n    ViewportType.touchToClose: false\n    ViewportType.blockBack: true\n\n    function close() {\n        ViewportType.open = false\n    }\n}\n"
  },
  {
    "path": "demos/translation-example/UpdateTranslations.sh",
    "content": "#! /bin/sh\n\n# Set the home if not already set.\nif [ \"${MEIKADE_SRC_PATH}\" = \"\" ]; then\n    MEIKADE_SRC_PATH=\"`echo $0 | grep ^/`\"\n    if [ \"$MEIKADE_SRC_PATH\" = \"\" ]; then\n    MEIKADE_SRC_PATH=\"$PWD\"/\"$0\"\n    fi\n    cd `dirname $MEIKADE_SRC_PATH`\n    MEIKADE_SRC_PATH=$PWD\n    cd -\nfi\n\ncd $MEIKADE_SRC_PATH\nfor TRANSLATION in ./translations_sources/*.ts\ndo\n    lupdate `find -name '*.cpp' -type f` \\\n            `find -name '*.qml' -type f` \\\n            `find -name '*.h' -type f` \\\n            `find -name '*.ui' -type f` \\\n            -ts \"$TRANSLATION\"\ndone\n\n"
  },
  {
    "path": "demos/translation-example/main.qml",
    "content": "import AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick 2.7\nimport \".\"\n\nAsemanApplication {\n    id: app\n    applicationName: \"TrApp\"\n    applicationAbout: \"Translation App\"\n    applicationDisplayName: \"Translation App\"\n    applicationVersion: \"v0.0.1\"\n    applicationId: \"e7c2f1f3-dc2a-4ec2-9268-a863a76df9c3\"\n    organizationDomain: \"aseman.co\"\n    organizationName: \"Aseman Team\"\n    source: \"mainforms/MainWindow.qml\"\n    \n    Settings {\n        id: settings\n        source: AsemanApp.homePath + \"/settings.ini\"\n        category: \"General\"\n\n        property string localeName: \"fa\"\n    }\n\n    TranslationManager {\n        id: translationManager\n        sourceDirectory: \"translations\"\n        delimiters: \"-\"\n        fileName: \"lang\"\n        localeName: settings.localeName\n\n        function refreshLayouts() {\n            console.debug(textDirection)\n        }\n        Component.onCompleted: refreshLayouts()\n        onLocaleNameChanged: refreshLayouts()\n    }\n}\n"
  },
  {
    "path": "demos/translation-example/mainforms/MainWindow.qml",
    "content": "import AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick 2.7\nimport QtQuick.Controls 2.0\nimport QtGraphicalEffects 1.0\nimport QtQuick.Controls.Material 2.1\nimport \".\"\n\nAsemanWindow {\n    id: appWindow\n    width: 480\n    height: 720\n    visible: true\n\n    Material.theme: Material.Light\n\n    Page {\n        anchors.fill: parent\n        \n        Column {\n            anchors.centerIn: parent\n            spacing: 20*Devices.density\n            \n            Text {\n                anchors.horizontalCenter: parent.horizontalCenter\n                text: qsTr(\"Hello World\") + Translations.refresher\n            }\n            \n            ComboBox {\n                anchors.horizontalCenter: parent.horizontalCenter\n                model: {\n                    var res = new Array\n                    console.debug( Tools.variantToJson(translationManager.translations) )\n                    for(var lang in translationManager.translations)\n                        res[res.length] = lang\n                    return res\n                }\n                onCurrentTextChanged: settings.localeName = currentText\n            }\n        }\n    }\n\n    BackAction {\n        id: searchAction\n    }\n}\n"
  },
  {
    "path": "demos/translation-example/translations/lang-en.qm",
    "content": "<d\u0018!\u001c`"
  },
  {
    "path": "demos/translation-example/translations_sources/lang-en.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\">\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>Hello World</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "demos/translation-example/translations_sources/lang-fa.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"fa_IR\">\n<context>\n    <name>MainWindow</name>\n    <message>\n        <source>Hello World</source>\n        <translation>سلام دنیا</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "documents/.gitignore",
    "content": "/html/\n"
  },
  {
    "path": "documents/AsemanQml.Base.md",
    "content": "# AsemanQml.Base\n\n ## AsemanApp\n\n`AsemanApp` static component, provides methods, signals and properties to work with QGuiApplication and Other app functionallity.\n\n### Request Permissions\n\nTo request or check permission (only on android) you using `requestPermissions` and `checkPermissions` methods like below example:\n\n````js\nAsemanApp.requestPermissions([\"android.permission.CAMERA\", \n                              \"android.permission.READ_EXTERNAL_STORAGE\"], \n                             function(res) {\n    if (res[\"android.permission.CAMERA\"] === true) {\n        ...\n    }\n    if (res[\"android.permission.READ_EXTERNAL_STORAGE\"] === true) {\n        ...\n    }\n});\n````\n\nor\n\n```js\nvar res = AsemanApp.checkPermissions([\"android.permission.CAMERA\"]);\nif (res[\"android.permission.CAMERA\"] === true) {\n    ...\n}\n```\n\n### Get application related paths\n\nUsing below properties you can get standard paths of the OS:\n\n| Property              | Description                                            |\n| :-------------------- | ------------------------------------------------------ |\n| AsemanApp.homePath    | Returns path to store app configs and other files (ro) |\n| AsemanApp.startPath   | Returns working directory of the app (ro)              |\n| AsemanApp.appPath     | Returns application directory path (ro)                |\n| AsemanApp.appFilePath | Returns application file path (ro)                     |\n| AsemanApp.logPath     | Returns suggested dir path to store logs (ro)          |\n| AsemanApp.confsPath   | Returns suggested dir path to store configs (ro)       |\n| AsemanApp.tempPath    | Returns suggested dir path to store temp files (ro)    |\n| AsemanApp.backupsPath | Returns suggested dir path to store backup files (ro)  |\n| AsemanApp.cameraPath  | Returns camera dir path (ro)                           |\n\n### Application Details\n\nSet and Read application details like name and organization using below properties\n\n| Property                         | Description                              |\n| -------------------------------- | ---------------------------------------- |\n| AsemanApp.applicationName        | Application name (rw)                    |\n| AsemanApp.applicationVersion     | Version string of the application (rw)   |\n| AsemanApp.organizationName       | Application organization name (rw)       |\n| AsemanApp.organizationDomain     | Application organization domain (rw)     |\n| AsemanApp.applicationAbout       | Short description about application (rw) |\n| AsemanApp.applicationDisplayName | Display name of the application (rw)     |\n\n## DesktopTools\n\nSome tools and methods to do some actions on the Desktop operating systems\n\n### System Dialogs\n\nUsing below methods you can work with system dialogs\n\n| Method                              | Description                                                  |\n| ----------------------------------- | ------------------------------------------------------------ |\n| DesktopTools.getOpenFileName()      | Show open file dialog of the operating system                |\n| DesktopTools.getOpenFileNames()     | Show open multiple file dialog of the operating system       |\n| DesktopTools.getSaveFileName()      | Show save file dialog of the operating system                |\n| DesktopTools.getExistingDirectory() | Show select directory dialog of the operating system         |\n| DesktopTools.getFont()              | Show operating system font chooser dialog                    |\n| DesktopTools.getColor()             | Show operating system color chooser dialog                   |\n| DesktopTools.getText()              | Show operating system text input dialog (for example for file renaming) |\n| DesktopTools.yesOrNo()              | Show simple message to choose between yes or no              |\n| DesktopTools.showMessage()          | Show a simple information message with ok button             |\n\n## Devices\n\n`Devices` component provides many properties, methods and signal to work with device features like screen density, deviceId, device type and ...\n\n### Screen related properties\n\nBelow properties return everything related to your screen and also operating system display settings\n\n| Property                  | Description                                                  |\n| ------------------------- | ------------------------------------------------------------ |\n| Devices.screen            | Returns screen object (ro)                                   |\n| Devices.lcdPhysicalSize   | Returns lcd size (ro)                                        |\n| Devices.lcdPhysicalWidth  | Returns lcd width (ro)                                       |\n| Devices.lcdPhysicalHeight | Returns lcd height (ro)                                      |\n| Devices.lcdDpiX           | Returns lcd horizontal dpi (ro)                              |\n| Devices.lcdDpiY           | Returns lcd vertical dpi (ro)                                |\n| Devices.screenSize        | Returns screen resolution as QSize (ro)                      |\n| Devices.densityDpi        | Returns density dpi of the screen (ro)                       |\n| Devices.density           | Returns density value of the screen (ro)                     |\n| Devices.deviceDensity     | Returns device density of the screen (ro)                    |\n| Devices.fontDensity       | Returns suggested density for fonts (ro)                     |\n| Devices.fontScale         | Scale all fonts that their size is related to Devices.fontDensity (rw) |\n\n### Device type\n\nTo check device type on the QML source codes, use below properties\n\n| Property               | Description                                                  |\n| ---------------------- | ------------------------------------------------------------ |\n| Devices.isMobile       | Returns true if device is mobile (ro)                        |\n| Devices.isLargeTablet  | Returns true if device is a large tablet (ro)                |\n| Devices.isTablet       | Returns true if device is any kind of tablet (ro)            |\n| Devices.isTouchDevice  | Returns true if device is mobile or tablet (ro)              |\n| Devices.isDesktop      | Returns true if device is any kind of desktop devices (mac or pc) (ro) |\n| Devices.isMacX         | Returns true if device is mac (ro)                           |\n| Devices.isWindows      | Returns true if device is windows (ro)                       |\n| Devices.isWindows8     | Returns true if device is windows 8 (ro)                     |\n| Devices.isLinux        | Returns true if device is any desktop linux distribution (ro) |\n| Devices.isAndroid      | Returns true if device is android (ro)                       |\n| Devices.isIOS          | Returns true if device is iOS (ro)                           |\n| Devices.isUbuntuTouch  | Returns true if device is ubuntu touch device (ro)           |\n| Devices.isWindowsPhone | Returns true if device is windows phone (ro)                 |\n\n### Operating System Parts\n\nTo work with any parts of the operating system like statusbar, virtual keyboard and ..., Use below methods\n\n| Property                         | Description                                                  |\n| -------------------------------- | ------------------------------------------------------------ |\n| Devices.transparentStatusBar     | Returns true if status-bar is transparented on Android (rw)  |\n| Devices.transparentNavigationBar | Returns true if navigation-bar is transparented on Android (rw) |\n| Devices.standardTitleBarHeight   | Returns standard and best suggested titleBar height (ro)     |\n| Devices.statusBarHeight          | Returns status-bar height (ro)                               |\n| Devices.navigationBarHeight      | Returns navigation-bar height (ro)                           |\n| Devices.clipboard                | Returns clipboard contained text (rw)                        |\n| Devices.clipboardUrl             | Returns clipboard contained urls (rw)                        |\n| Devices.keyboardHeight           | Returns keyboard height (ro)                                 |\n| Devices.keyboard                 | Returns true if keyboard is visible (ro)                     |\n| Devices.hideKeyboard()           | Hide keyboard if it visible                                  |\n| Devices.showKeyboard()           | Show keyboard if it hidden                                   |\n\n"
  },
  {
    "path": "documents/Doxyfile",
    "content": "# Doxyfile 1.8.13\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project.\n#\n# All text after a double hash (##) is considered a comment and is placed in\n# front of the TAG it is preceding.\n#\n# All text after a single hash (#) is considered a comment and will be ignored.\n# The format is:\n# TAG = value [value, ...]\n# For lists, items can also be appended using:\n# TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\\\" \\\").\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file\n# that follow. The default is UTF-8 which is also the encoding used for all text\n# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv\n# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv\n# for the list of possible encodings.\n# The default value is: UTF-8.\n\nDOXYFILE_ENCODING      = UTF-8\n\n# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by\n# double-quotes, unless you are using Doxywizard) that should identify the\n# project for which the documentation is generated. This name is used in the\n# title of most generated pages and in a few other places.\n# The default value is: My Project.\n\nPROJECT_NAME           = QAseman\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number. This\n# could be handy for archiving the generated documentation or if some version\n# control system is used.\n\nPROJECT_NUMBER         = 3.0.0\n\n# Using the PROJECT_BRIEF tag one can provide an optional one line description\n# for a project that appears at the top of each page and should give viewer a\n# quick idea about the purpose of the project. Keep the description short.\n\nPROJECT_BRIEF          = \"A set of C++ and QML tools and modules that helps you develop your projects easier and better.\"\n\n# With the PROJECT_LOGO tag one can specify a logo or an icon that is included\n# in the documentation. The maximum height of the logo should not exceed 55\n# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy\n# the logo to the output directory.\n\nPROJECT_LOGO           = logo/logo.png\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path\n# into which the generated documentation will be written. If a relative path is\n# entered, it will be relative to the location where doxygen was started. If\n# left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       = /home/bardia/Projects/Aseman/Tools/QtAsemanTools/documents\n\n# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-\n# directories (in 2 levels) under the output directory of each output format and\n# will distribute the generated files over these directories. Enabling this\n# option can be useful when feeding doxygen a huge amount of source files, where\n# putting all generated files in the same directory would otherwise causes\n# performance problems for the file system.\n# The default value is: NO.\n\nCREATE_SUBDIRS         = YES\n\n# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII\n# characters to appear in the names of generated files. If set to NO, non-ASCII\n# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode\n# U+3044.\n# The default value is: NO.\n\nALLOW_UNICODE_NAMES    = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,\n# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),\n# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,\n# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),\n# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,\n# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,\n# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,\n# Ukrainian and Vietnamese.\n# The default value is: English.\n\nOUTPUT_LANGUAGE        = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member\n# descriptions after the members that are listed in the file and class\n# documentation (similar to Javadoc). Set to NO to disable this.\n# The default value is: YES.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief\n# description of a member or function before the detailed description\n#\n# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n# The default value is: YES.\n\nREPEAT_BRIEF           = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator that is\n# used to form the text in various listings. Each string in this list, if found\n# as the leading text of the brief description, will be stripped from the text\n# and the result, after processing the whole list, is used as the annotated\n# text. Otherwise, the brief description is used as-is. If left blank, the\n# following values are used ($name is automatically replaced with the name of\n# the entity):The $name class, The $name widget, The $name file, is, provides,\n# specifies, contains, represents, a, an and the.\n\nABBREVIATE_BRIEF       = \"The $name class\" \\\n                         \"The $name widget\" \\\n                         \"The $name file\" \\\n                         is \\\n                         provides \\\n                         specifies \\\n                         contains \\\n                         represents \\\n                         a \\\n                         an \\\n                         the\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# doxygen will generate a detailed section even if there is only a brief\n# description.\n# The default value is: NO.\n\nALWAYS_DETAILED_SEC    = YES\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n# inherited members of a class in the documentation of that class as if those\n# members were ordinary class members. Constructors, destructors and assignment\n# operators of the base classes will not be shown.\n# The default value is: NO.\n\nINLINE_INHERITED_MEMB  = NO\n\n# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path\n# before files name in the file list and in the header files. If set to NO the\n# shortest path that makes the file name unique will be used\n# The default value is: YES.\n\nFULL_PATH_NAMES        = YES\n\n# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.\n# Stripping is only done if one of the specified strings matches the left-hand\n# part of the path. The tag can be used to show relative paths in the file list.\n# If left blank the directory from which doxygen is run is used as the path to\n# strip.\n#\n# Note that you can specify absolute paths here, but also relative paths, which\n# will be relative from the directory where doxygen is started.\n# This tag requires that the tag FULL_PATH_NAMES is set to YES.\n\nSTRIP_FROM_PATH        = \n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the\n# path mentioned in the documentation of a class, which tells the reader which\n# header file to include in order to use a class. If left blank only the name of\n# the header file containing the class definition is used. Otherwise one should\n# specify the list of include paths that are normally passed to the compiler\n# using the -I flag.\n\nSTRIP_FROM_INC_PATH    = \n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but\n# less readable) file names. This can be useful is your file systems doesn't\n# support long names like on DOS, Mac, or CD-ROM.\n# The default value is: NO.\n\nSHORT_NAMES            = NO\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the\n# first line (until the first dot) of a Javadoc-style comment as the brief\n# description. If set to NO, the Javadoc-style will behave just like regular Qt-\n# style comments (thus requiring an explicit @brief command for a brief\n# description.)\n# The default value is: NO.\n\nJAVADOC_AUTOBRIEF      = NO\n\n# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first\n# line (until the first dot) of a Qt-style comment as the brief description. If\n# set to NO, the Qt-style will behave just like regular Qt-style comments (thus\n# requiring an explicit \\brief command for a brief description.)\n# The default value is: NO.\n\nQT_AUTOBRIEF           = YES\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a\n# multi-line C++ special comment block (i.e. a block of //! or /// comments) as\n# a brief description. This used to be the default behavior. The new default is\n# to treat a multi-line C++ comment block as a detailed description. Set this\n# tag to YES if you prefer the old behavior instead.\n#\n# Note that setting this tag to YES also means that rational rose comments are\n# not recognized any more.\n# The default value is: NO.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the\n# documentation from any documented member that it re-implements.\n# The default value is: YES.\n\nINHERIT_DOCS           = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new\n# page for each member. If set to NO, the documentation of a member will be part\n# of the file/class/namespace that contains it.\n# The default value is: NO.\n\nSEPARATE_MEMBER_PAGES  = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen\n# uses this value to replace tabs by spaces in code fragments.\n# Minimum value: 1, maximum value: 16, default value: 4.\n\nTAB_SIZE               = 4\n\n# This tag can be used to specify a number of aliases that act as commands in\n# the documentation. An alias has the form:\n# name=value\n# For example adding\n# \"sideeffect=@par Side Effects:\\n\"\n# will allow you to put the command \\sideeffect (or @sideeffect) in the\n# documentation, which will result in a user-defined paragraph with heading\n# \"Side Effects:\". You can put \\n's in the value part of an alias to insert\n# newlines.\n\nALIASES                = \n\n# This tag can be used to specify a number of word-keyword mappings (TCL only).\n# A mapping has the form \"name=value\". For example adding \"class=itcl::class\"\n# will allow you to use the command class in the itcl::class meaning.\n\nTCL_SUBST              = \n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources\n# only. Doxygen will then generate output that is more tailored for C. For\n# instance, some of the names that are used will be different. The list of all\n# members will be omitted, etc.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_FOR_C  = NO\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or\n# Python sources only. Doxygen will then generate output that is more tailored\n# for that language. For instance, namespaces will be presented as packages,\n# qualified scopes will look different, etc.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n# sources. Doxygen will then generate output that is tailored for Fortran.\n# The default value is: NO.\n\nOPTIMIZE_FOR_FORTRAN   = NO\n\n# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n# sources. Doxygen will then generate output that is tailored for VHDL.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_VHDL   = NO\n\n# Doxygen selects the parser to use depending on the extension of the files it\n# parses. With this tag you can assign which parser to use for a given\n# extension. Doxygen has a built-in mapping, but you can override or extend it\n# using this tag. The format is ext=language, where ext is a file extension, and\n# language is one of the parsers supported by doxygen: IDL, Java, Javascript,\n# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:\n# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:\n# Fortran. In the later case the parser tries to guess whether the code is fixed\n# or free formatted code, this is the default for Fortran type files), VHDL. For\n# instance to make doxygen treat .inc files as Fortran files (default is PHP),\n# and .f files as C (default is Fortran), use: inc=Fortran f=C.\n#\n# Note: For files without extension you can use no_extension as a placeholder.\n#\n# Note that for custom extensions you also need to set FILE_PATTERNS otherwise\n# the files are not read by doxygen.\n\nEXTENSION_MAPPING      = qml=C++\n\n# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments\n# according to the Markdown format, which allows for more readable\n# documentation. See http://daringfireball.net/projects/markdown/ for details.\n# The output of markdown processing is further processed by doxygen, so you can\n# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in\n# case of backward compatibilities issues.\n# The default value is: YES.\n\nMARKDOWN_SUPPORT       = YES\n\n# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up\n# to that level are automatically included in the table of contents, even if\n# they do not have an id attribute.\n# Note: This feature currently applies only to Markdown headings.\n# Minimum value: 0, maximum value: 99, default value: 0.\n# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.\n\nTOC_INCLUDE_HEADINGS   = 0\n\n# When enabled doxygen tries to link words that correspond to documented\n# classes, or namespaces to their corresponding documentation. Such a link can\n# be prevented in individual cases by putting a % sign in front of the word or\n# globally by setting AUTOLINK_SUPPORT to NO.\n# The default value is: YES.\n\nAUTOLINK_SUPPORT       = YES\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n# to include (a tag file for) the STL sources as input, then you should set this\n# tag to YES in order to let doxygen match functions declarations and\n# definitions whose arguments contain STL classes (e.g. func(std::string);\n# versus func(std::string) {}). This also make the inheritance and collaboration\n# diagrams that involve STL classes more complete and accurate.\n# The default value is: NO.\n\nBUILTIN_STL_SUPPORT    = NO\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n# The default value is: NO.\n\nCPP_CLI_SUPPORT        = NO\n\n# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:\n# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen\n# will parse them like normal C++ but will assume all classes use public instead\n# of private inheritance when no explicit protection keyword is present.\n# The default value is: NO.\n\nSIP_SUPPORT            = NO\n\n# For Microsoft's IDL there are propget and propput attributes to indicate\n# getter and setter methods for a property. Setting this option to YES will make\n# doxygen to replace the get and set methods by a property in the documentation.\n# This will only work if the methods are indeed getting or setting a simple\n# type. If this is not the case, or you want to show the methods anyway, you\n# should set this option to NO.\n# The default value is: YES.\n\nIDL_PROPERTY_SUPPORT   = YES\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n# tag is set to YES then doxygen will reuse the documentation of the first\n# member in the group (if any) for the other members of the group. By default\n# all members of a group must be documented explicitly.\n# The default value is: NO.\n\nDISTRIBUTE_GROUP_DOC   = NO\n\n# If one adds a struct or class to a group and this option is enabled, then also\n# any nested class or struct is added to the same group. By default this option\n# is disabled and one has to add nested compounds explicitly via \\ingroup.\n# The default value is: NO.\n\nGROUP_NESTED_COMPOUNDS = NO\n\n# Set the SUBGROUPING tag to YES to allow class member groups of the same type\n# (for instance a group of public functions) to be put as a subgroup of that\n# type (e.g. under the Public Functions section). Set it to NO to prevent\n# subgrouping. Alternatively, this can be done per class using the\n# \\nosubgrouping command.\n# The default value is: YES.\n\nSUBGROUPING            = YES\n\n# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions\n# are shown inside the group in which they are included (e.g. using \\ingroup)\n# instead of on a separate page (for HTML and Man pages) or section (for LaTeX\n# and RTF).\n#\n# Note that this feature does not work in combination with\n# SEPARATE_MEMBER_PAGES.\n# The default value is: NO.\n\nINLINE_GROUPED_CLASSES = NO\n\n# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions\n# with only public data fields or simple typedef fields will be shown inline in\n# the documentation of the scope in which they are defined (i.e. file,\n# namespace, or group documentation), provided this scope is documented. If set\n# to NO, structs, classes, and unions are shown on a separate page (for HTML and\n# Man pages) or section (for LaTeX and RTF).\n# The default value is: NO.\n\nINLINE_SIMPLE_STRUCTS  = NO\n\n# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or\n# enum is documented as struct, union, or enum with the name of the typedef. So\n# typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n# with name TypeT. When disabled the typedef will appear as a member of a file,\n# namespace, or class. And the struct will be named TypeS. This can typically be\n# useful for C code in case the coding convention dictates that all compound\n# types are typedef'ed and only the typedef is referenced, never the tag name.\n# The default value is: NO.\n\nTYPEDEF_HIDES_STRUCT   = NO\n\n# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This\n# cache is used to resolve symbols given their name and scope. Since this can be\n# an expensive process and often the same symbol appears multiple times in the\n# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small\n# doxygen will become slower. If the cache is too large, memory is wasted. The\n# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range\n# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536\n# symbols. At the end of a run doxygen will report the cache usage and suggest\n# the optimal cache size from a speed point of view.\n# Minimum value: 0, maximum value: 9, default value: 0.\n\nLOOKUP_CACHE_SIZE      = 0\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in\n# documentation are documented, even if no documentation was available. Private\n# class members and static file members will be hidden unless the\n# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.\n# Note: This will also disable the warnings about undocumented members that are\n# normally produced when WARNINGS is set to YES.\n# The default value is: NO.\n\nEXTRACT_ALL            = NO\n\n# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will\n# be included in the documentation.\n# The default value is: NO.\n\nEXTRACT_PRIVATE        = NO\n\n# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal\n# scope will be included in the documentation.\n# The default value is: NO.\n\nEXTRACT_PACKAGE        = NO\n\n# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be\n# included in the documentation.\n# The default value is: NO.\n\nEXTRACT_STATIC         = NO\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined\n# locally in source files will be included in the documentation. If set to NO,\n# only classes defined in header files are included. Does not have any effect\n# for Java sources.\n# The default value is: YES.\n\nEXTRACT_LOCAL_CLASSES  = NO\n\n# This flag is only useful for Objective-C code. If set to YES, local methods,\n# which are defined in the implementation section but not in the interface are\n# included in the documentation. If set to NO, only methods in the interface are\n# included.\n# The default value is: NO.\n\nEXTRACT_LOCAL_METHODS  = NO\n\n# If this flag is set to YES, the members of anonymous namespaces will be\n# extracted and appear in the documentation as a namespace called\n# 'anonymous_namespace{file}', where file will be replaced with the base name of\n# the file that contains the anonymous namespace. By default anonymous namespace\n# are hidden.\n# The default value is: NO.\n\nEXTRACT_ANON_NSPACES   = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all\n# undocumented members inside documented classes or files. If set to NO these\n# members will be included in the various overviews, but no documentation\n# section is generated. This option has no effect if EXTRACT_ALL is enabled.\n# The default value is: NO.\n\nHIDE_UNDOC_MEMBERS     = NO\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all\n# undocumented classes that are normally visible in the class hierarchy. If set\n# to NO, these classes will be included in the various overviews. This option\n# has no effect if EXTRACT_ALL is enabled.\n# The default value is: NO.\n\nHIDE_UNDOC_CLASSES     = NO\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend\n# (class|struct|union) declarations. If set to NO, these declarations will be\n# included in the documentation.\n# The default value is: NO.\n\nHIDE_FRIEND_COMPOUNDS  = NO\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any\n# documentation blocks found inside the body of a function. If set to NO, these\n# blocks will be appended to the function's detailed documentation block.\n# The default value is: NO.\n\nHIDE_IN_BODY_DOCS      = YES\n\n# The INTERNAL_DOCS tag determines if documentation that is typed after a\n# \\internal command is included. If the tag is set to NO then the documentation\n# will be excluded. Set it to YES to include the internal documentation.\n# The default value is: NO.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file\n# names in lower-case letters. If set to YES, upper-case letters are also\n# allowed. This is useful if you have classes or files whose names only differ\n# in case and if your file system supports case sensitive file names. Windows\n# and Mac users are advised to set this option to NO.\n# The default value is: system dependent.\n\nCASE_SENSE_NAMES       = NO\n\n# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with\n# their full class and namespace scopes in the documentation. If set to YES, the\n# scope will be hidden.\n# The default value is: NO.\n\nHIDE_SCOPE_NAMES       = NO\n\n# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will\n# append additional text to a page's title, such as Class Reference. If set to\n# YES the compound reference will be hidden.\n# The default value is: NO.\n\nHIDE_COMPOUND_REFERENCE= NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of\n# the files that are included by a file in the documentation of that file.\n# The default value is: YES.\n\nSHOW_INCLUDE_FILES     = YES\n\n# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each\n# grouped member an include statement to the documentation, telling the reader\n# which file to include in order to use the member.\n# The default value is: NO.\n\nSHOW_GROUPED_MEMB_INC  = NO\n\n# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include\n# files with double quotes in the documentation rather than with sharp brackets.\n# The default value is: NO.\n\nFORCE_LOCAL_INCLUDES   = NO\n\n# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the\n# documentation for inline members.\n# The default value is: YES.\n\nINLINE_INFO            = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the\n# (detailed) documentation of file and class members alphabetically by member\n# name. If set to NO, the members will appear in declaration order.\n# The default value is: YES.\n\nSORT_MEMBER_DOCS       = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief\n# descriptions of file, namespace and class members alphabetically by member\n# name. If set to NO, the members will appear in declaration order. Note that\n# this will also influence the order of the classes in the class list.\n# The default value is: NO.\n\nSORT_BRIEF_DOCS        = YES\n\n# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the\n# (brief and detailed) documentation of class members so that constructors and\n# destructors are listed first. If set to NO the constructors will appear in the\n# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.\n# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief\n# member documentation.\n# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting\n# detailed member documentation.\n# The default value is: NO.\n\nSORT_MEMBERS_CTORS_1ST = NO\n\n# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy\n# of group names into alphabetical order. If set to NO the group names will\n# appear in their defined order.\n# The default value is: NO.\n\nSORT_GROUP_NAMES       = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by\n# fully-qualified names, including namespaces. If set to NO, the class list will\n# be sorted only by class name, not including the namespace part.\n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the alphabetical\n# list.\n# The default value is: NO.\n\nSORT_BY_SCOPE_NAME     = NO\n\n# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper\n# type resolution of all parameters of a function it will reject a match between\n# the prototype and the implementation of a member function even if there is\n# only one candidate or it is obvious which candidate to choose by doing a\n# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still\n# accept a match between prototype and implementation in such cases.\n# The default value is: NO.\n\nSTRICT_PROTO_MATCHING  = NO\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo\n# list. This list is created by putting \\todo commands in the documentation.\n# The default value is: YES.\n\nGENERATE_TODOLIST      = YES\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test\n# list. This list is created by putting \\test commands in the documentation.\n# The default value is: YES.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug\n# list. This list is created by putting \\bug commands in the documentation.\n# The default value is: YES.\n\nGENERATE_BUGLIST       = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)\n# the deprecated list. This list is created by putting \\deprecated commands in\n# the documentation.\n# The default value is: YES.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional documentation\n# sections, marked by \\if <section_label> ... \\endif and \\cond <section_label>\n# ... \\endcond blocks.\n\nENABLED_SECTIONS       = \n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the\n# initial value of a variable or macro / define can have for it to appear in the\n# documentation. If the initializer consists of more lines than specified here\n# it will be hidden. Use a value of 0 to hide initializers completely. The\n# appearance of the value of individual variables and macros / defines can be\n# controlled using \\showinitializer or \\hideinitializer command in the\n# documentation regardless of this setting.\n# Minimum value: 0, maximum value: 10000, default value: 30.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at\n# the bottom of the documentation of classes and structs. If set to YES, the\n# list will mention the files that were used to generate the documentation.\n# The default value is: YES.\n\nSHOW_USED_FILES        = YES\n\n# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This\n# will remove the Files entry from the Quick Index and from the Folder Tree View\n# (if specified).\n# The default value is: YES.\n\nSHOW_FILES             = YES\n\n# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces\n# page. This will remove the Namespaces entry from the Quick Index and from the\n# Folder Tree View (if specified).\n# The default value is: YES.\n\nSHOW_NAMESPACES        = YES\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that\n# doxygen should invoke to get the current version for each file (typically from\n# the version control system). Doxygen will invoke the program by executing (via\n# popen()) the command command input-file, where command is the value of the\n# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided\n# by doxygen. Whatever the program writes to standard output is used as the file\n# version. For an example see the documentation.\n\nFILE_VERSION_FILTER    = \n\n# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n# by doxygen. The layout file controls the global structure of the generated\n# output files in an output format independent way. To create the layout file\n# that represents doxygen's defaults, run doxygen with the -l option. You can\n# optionally specify a file name after the option, if omitted DoxygenLayout.xml\n# will be used as the name of the layout file.\n#\n# Note that if you run doxygen from a directory containing a file called\n# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE\n# tag is left empty.\n\nLAYOUT_FILE            = \n\n# The CITE_BIB_FILES tag can be used to specify one or more bib files containing\n# the reference definitions. This must be a list of .bib files. The .bib\n# extension is automatically appended if omitted. This requires the bibtex tool\n# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.\n# For LaTeX the style of the bibliography can be controlled using\n# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the\n# search path. See also \\cite for info how to create references.\n\nCITE_BIB_FILES         = \n\n#---------------------------------------------------------------------------\n# Configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated to\n# standard output by doxygen. If QUIET is set to YES this implies that the\n# messages are off.\n# The default value is: NO.\n\nQUIET                  = NO\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are\n# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES\n# this implies that the warnings are on.\n#\n# Tip: Turn warnings on while writing the documentation.\n# The default value is: YES.\n\nWARNINGS               = NO\n\n# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate\n# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag\n# will automatically be disabled.\n# The default value is: YES.\n\nWARN_IF_UNDOCUMENTED   = NO\n\n# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for\n# potential errors in the documentation, such as not documenting some parameters\n# in a documented function, or documenting parameters that don't exist or using\n# markup commands wrongly.\n# The default value is: YES.\n\nWARN_IF_DOC_ERROR      = YES\n\n# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that\n# are documented, but have no documentation for their parameters or return\n# value. If set to NO, doxygen will only warn about wrong or incomplete\n# parameter documentation, but not about the absence of documentation.\n# The default value is: NO.\n\nWARN_NO_PARAMDOC       = NO\n\n# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when\n# a warning is encountered.\n# The default value is: NO.\n\nWARN_AS_ERROR          = NO\n\n# The WARN_FORMAT tag determines the format of the warning messages that doxygen\n# can produce. The string should contain the $file, $line, and $text tags, which\n# will be replaced by the file and line number from which the warning originated\n# and the warning text. Optionally the format may contain $version, which will\n# be replaced by the version of the file (if it could be obtained via\n# FILE_VERSION_FILTER)\n# The default value is: $file:$line: $text.\n\nWARN_FORMAT            = \"$file:$line: $text\"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning and error\n# messages should be written. If left blank the output is written to standard\n# error (stderr).\n\nWARN_LOGFILE           = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag is used to specify the files and/or directories that contain\n# documented source files. You may enter file names like myfile.cpp or\n# directories like /usr/src/myproject. Separate the files or directories with\n# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING\n# Note: If this tag is empty the current directory is searched.\n\nINPUT                  = /home/bardia/Projects/Aseman/Tools/QtAsemanTools/src/\n\n# This tag can be used to specify the character encoding of the source files\n# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses\n# libiconv (or the iconv built into libc) for the transcoding. See the libiconv\n# documentation (see: http://www.gnu.org/software/libiconv) for the list of\n# possible encodings.\n# The default value is: UTF-8.\n\nINPUT_ENCODING         = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the\n# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and\n# *.h) to filter out the source-files in the directories.\n#\n# Note that for custom extensions or not directly supported extensions you also\n# need to set EXTENSION_MAPPING for the extension otherwise the files are not\n# read by doxygen.\n#\n# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,\n# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,\n# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,\n# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,\n# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.\n\nFILE_PATTERNS          = *.cpp \\\n                         *.qml \\\n                         *.h\n\n# The RECURSIVE tag can be used to specify whether or not subdirectories should\n# be searched for input files as well.\n# The default value is: NO.\n\nRECURSIVE              = YES\n\n# The EXCLUDE tag can be used to specify files and/or directories that should be\n# excluded from the INPUT source files. This way you can easily exclude a\n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n#\n# Note that relative paths are relative to the directory from which doxygen is\n# run.\n\nEXCLUDE                = \n\n# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or\n# directories that are symbolic links (a Unix file system feature) are excluded\n# from the input.\n# The default value is: NO.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the\n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n# certain files from those directories.\n#\n# Note that the wildcards are matched against the file with absolute path, so to\n# exclude all test directories for example use the pattern */test/*\n\nEXCLUDE_PATTERNS       = \n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n# (namespaces, classes, functions, etc.) that should be excluded from the\n# output. The symbol name can be a fully qualified name, a word, or if the\n# wildcard * is used, a substring. Examples: ANamespace, AClass,\n# AClass::ANamespace, ANamespace::*Test\n#\n# Note that the wildcards are matched against the file with absolute path, so to\n# exclude all test directories use the pattern */test/*\n\nEXCLUDE_SYMBOLS        = AsemanQtToolsItem* \\\n                         JalaliCalendarObject \\\n                         AsemanQtTools \\\n                         AsemanSimpleQtCryptor::* \\\n                         Q* \\\n                         *Private\n\n# The EXAMPLE_PATH tag can be used to specify one or more files or directories\n# that contain example code fragments that are included (see the \\include\n# command).\n\nEXAMPLE_PATH           = \n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and\n# *.h) to filter out the source-files in the directories. If left blank all\n# files are included.\n\nEXAMPLE_PATTERNS       = *\n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n# searched for input files to be used with the \\include or \\dontinclude commands\n# irrespective of the value of the RECURSIVE tag.\n# The default value is: NO.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or directories\n# that contain images that are to be included in the documentation (see the\n# \\image command).\n\nIMAGE_PATH             = \n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should\n# invoke to filter for each input file. Doxygen will invoke the filter program\n# by executing (via popen()) the command:\n#\n# <filter> <input-file>\n#\n# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the\n# name of an input file. Doxygen will then use the output that the filter\n# program writes to standard output. If FILTER_PATTERNS is specified, this tag\n# will be ignored.\n#\n# Note that the filter must not add or remove lines; it is applied before the\n# code is scanned, but not when the output code is generated. If lines are added\n# or removed, the anchors will not be placed correctly.\n#\n# Note that for custom extensions or not directly supported extensions you also\n# need to set EXTENSION_MAPPING for the extension otherwise the files are not\n# properly processed by doxygen.\n\nINPUT_FILTER           = \n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n# basis. Doxygen will compare the file name with each pattern and apply the\n# filter if there is a match. The filters are a list of the form: pattern=filter\n# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how\n# filters are used. If the FILTER_PATTERNS tag is empty or if none of the\n# patterns match the file name, INPUT_FILTER is applied.\n#\n# Note that for custom extensions or not directly supported extensions you also\n# need to set EXTENSION_MAPPING for the extension otherwise the files are not\n# properly processed by doxygen.\n\nFILTER_PATTERNS        = *.qml=doxyqml\n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n# INPUT_FILTER) will also be used to filter the input files that are used for\n# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).\n# The default value is: NO.\n\nFILTER_SOURCE_FILES    = NO\n\n# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and\n# it is also possible to disable source filtering for a specific pattern using\n# *.ext= (so without naming a filter).\n# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.\n\nFILTER_SOURCE_PATTERNS = \n\n# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that\n# is part of the input, its contents will be placed on the main page\n# (index.html). This can be useful if you have a project on for instance GitHub\n# and want to reuse the introduction page also for the doxygen output.\n\nUSE_MDFILE_AS_MAINPAGE = \n\n#---------------------------------------------------------------------------\n# Configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will be\n# generated. Documented entities will be cross-referenced with these sources.\n#\n# Note: To get rid of all source code in the generated output, make sure that\n# also VERBATIM_HEADERS is set to NO.\n# The default value is: NO.\n\nSOURCE_BROWSER         = NO\n\n# Setting the INLINE_SOURCES tag to YES will include the body of functions,\n# classes and enums directly into the documentation.\n# The default value is: NO.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any\n# special comment blocks from generated source code fragments. Normal C, C++ and\n# Fortran comments will always remain visible.\n# The default value is: YES.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES then for each documented\n# function all documented functions referencing it will be listed.\n# The default value is: NO.\n\nREFERENCED_BY_RELATION = NO\n\n# If the REFERENCES_RELATION tag is set to YES then for each documented function\n# all documented entities called/used by that function will be listed.\n# The default value is: NO.\n\nREFERENCES_RELATION    = NO\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set\n# to YES then the hyperlinks from functions in REFERENCES_RELATION and\n# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will\n# link to the documentation.\n# The default value is: YES.\n\nREFERENCES_LINK_SOURCE = NO\n\n# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the\n# source code will show a tooltip with additional information such as prototype,\n# brief description and links to the definition and documentation. Since this\n# will make the HTML file larger and loading of large files a bit slower, you\n# can opt to disable this feature.\n# The default value is: YES.\n# This tag requires that the tag SOURCE_BROWSER is set to YES.\n\nSOURCE_TOOLTIPS        = YES\n\n# If the USE_HTAGS tag is set to YES then the references to source code will\n# point to the HTML generated by the htags(1) tool instead of doxygen built-in\n# source browser. The htags tool is part of GNU's global source tagging system\n# (see http://www.gnu.org/software/global/global.html). You will need version\n# 4.8.6 or higher.\n#\n# To use it do the following:\n# - Install the latest version of global\n# - Enable SOURCE_BROWSER and USE_HTAGS in the config file\n# - Make sure the INPUT points to the root of the source tree\n# - Run doxygen as normal\n#\n# Doxygen will invoke htags (and that will in turn invoke gtags), so these\n# tools must be available from the command line (i.e. in the search path).\n#\n# The result: instead of the source browser generated by doxygen, the links to\n# source code will now point to the output of htags.\n# The default value is: NO.\n# This tag requires that the tag SOURCE_BROWSER is set to YES.\n\nUSE_HTAGS              = NO\n\n# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a\n# verbatim copy of the header file for each class for which an include is\n# specified. Set to NO to disable this.\n# See also: Section \\class.\n# The default value is: YES.\n\nVERBATIM_HEADERS       = YES\n\n# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the\n# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the\n# cost of reduced performance. This can be particularly helpful with template\n# rich C++ code for which doxygen's built-in parser lacks the necessary type\n# information.\n# Note: The availability of this option depends on whether or not doxygen was\n# generated with the -Duse-libclang=ON option for CMake.\n# The default value is: NO.\n\nCLANG_ASSISTED_PARSING = NO\n\n# If clang assisted parsing is enabled you can provide the compiler with command\n# line options that you would normally use when invoking the compiler. Note that\n# the include paths will already be set by doxygen for the files and directories\n# specified with INPUT and INCLUDE_PATH.\n# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.\n\nCLANG_OPTIONS          = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all\n# compounds will be generated. Enable this if the project contains a lot of\n# classes, structs, unions or interfaces.\n# The default value is: YES.\n\nALPHABETICAL_INDEX     = YES\n\n# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in\n# which the alphabetical index list will be split.\n# Minimum value: 1, maximum value: 20, default value: 5.\n# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all classes will\n# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag\n# can be used to specify a prefix (or a list of prefixes) that should be ignored\n# while generating the index headers.\n# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.\n\nIGNORE_PREFIX          = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output\n# The default value is: YES.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: html.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_OUTPUT            = html\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each\n# generated HTML page (for example: .htm, .php, .asp).\n# The default value is: .html.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_FILE_EXTENSION    = .html\n\n# The HTML_HEADER tag can be used to specify a user-defined HTML header file for\n# each generated HTML page. If the tag is left blank doxygen will generate a\n# standard header.\n#\n# To get valid HTML the header file that includes any scripts and style sheets\n# that doxygen needs, which is dependent on the configuration options used (e.g.\n# the setting GENERATE_TREEVIEW). It is highly recommended to start with a\n# default header using\n# doxygen -w html new_header.html new_footer.html new_stylesheet.css\n# YourConfigFile\n# and then modify the file new_header.html. See also section \"Doxygen usage\"\n# for information on how to generate the default header that doxygen normally\n# uses.\n# Note: The header is subject to change so you typically have to regenerate the\n# default header when upgrading to a newer version of doxygen. For a description\n# of the possible markers and block names see the documentation.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_HEADER            = \n\n# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each\n# generated HTML page. If the tag is left blank doxygen will generate a standard\n# footer. See HTML_HEADER for more information on how to generate a default\n# footer and what special commands can be used inside the footer. See also\n# section \"Doxygen usage\" for information on how to generate the default footer\n# that doxygen normally uses.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_FOOTER            = \n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style\n# sheet that is used by each HTML page. It can be used to fine-tune the look of\n# the HTML output. If left blank doxygen will generate a default style sheet.\n# See also section \"Doxygen usage\" for information on how to generate the style\n# sheet that doxygen normally uses.\n# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as\n# it is more robust and this tag (HTML_STYLESHEET) will in the future become\n# obsolete.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_STYLESHEET        = \n\n# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined\n# cascading style sheets that are included after the standard style sheets\n# created by doxygen. Using this option one can overrule certain style aspects.\n# This is preferred over using HTML_STYLESHEET since it does not replace the\n# standard style sheet and is therefore more robust against future updates.\n# Doxygen will copy the style sheet files to the output directory.\n# Note: The order of the extra style sheet files is of importance (e.g. the last\n# style sheet in the list overrules the setting of the previous ones in the\n# list). For an example see the documentation.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_EXTRA_STYLESHEET  = \n\n# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the HTML output directory. Note\n# that these files will be copied to the base HTML output directory. Use the\n# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n# files. In the HTML_STYLESHEET file, use the file name only. Also note that the\n# files will be copied as-is; there are no commands or markers available.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_EXTRA_FILES       = \n\n# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen\n# will adjust the colors in the style sheet and background images according to\n# this color. Hue is specified as an angle on a colorwheel, see\n# http://en.wikipedia.org/wiki/Hue for more information. For instance the value\n# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300\n# purple, and 360 is red again.\n# Minimum value: 0, maximum value: 359, default value: 220.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_HUE    = 212\n\n# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors\n# in the HTML output. For a value of 0 the output will use grayscales only. A\n# value of 255 will produce the most vivid colors.\n# Minimum value: 0, maximum value: 255, default value: 100.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_SAT    = 120\n\n# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the\n# luminance component of the colors in the HTML output. Values below 100\n# gradually make the output lighter, whereas values above 100 make the output\n# darker. The value divided by 100 is the actual gamma applied, so 80 represents\n# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not\n# change the gamma.\n# Minimum value: 40, maximum value: 240, default value: 80.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_GAMMA  = 40\n\n# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n# page will contain the date and time when the page was generated. Setting this\n# to YES can help to show when doxygen was last run and thus if the\n# documentation is up to date.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_TIMESTAMP         = NO\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n# documentation will contain sections that can be hidden and shown after the\n# page has loaded.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_DYNAMIC_SECTIONS  = NO\n\n# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries\n# shown in the various tree structured indices initially; the user can expand\n# and collapse entries dynamically later on. Doxygen will expand the tree to\n# such a level that at most the specified number of entries are visible (unless\n# a fully collapsed tree already exceeds this amount). So setting the number of\n# entries 1 will produce a full collapsed tree by default. 0 is a special value\n# representing an infinite number of entries and will result in a full expanded\n# tree by default.\n# Minimum value: 0, maximum value: 9999, default value: 100.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_INDEX_NUM_ENTRIES = 100\n\n# If the GENERATE_DOCSET tag is set to YES, additional index files will be\n# generated that can be used as input for Apple's Xcode 3 integrated development\n# environment (see: http://developer.apple.com/tools/xcode/), introduced with\n# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a\n# Makefile in the HTML output directory. Running make will produce the docset in\n# that directory and running make install will install the docset in\n# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at\n# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html\n# for more information.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_DOCSET        = NO\n\n# This tag determines the name of the docset feed. A documentation feed provides\n# an umbrella under which multiple documentation sets from a single provider\n# (such as a company or product suite) can be grouped.\n# The default value is: Doxygen generated docs.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_FEEDNAME        = \"Doxygen generated docs\"\n\n# This tag specifies a string that should uniquely identify the documentation\n# set bundle. This should be a reverse domain-name style string, e.g.\n# com.mycompany.MyDocSet. Doxygen will append .docset to the name.\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_BUNDLE_ID       = org.doxygen.Project\n\n# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify\n# the documentation publisher. This should be a reverse domain-name style\n# string, e.g. com.mycompany.MyDocSet.documentation.\n# The default value is: org.doxygen.Publisher.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_PUBLISHER_ID    = org.doxygen.Publisher\n\n# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.\n# The default value is: Publisher.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_PUBLISHER_NAME  = Publisher\n\n# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three\n# additional HTML index files: index.hhp, index.hhc, and index.hhk. The\n# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop\n# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on\n# Windows.\n#\n# The HTML Help Workshop contains a compiler that can convert all HTML output\n# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML\n# files are now used as the Windows 98 help format, and will replace the old\n# Windows help format (.hlp) on all Windows platforms in the future. Compressed\n# HTML files also contain an index, a table of contents, and you can search for\n# words in the documentation. The HTML workshop also contains a viewer for\n# compressed HTML files.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_HTMLHELP      = NO\n\n# The CHM_FILE tag can be used to specify the file name of the resulting .chm\n# file. You can add a path in front of the file if the result should not be\n# written to the html output directory.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nCHM_FILE               = \n\n# The HHC_LOCATION tag can be used to specify the location (absolute path\n# including file name) of the HTML help compiler (hhc.exe). If non-empty,\n# doxygen will try to run the HTML help compiler on the generated index.hhp.\n# The file has to be specified with full path.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nHHC_LOCATION           = \n\n# The GENERATE_CHI flag controls if a separate .chi index file is generated\n# (YES) or that it should be included in the master .chm file (NO).\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nGENERATE_CHI           = NO\n\n# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)\n# and project file content.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nCHM_INDEX_ENCODING     = \n\n# The BINARY_TOC flag controls whether a binary table of contents is generated\n# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it\n# enables the Previous and Next buttons.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members to\n# the table of contents of the HTML help documentation and to the tree view.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nTOC_EXPAND             = NO\n\n# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that\n# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help\n# (.qch) of the generated HTML documentation.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_QHP           = NO\n\n# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify\n# the file name of the resulting .qch file. The path specified is relative to\n# the HTML output folder.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQCH_FILE               = \n\n# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help\n# Project output. For more information please see Qt Help Project / Namespace\n# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_NAMESPACE          = org.doxygen.Project\n\n# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt\n# Help Project output. For more information please see Qt Help Project / Virtual\n# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-\n# folders).\n# The default value is: doc.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_VIRTUAL_FOLDER     = doc\n\n# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom\n# filter to add. For more information please see Qt Help Project / Custom\n# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-\n# filters).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_CUST_FILTER_NAME   = \n\n# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the\n# custom filter to add. For more information please see Qt Help Project / Custom\n# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-\n# filters).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_CUST_FILTER_ATTRS  = \n\n# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n# project's filter section matches. Qt Help Project / Filter Attributes (see:\n# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_SECT_FILTER_ATTRS  = \n\n# The QHG_LOCATION tag can be used to specify the location of Qt's\n# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the\n# generated .qhp file.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHG_LOCATION           = \n\n# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be\n# generated, together with the HTML files, they form an Eclipse help plugin. To\n# install this plugin and make it available under the help contents menu in\n# Eclipse, the contents of the directory containing the HTML and XML files needs\n# to be copied into the plugins directory of eclipse. The name of the directory\n# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.\n# After copying Eclipse needs to be restarted before the help appears.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_ECLIPSEHELP   = NO\n\n# A unique identifier for the Eclipse help plugin. When installing the plugin\n# the directory name containing the HTML and XML files should also have this\n# name. Each documentation set should have its own identifier.\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.\n\nECLIPSE_DOC_ID         = org.doxygen.Project\n\n# If you want full control over the layout of the generated HTML pages it might\n# be necessary to disable the index and replace it with your own. The\n# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top\n# of each HTML page. A value of NO enables the index and the value YES disables\n# it. Since the tabs in the index contain the same information as the navigation\n# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nDISABLE_INDEX          = NO\n\n# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n# structure should be generated to display hierarchical information. If the tag\n# value is set to YES, a side panel will be generated containing a tree-like\n# index structure (just like the one that is generated for HTML Help). For this\n# to work a browser that supports JavaScript, DHTML, CSS and frames is required\n# (i.e. any modern browser). Windows users are probably better off using the\n# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can\n# further fine-tune the look of the index. As an example, the default style\n# sheet generated by doxygen has an example that shows how to put an image at\n# the root of the tree instead of the PROJECT_NAME. Since the tree basically has\n# the same information as the tab index, you could consider setting\n# DISABLE_INDEX to YES when enabling this option.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_TREEVIEW      = YES\n\n# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that\n# doxygen will group on one line in the generated HTML documentation.\n#\n# Note that a value of 0 will completely suppress the enum values from appearing\n# in the overview section.\n# Minimum value: 0, maximum value: 20, default value: 4.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nENUM_VALUES_PER_LINE   = 4\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used\n# to set the initial width (in pixels) of the frame in which the tree is shown.\n# Minimum value: 0, maximum value: 1500, default value: 250.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nTREEVIEW_WIDTH         = 250\n\n# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to\n# external symbols imported via tag files in a separate window.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nEXT_LINKS_IN_WINDOW    = NO\n\n# Use this tag to change the font size of LaTeX formulas included as images in\n# the HTML documentation. When you change the font size after a successful\n# doxygen run you need to manually remove any form_*.png images from the HTML\n# output directory to force them to be regenerated.\n# Minimum value: 8, maximum value: 50, default value: 10.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nFORMULA_FONTSIZE       = 10\n\n# Use the FORMULA_TRANPARENT tag to determine whether or not the images\n# generated for formulas are transparent PNGs. Transparent PNGs are not\n# supported properly for IE 6.0, but are supported on all modern browsers.\n#\n# Note that when changing this option you need to delete any form_*.png files in\n# the HTML output directory before the changes have effect.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nFORMULA_TRANSPARENT    = YES\n\n# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see\n# http://www.mathjax.org) which uses client side Javascript for the rendering\n# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX\n# installed or if you want to formulas look prettier in the HTML output. When\n# enabled you may also need to install MathJax separately and configure the path\n# to it using the MATHJAX_RELPATH option.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nUSE_MATHJAX            = NO\n\n# When MathJax is enabled you can set the default output format to be used for\n# the MathJax output. See the MathJax site (see:\n# http://docs.mathjax.org/en/latest/output.html) for more details.\n# Possible values are: HTML-CSS (which is slower, but has the best\n# compatibility), NativeMML (i.e. MathML) and SVG.\n# The default value is: HTML-CSS.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_FORMAT         = HTML-CSS\n\n# When MathJax is enabled you need to specify the location relative to the HTML\n# output directory using the MATHJAX_RELPATH option. The destination directory\n# should contain the MathJax.js script. For instance, if the mathjax directory\n# is located at the same level as the HTML output directory, then\n# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax\n# Content Delivery Network so you can quickly see the result without installing\n# MathJax. However, it is strongly recommended to install a local copy of\n# MathJax from http://www.mathjax.org before deployment.\n# The default value is: http://cdn.mathjax.org/mathjax/latest.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest\n\n# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax\n# extension names that should be enabled during MathJax rendering. For example\n# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_EXTENSIONS     = \n\n# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces\n# of code that will be used on startup of the MathJax code. See the MathJax site\n# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an\n# example see the documentation.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_CODEFILE       = \n\n# When the SEARCHENGINE tag is enabled doxygen will generate a search box for\n# the HTML output. The underlying search engine uses javascript and DHTML and\n# should work on any modern browser. Note that when using HTML help\n# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)\n# there is already a search function so this one should typically be disabled.\n# For large projects the javascript based search engine can be slow, then\n# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to\n# search using the keyboard; to jump to the search box use <access key> + S\n# (what the <access key> is depends on the OS and browser, but it is typically\n# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down\n# key> to jump into the search results window, the results can be navigated\n# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel\n# the search. The filter options can be selected when the cursor is inside the\n# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>\n# to select a filter and <Enter> or <escape> to activate or cancel the filter\n# option.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nSEARCHENGINE           = YES\n\n# When the SERVER_BASED_SEARCH tag is enabled the search engine will be\n# implemented using a web server instead of a web client using Javascript. There\n# are two flavors of web server based searching depending on the EXTERNAL_SEARCH\n# setting. When disabled, doxygen will generate a PHP script for searching and\n# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing\n# and searching needs to be provided by external tools. See the section\n# \"External Indexing and Searching\" for details.\n# The default value is: NO.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nSERVER_BASED_SEARCH    = NO\n\n# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP\n# script for searching. Instead the search results are written to an XML file\n# which needs to be processed by an external indexer. Doxygen will invoke an\n# external search engine pointed to by the SEARCHENGINE_URL option to obtain the\n# search results.\n#\n# Doxygen ships with an example indexer (doxyindexer) and search engine\n# (doxysearch.cgi) which are based on the open source search engine library\n# Xapian (see: http://xapian.org/).\n#\n# See the section \"External Indexing and Searching\" for details.\n# The default value is: NO.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nEXTERNAL_SEARCH        = NO\n\n# The SEARCHENGINE_URL should point to a search engine hosted by a web server\n# which will return the search results when EXTERNAL_SEARCH is enabled.\n#\n# Doxygen ships with an example indexer (doxyindexer) and search engine\n# (doxysearch.cgi) which are based on the open source search engine library\n# Xapian (see: http://xapian.org/). See the section \"External Indexing and\n# Searching\" for details.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nSEARCHENGINE_URL       = \n\n# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed\n# search data is written to a file for indexing by an external tool. With the\n# SEARCHDATA_FILE tag the name of this file can be specified.\n# The default file is: searchdata.xml.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nSEARCHDATA_FILE        = searchdata.xml\n\n# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the\n# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is\n# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple\n# projects and redirect the results back to the right project.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nEXTERNAL_SEARCH_ID     = \n\n# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen\n# projects other than the one defined by this configuration file, but that are\n# all added to the same external search index. Each project needs to have a\n# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of\n# to a relative location where the documentation can be found. The format is:\n# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nEXTRA_SEARCH_MAPPINGS  = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.\n# The default value is: YES.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: latex.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_OUTPUT           = latex\n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\n# invoked.\n#\n# Note that when enabling USE_PDFLATEX this option is only used for generating\n# bitmaps for formulas in the HTML output, but not in the Makefile that is\n# written to the output directory.\n# The default file is: latex.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_CMD_NAME         = latex\n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate\n# index for LaTeX.\n# The default file is: makeindex.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nMAKEINDEX_CMD_NAME     = makeindex\n\n# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX\n# documents. This may be useful for small projects and may help to save some\n# trees in general.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used by the\n# printer.\n# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x\n# 14 inches) and executive (7.25 x 10.5 inches).\n# The default value is: a4.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nPAPER_TYPE             = a4\n\n# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names\n# that should be included in the LaTeX output. The package can be specified just\n# by its name or with the correct syntax as to be used with the LaTeX\n# \\usepackage command. To get the times font for instance you can specify :\n# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}\n# To use the option intlimits with the amsmath package you can specify:\n# EXTRA_PACKAGES=[intlimits]{amsmath}\n# If left blank no extra packages will be included.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nEXTRA_PACKAGES         = \n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the\n# generated LaTeX document. The header should contain everything until the first\n# chapter. If it is left blank doxygen will generate a standard header. See\n# section \"Doxygen usage\" for information on how to let doxygen write the\n# default header to a separate file.\n#\n# Note: Only use a user-defined header if you know what you are doing! The\n# following commands have a special meaning inside the header: $title,\n# $datetime, $date, $doxygenversion, $projectname, $projectnumber,\n# $projectbrief, $projectlogo. Doxygen will replace $title with the empty\n# string, for the replacement values of the other commands the user is referred\n# to HTML_HEADER.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_HEADER           = \n\n# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the\n# generated LaTeX document. The footer should contain everything after the last\n# chapter. If it is left blank doxygen will generate a standard footer. See\n# LATEX_HEADER for more information on how to generate a default footer and what\n# special commands can be used inside the footer.\n#\n# Note: Only use a user-defined footer if you know what you are doing!\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_FOOTER           = \n\n# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined\n# LaTeX style sheets that are included after the standard style sheets created\n# by doxygen. Using this option one can overrule certain style aspects. Doxygen\n# will copy the style sheet files to the output directory.\n# Note: The order of the extra style sheet files is of importance (e.g. the last\n# style sheet in the list overrules the setting of the previous ones in the\n# list).\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_EXTRA_STYLESHEET = \n\n# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the LATEX_OUTPUT output\n# directory. Note that the files will be copied as-is; there are no commands or\n# markers available.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_EXTRA_FILES      = \n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is\n# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will\n# contain links (just like the HTML output) instead of page references. This\n# makes the output suitable for online browsing using a PDF viewer.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nPDF_HYPERLINKS         = YES\n\n# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate\n# the PDF file directly from the LaTeX files. Set this option to YES, to get a\n# higher quality PDF documentation.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nUSE_PDFLATEX           = YES\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode\n# command to the generated LaTeX files. This will instruct LaTeX to keep running\n# if errors occur, instead of asking the user for help. This option is also used\n# when generating formulas in HTML.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_BATCHMODE        = NO\n\n# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the\n# index chapters (such as File Index, Compound Index, etc.) in the output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_HIDE_INDICES     = NO\n\n# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source\n# code with syntax highlighting in the LaTeX output.\n#\n# Note that which sources are shown also depends on other settings such as\n# SOURCE_BROWSER.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_SOURCE_CODE      = NO\n\n# The LATEX_BIB_STYLE tag can be used to specify the style to use for the\n# bibliography, e.g. plainnat, or ieeetr. See\n# http://en.wikipedia.org/wiki/BibTeX and \\cite for more info.\n# The default value is: plain.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_BIB_STYLE        = plain\n\n# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated\n# page will contain the date and time when the page was generated. Setting this\n# to NO can help when comparing the output of multiple runs.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_TIMESTAMP        = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The\n# RTF output is optimized for Word 97 and may not look too pretty with other RTF\n# readers/editors.\n# The default value is: NO.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: rtf.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_OUTPUT             = rtf\n\n# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF\n# documents. This may be useful for small projects and may help to save some\n# trees in general.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will\n# contain hyperlink fields. The RTF file will contain links (just like the HTML\n# output) instead of page references. This makes the output suitable for online\n# browsing using Word or some other Word compatible readers that support those\n# fields.\n#\n# Note: WordPad (write) and others do not support links.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_HYPERLINKS         = NO\n\n# Load stylesheet definitions from file. Syntax is similar to doxygen's config\n# file, i.e. a series of assignments. You only have to provide replacements,\n# missing definitions are set to their default value.\n#\n# See also section \"Doxygen usage\" for information on how to generate the\n# default style sheet that doxygen normally uses.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_STYLESHEET_FILE    = \n\n# Set optional variables used in the generation of an RTF document. Syntax is\n# similar to doxygen's config file. A template extensions file can be generated\n# using doxygen -e rtf extensionFile.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_EXTENSIONS_FILE    = \n\n# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code\n# with syntax highlighting in the RTF output.\n#\n# Note that which sources are shown also depends on other settings such as\n# SOURCE_BROWSER.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_SOURCE_CODE        = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for\n# classes and files.\n# The default value is: NO.\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it. A directory man3 will be created inside the directory specified by\n# MAN_OUTPUT.\n# The default directory is: man.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to the generated\n# man pages. In case the manual section does not start with a number, the number\n# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is\n# optional.\n# The default value is: .3.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_EXTENSION          = .3\n\n# The MAN_SUBDIR tag determines the name of the directory created within\n# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by\n# MAN_EXTENSION with the initial . removed.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_SUBDIR             = \n\n# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it\n# will generate one additional man file for each entity documented in the real\n# man page(s). These additional files only source the real man page, but without\n# them the man command would be unable to find the correct page.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that\n# captures the structure of the code including all documentation.\n# The default value is: NO.\n\nGENERATE_XML           = NO\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: xml.\n# This tag requires that the tag GENERATE_XML is set to YES.\n\nXML_OUTPUT             = xml\n\n# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program\n# listings (including syntax highlighting and cross-referencing information) to\n# the XML output. Note that enabling this will significantly increase the size\n# of the XML output.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_XML is set to YES.\n\nXML_PROGRAMLISTING     = YES\n\n#---------------------------------------------------------------------------\n# Configuration options related to the DOCBOOK output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files\n# that can be used to generate PDF.\n# The default value is: NO.\n\nGENERATE_DOCBOOK       = NO\n\n# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in\n# front of it.\n# The default directory is: docbook.\n# This tag requires that the tag GENERATE_DOCBOOK is set to YES.\n\nDOCBOOK_OUTPUT         = docbook\n\n# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the\n# program listings (including syntax highlighting and cross-referencing\n# information) to the DOCBOOK output. Note that enabling this will significantly\n# increase the size of the DOCBOOK output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_DOCBOOK is set to YES.\n\nDOCBOOK_PROGRAMLISTING = NO\n\n#---------------------------------------------------------------------------\n# Configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an\n# AutoGen Definitions (see http://autogen.sf.net) file that captures the\n# structure of the code including all documentation. Note that this feature is\n# still experimental and incomplete at the moment.\n# The default value is: NO.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module\n# file that captures the structure of the code including all documentation.\n#\n# Note that this feature is still experimental and incomplete at the moment.\n# The default value is: NO.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary\n# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI\n# output from the Perl module output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_PERLMOD is set to YES.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely\n# formatted so it can be parsed by a human reader. This is useful if you want to\n# understand what is going on. On the other hand, if this tag is set to NO, the\n# size of the Perl module output will be much smaller and Perl will parse it\n# just the same.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_PERLMOD is set to YES.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file are\n# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful\n# so different doxyrules.make files included by the same Makefile don't\n# overwrite each other's variables.\n# This tag requires that the tag GENERATE_PERLMOD is set to YES.\n\nPERLMOD_MAKEVAR_PREFIX = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor\n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all\n# C-preprocessor directives found in the sources and include files.\n# The default value is: YES.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names\n# in the source code. If set to NO, only conditional compilation will be\n# performed. Macro expansion can be done in a controlled way by setting\n# EXPAND_ONLY_PREDEF to YES.\n# The default value is: NO.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nMACRO_EXPANSION        = NO\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then\n# the macro expansion is limited to the macros specified with the PREDEFINED and\n# EXPAND_AS_DEFINED tags.\n# The default value is: NO.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nEXPAND_ONLY_PREDEF     = NO\n\n# If the SEARCH_INCLUDES tag is set to YES, the include files in the\n# INCLUDE_PATH will be searched if a #include is found.\n# The default value is: YES.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that\n# contain include files that are not input files but should be processed by the\n# preprocessor.\n# This tag requires that the tag SEARCH_INCLUDES is set to YES.\n\nINCLUDE_PATH           = \n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n# patterns (like *.h and *.hpp) to filter out the header-files in the\n# directories. If left blank, the patterns specified with FILE_PATTERNS will be\n# used.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nINCLUDE_FILE_PATTERNS  = \n\n# The PREDEFINED tag can be used to specify one or more macro names that are\n# defined before the preprocessor is started (similar to the -D option of e.g.\n# gcc). The argument of the tag is a list of macros of the form: name or\n# name=definition (no spaces). If the definition and the \"=\" are omitted, \"=1\"\n# is assumed. To prevent a macro definition from being undefined via #undef or\n# recursively expanded use the := operator instead of the = operator.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nPREDEFINED             = ASEMAN_OXYGEN_SKIP\n\n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this\n# tag can be used to specify a list of macro names that should be expanded. The\n# macro definition that is found in the sources will be used. Use the PREDEFINED\n# tag if you want to use a different macro definition that overrules the\n# definition found in the source code.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nEXPAND_AS_DEFINED      = \n\n# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will\n# remove all references to function-like macros that are alone on a line, have\n# an all uppercase name, and do not end with a semicolon. Such function macros\n# are typically used for boiler-plate code, and will confuse the parser if not\n# removed.\n# The default value is: YES.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nSKIP_FUNCTION_MACROS   = YES\n\n#---------------------------------------------------------------------------\n# Configuration options related to external references\n#---------------------------------------------------------------------------\n\n# The TAGFILES tag can be used to specify one or more tag files. For each tag\n# file the location of the external documentation should be added. The format of\n# a tag file without this location is as follows:\n# TAGFILES = file1 file2 ...\n# Adding location for the tag files is done as follows:\n# TAGFILES = file1=loc1 \"file2 = loc2\" ...\n# where loc1 and loc2 can be relative or absolute paths or URLs. See the\n# section \"Linking to external documentation\" for more information about the use\n# of tag files.\n# Note: Each tag file must have a unique name (where the name does NOT include\n# the path). If a tag file is not located in the directory in which doxygen is\n# run, you must also specify the path to the tagfile here.\n\nTAGFILES               = \n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create a\n# tag file that is based on the input files it reads. See section \"Linking to\n# external documentation\" for more information about the usage of tag files.\n\nGENERATE_TAGFILE       = \n\n# If the ALLEXTERNALS tag is set to YES, all external class will be listed in\n# the class index. If set to NO, only the inherited external classes will be\n# listed.\n# The default value is: NO.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed\n# in the modules index. If set to NO, only the current project's groups will be\n# listed.\n# The default value is: YES.\n\nEXTERNAL_GROUPS        = YES\n\n# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in\n# the related pages index. If set to NO, only the current project's pages will\n# be listed.\n# The default value is: YES.\n\nEXTERNAL_PAGES         = YES\n\n# The PERL_PATH should be the absolute path and name of the perl script\n# interpreter (i.e. the result of 'which perl').\n# The default file (with absolute path) is: /usr/bin/perl.\n\nPERL_PATH              = /usr/bin/perl\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool\n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram\n# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to\n# NO turns the diagrams off. Note that this option also works with HAVE_DOT\n# disabled, but it is recommended to install and use dot, since it yields more\n# powerful graphs.\n# The default value is: YES.\n\nCLASS_DIAGRAMS         = YES\n\n# You can define message sequence charts within doxygen comments using the \\msc\n# command. Doxygen will then run the mscgen tool (see:\n# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the\n# documentation. The MSCGEN_PATH tag allows you to specify the directory where\n# the mscgen tool resides. If left empty the tool is assumed to be found in the\n# default search path.\n\nMSCGEN_PATH            = \n\n# You can include diagrams made with dia in doxygen documentation. Doxygen will\n# then run dia to produce the diagram and insert it in the documentation. The\n# DIA_PATH tag allows you to specify the directory where the dia binary resides.\n# If left empty dia is assumed to be found in the default search path.\n\nDIA_PATH               = /usr/bin/\n\n# If set to YES the inheritance and collaboration graphs will hide inheritance\n# and usage relations if the target is undocumented or is not a class.\n# The default value is: YES.\n\nHIDE_UNDOC_RELATIONS   = YES\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n# available from the path. This tool is part of Graphviz (see:\n# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent\n# Bell Labs. The other options in this section have no effect if this option is\n# set to NO\n# The default value is: YES.\n\nHAVE_DOT               = YES\n\n# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed\n# to run in parallel. When set to 0 doxygen will base this on the number of\n# processors available in the system. You can set it explicitly to a value\n# larger than 0 to get control over the balance between CPU load and processing\n# speed.\n# Minimum value: 0, maximum value: 32, default value: 0.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_NUM_THREADS        = 0\n\n# When you want a differently looking font in the dot files that doxygen\n# generates you can specify the font name using DOT_FONTNAME. You need to make\n# sure dot is able to find the font, which can be done by putting it in a\n# standard location or by setting the DOTFONTPATH environment variable or by\n# setting DOT_FONTPATH to the directory containing the font.\n# The default value is: Helvetica.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_FONTNAME           = Ubuntu\n\n# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of\n# dot graphs.\n# Minimum value: 4, maximum value: 24, default value: 10.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_FONTSIZE           = 10\n\n# By default doxygen will tell dot to use the default font as specified with\n# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set\n# the path where dot can find it using this tag.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_FONTPATH           = \n\n# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for\n# each documented class showing the direct and indirect inheritance relations.\n# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a\n# graph for each documented class showing the direct and indirect implementation\n# dependencies (inheritance, containment, and class references variables) of the\n# class with other documented classes.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCOLLABORATION_GRAPH    = YES\n\n# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for\n# groups, showing the direct groups dependencies.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nGROUP_GRAPHS           = NO\n\n# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and\n# collaboration diagrams in a style similar to the OMG's Unified Modeling\n# Language.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nUML_LOOK               = NO\n\n# If the UML_LOOK tag is enabled, the fields and methods are shown inside the\n# class node. If there are many fields or methods and many nodes the graph may\n# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the\n# number of items for each type to make the size more manageable. Set this to 0\n# for no limit. Note that the threshold may be exceeded by 50% before the limit\n# is enforced. So when you set the threshold to 10, up to 15 fields may appear,\n# but if the number exceeds 15, the total amount of fields shown is limited to\n# 10.\n# Minimum value: 0, maximum value: 100, default value: 10.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nUML_LIMIT_NUM_FIELDS   = 10\n\n# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and\n# collaboration graphs will show the relations between templates and their\n# instances.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nTEMPLATE_RELATIONS     = NO\n\n# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to\n# YES then doxygen will generate a graph for each documented file showing the\n# direct and indirect include dependencies of the file with other documented\n# files.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nINCLUDE_GRAPH          = YES\n\n# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are\n# set to YES then doxygen will generate a graph for each documented file showing\n# the direct and indirect include dependencies of the file with other documented\n# files.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nINCLUDED_BY_GRAPH      = NO\n\n# If the CALL_GRAPH tag is set to YES then doxygen will generate a call\n# dependency graph for every global function or class method.\n#\n# Note that enabling this option will significantly increase the time of a run.\n# So in most cases it will be better to enable call graphs for selected\n# functions only using the \\callgraph command. Disabling a call graph can be\n# accomplished by means of the command \\hidecallgraph.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCALL_GRAPH             = NO\n\n# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller\n# dependency graph for every global function or class method.\n#\n# Note that enabling this option will significantly increase the time of a run.\n# So in most cases it will be better to enable caller graphs for selected\n# functions only using the \\callergraph command. Disabling a caller graph can be\n# accomplished by means of the command \\hidecallergraph.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCALLER_GRAPH           = NO\n\n# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical\n# hierarchy of all classes instead of a textual one.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nGRAPHICAL_HIERARCHY    = YES\n\n# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the\n# dependencies a directory has on other directories in a graphical way. The\n# dependency relations are determined by the #include relations between the\n# files in the directories.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDIRECTORY_GRAPH        = YES\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n# generated by dot. For an explanation of the image formats see the section\n# output formats in the documentation of the dot tool (Graphviz (see:\n# http://www.graphviz.org/)).\n# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order\n# to make the SVG files visible in IE 9+ (other browsers do not have this\n# requirement).\n# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,\n# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,\n# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo,\n# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and\n# png:gdiplus:gdiplus.\n# The default value is: png.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_IMAGE_FORMAT       = png\n\n# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to\n# enable generation of interactive SVG images that allow zooming and panning.\n#\n# Note that this requires a modern browser other than Internet Explorer. Tested\n# and working are Firefox, Chrome, Safari, and Opera.\n# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make\n# the SVG files visible. Older versions of IE do not have SVG support.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nINTERACTIVE_SVG        = NO\n\n# The DOT_PATH tag can be used to specify the path where the dot tool can be\n# found. If left blank, it is assumed the dot tool can be found in the path.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_PATH               = \n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that\n# contain dot files that are included in the documentation (see the \\dotfile\n# command).\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOTFILE_DIRS           = \n\n# The MSCFILE_DIRS tag can be used to specify one or more directories that\n# contain msc files that are included in the documentation (see the \\mscfile\n# command).\n\nMSCFILE_DIRS           = \n\n# The DIAFILE_DIRS tag can be used to specify one or more directories that\n# contain dia files that are included in the documentation (see the \\diafile\n# command).\n\nDIAFILE_DIRS           = \n\n# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the\n# path where java can find the plantuml.jar file. If left blank, it is assumed\n# PlantUML is not used or called during a preprocessing step. Doxygen will\n# generate a warning when it encounters a \\startuml command in this case and\n# will not generate output for the diagram.\n\nPLANTUML_JAR_PATH      = \n\n# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a\n# configuration file for plantuml.\n\nPLANTUML_CFG_FILE      = \n\n# When using plantuml, the specified paths are searched for files specified by\n# the !include statement in a plantuml block.\n\nPLANTUML_INCLUDE_PATH  = \n\n# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes\n# that will be shown in the graph. If the number of nodes in a graph becomes\n# larger than this value, doxygen will truncate the graph, which is visualized\n# by representing a node as a red box. Note that doxygen if the number of direct\n# children of the root node in a graph is already larger than\n# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that\n# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n# Minimum value: 0, maximum value: 10000, default value: 50.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_GRAPH_MAX_NODES    = 50\n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs\n# generated by dot. A depth value of 3 means that only nodes reachable from the\n# root by following a path via at most 3 edges will be shown. Nodes that lay\n# further from the root node will be omitted. Note that setting this option to 1\n# or 2 may greatly reduce the computation time needed for large code bases. Also\n# note that the size of a graph can be further restricted by\n# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n# Minimum value: 0, maximum value: 1000, default value: 0.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nMAX_DOT_GRAPH_DEPTH    = 0\n\n# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\n# background. This is disabled by default, because dot on Windows does not seem\n# to support this out of the box.\n#\n# Warning: Depending on the platform used, enabling this option may lead to\n# badly anti-aliased labels on the edges of a graph (i.e. they become hard to\n# read).\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_TRANSPARENT        = YES\n\n# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output\n# files in one run (i.e. multiple -o and -T options on the command line). This\n# makes dot run faster, but since only newer versions of dot (>1.8.10) support\n# this, this feature is disabled by default.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_MULTI_TARGETS      = NO\n\n# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page\n# explaining the meaning of the various boxes and arrows in the dot generated\n# graphs.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot\n# files that are used to generate the various graphs.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_CLEANUP            = YES\n"
  },
  {
    "path": "examples/examples.pro",
    "content": "TEMPLATE = subdirs\n"
  },
  {
    "path": "index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\t<!--begin::Head-->\n\t<head>\n\t\t<title>QtAseman</title>\n\t\t<meta charset=\"utf-8\" />\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\t\t<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/css/bootstrap.min.css\" integrity=\"sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T\" crossorigin=\"anonymous\">\n\t</head>\n\t<!--end::Head-->\n\t<!--begin::Body-->\n\t<body>\n\t\t<div class=\"container p-3\">\n\t\t\t<h1 class=\"pt-4\">Qt Aseman</h1>\n\t\t\t<p class=\"pt-4\" style=\"line-height: 1.75em;\">QtAseman is set of tools, design patterns and architectures that we have developed over the years in various projects for wide range of uses. Now, with it's proven stability, we have decided to release this collection with the name QtAseman as an Open Source and Free tools under the LGPLv3 license.</p>\n\t\t\t<div class=\"text-center\">\n\t\t\t\t<div class=\"p-4\"><a href=\"https://github.com/Aseman-Land/QtAseman\" target=\"_blank\" class=\"m-4\"><button class=\"btn btn-dark\">Github</button></a></div>\n\t\t\t\t<div class=\"pt-4\">\n\t\t\t\t\t<hr class=\"p-4 mt-4\">\n\t\t\t\t\t<h3>Help us to keep QtAseman up to date and stable</h3>\n\t\t\t\t\t<p class=\"mt-4 mb-0 btn btn-warning\">BTC</p>\n\t\t\t\t\t<div class=\"text-center\">\n\t\t\t\t\t\t<img src=\"qtaseman_donation.png\" style=\"width: 200px; min-width: 200px;\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<p class=\"btn btn-outline-dark\">bc1q5dg9cw3ztqswgys4ugqx6pj2u573ma92ylsnqk</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</body>\n\t<!--end::Body-->\n\t<script src=\"https://code.jquery.com/jquery-3.3.1.slim.min.js\" integrity=\"sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo\" crossorigin=\"anonymous\"></script>\n\t<script src=\"https://cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js\" integrity=\"sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1\" crossorigin=\"anonymous\"></script>\n\t<script src=\"https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js\" integrity=\"sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM\" crossorigin=\"anonymous\"></script>\n</html>"
  },
  {
    "path": "marketplace/manifest.json",
    "content": "{\n    \"$schema\": \"http://qt.io/schema/extension-schema-v1#\",\n    \"title\": \"Qt Aseman\",\n    \"extensionType\": [\n        \"library\"\n    ],\n    \"version\": \"3.0.0\",\n    \"vendor\": {\n        \"name\": \"Aseman\",\n        \"url\": \"https://aseman.io\"\n    },\n    \"contact\": \"Aseman <asemanland@gmail.com>\",\n    \"copyright\": [ \"Aseman.io\" ],\n    \"author\": \"Bardia Daneshvar\",\n    \"icon\": \"https://aseman.io/projects/qtaseman/aseman-qt.png\",\n    \"licenses\": [\n      { \"licenseType\": \"LGPLv3\",\n        \"licenseUrl\": \"https://www.gnu.org/licenses/lgpl-3.0.html\" }\n    ],\n    \"created\": \"2020-04-18\",\n    \"lastUpdate\": \"2020-04-18\",\n    \"platforms\": [\n        \"macOS 10.14 or newer\", \"Android 5.0 or newer\", \"iOS 13.1\", \"Ubuntu 18.04 or newer\", \"Windows 7 or newer\", \"Linux\" \n    ],\n    \"architectures\": [\n        \"x86\", \"armv7\", \"armv8\", \"x86_64\"\n    ],\n    \"qtVersions\": [\n        \"5.9.0  or newer\"\n    ],\n    \"tags\": [\n        \"Tools\" ],\n    \"price\": {\n        \"listprice\": 0\n    },\n    \"sourceRepoUrl\": \"https://github.com/Aseman-Land/QtAseman\",\n    \"binaryRepoUrl\": \"https://launchpad.net/~aseman/+archive/ubuntu/qt-modules\",\n    \"userManuals\": [\n        \"https://github.com/Aseman-Land/QtAseman/blob/master/README.md\",\n        \"https://github.com/Aseman-Land/QtAseman/blob/master/documents/AsemanQml.Base.md\"\n    ],\n    \"dependencies\": [\n        \"Quick\"\n    ]\n}\n"
  },
  {
    "path": "marketplace/marketplace.md",
    "content": "# Qt Aseman\n<img src=\"https://aseman.io/projects/qtaseman/aseman-qt.png\" align=\"left\" />\n\n## What is QtAseman\n\nQtAseman is a set of tools, design patterns and architectures that we have developed over the years in various projects for wide range of uses. Now, with it's proven stability, we have decided to release this collection with the name QtAseman as an Open Source and Free tool under the LGPLv3 license.\n\n![Snapshot](https://aseman.io/projects/qtaseman/snapshot.png)\n\nIt works on Linux, OSX, Windows, Android and iOS and depended only on Qt.\n\nOne of the main assets of QtAseman is that you can add it to your project without any extra change to the standard structure of the default QML app.\n\nThere are many modules and components in QtAseman that will help you create applications without use of any extra C++ code.\nAlso QtAseman offers a great software architecture for each module that makes development much more easier and faster.\n\n[MORE INFORMATION](https://github.com/Aseman-Land/QtAseman)\n\nSome main features to use on QML are:\n\n- Viewport tools that provides unique page manager system (page, popup, stack, dialog and ...)\n- Gestures for viewports \n- Transparent statusbar and optional navigation bar on mobile devices\n- Some extra Qml controls components like Drawer, Header, TextField, CircularProgressBar and ...\n- BackHandler system\n- Font awesome and Material icons fonts\n- VideoPlayer component\n- Some graphical components like shadows for easy to use and better experiance\n- Network and Http Request handler\n\n- Models and Abstract models with better experience\n- Encrypt/Decrypt tools\n- Qt/C++ Like Hash, Map and List objects\n- Tools to get more device infos like deviceId, density, keyboard height, statusBar height and ...\n- Translation manager tools\n- Settings manager\n- Some other tools like file read/write methods, type convert methods and ...\n- Process executer tools from QML\n\n## How to Install\n\nCurrently binary packages only available on the ubuntu (launchpad) repositories. To install it on the ubuntu 20.04 LTS:QAseman Core modules\n\nSome models and abstract models with better experiance\n\nEncrypt algorithms tools\n\n```bash\nsudo add-apt-repository ppa:aseman/qt-modules\nsudo apt install qt5aseman\n```\n\nand to install development files install `qt5aseman-dev` package.\n\n## How to build\n\nQtAseman uses standard Qt module mechanisms and it only depends on Qt libraries. Therefor it's quite easy to build on all platforms. Just clone it and build it easily:\n\n```bash\ngit clone https://github.com/Aseman-Land/QtAseman.git\ncd QtAseman\nmkdir build && cd build\nqmake -r ..\nmake -j2\nmake install\n```\n\nThe easiest way to build is to open it using QtCreator and click on the build icon :)\nAfterwards just run `make install` command to install it in the Qt location."
  },
  {
    "path": "src/CMakeLists.txt",
    "content": "\nadd_compile_definitions(QT_ASEMAN_EMBEDDED)\n\nif (${QT_VERSION_MAJOR} GREATER_EQUAL 6)\n    SET(ASEMAN_COMPILE_DEFINITION ${ASEMAN_COMPILE_DEFINITION} ASEMAN_QT6)\nendif ()\n\nif (QT_ASEMAN_MODULES_CORE)\n    add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/core)\nendif ()\nif (QT_ASEMAN_MODULES_GUI)\n    add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/gui)\nendif ()\nif (QT_ASEMAN_MODULES_WIDGETS)\n    add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/widgets)\nendif ()\nif (QT_ASEMAN_MODULES_NETWORK)\n    add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/network)\nendif ()\nif (QT_ASEMAN_MODULES_QML)\n    add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/qml)\n    add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/asemanqml)\nendif ()\nif (QT_ASEMAN_MODULES_SQL)\n    add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/sql)\nendif ()\n\nif (${QT_VERSION_MAJOR} GREATER_EQUAL 6) # Deprecated Modules\nelse ()\n    if (QT_ASEMAN_MODULES_MULTIMEDIA)\n        add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/multimedia)\n    endif ()\nendif ()\n\nif (Qt${QT_VERSION_MAJOR}::Positioning)\n    if (QT_ASEMAN_MODULES_GEO)\n        add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/geo)\n    endif ()\nendif ()\n\nset(SOURCE\n    ${SOURCE}\n    PARENT_SCOPE)\n\nset(ASEMAN_COMPILE_DEFINITION\n    ${ASEMAN_COMPILE_DEFINITION}\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    PARENT_SCOPE)\n\nset(ASEMAN_QML_IMPORT_PATH\n    ${ASEMAN_QML_IMPORT_PATH}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/android/android.pro",
    "content": "TEMPLATE = subdirs\nCONFIG   += ordered\n\nlessThan(QT_MAJOR_VERSION, 6) {\n    SUBDIRS  = java\n} else {\n    SUBDIRS  = java-qt6\n}\n"
  },
  {
    "path": "src/android/java/READ-THIS-BEFORE-MANUALLY-ADDING-FILES-TO-PACKAGE.txt",
    "content": "If this package is accessed by Qt Creator, certain changes can be\noverwritten without warning. In particular, Qt Creator may overwrite\nsettings which are maintained using its own UI, and files and\ndirectories containing the string \"--Managed_by_Qt_Creator--\", as well\nas native libraries whose file names begin with \"libQt5\" may be\ndeleted without warning if they are contained inside this package.\n"
  },
  {
    "path": "src/android/java/java.pro",
    "content": "TEMPLATE = aux\nCONFIG -= qt android_install\n\njavaresources.files = \\\n    $$PWD/res \\\n    $$PWD/src\n\njavaresources.path = $$[QT_INSTALL_PREFIX]/src/android/java\n\nINSTALLS += javaresources\n\n!prefix_build:!equals(OUT_PWD, $$PWD) {\n    RETURN = $$escape_expand(\\\\n\\\\t)\n    equals(QMAKE_HOST.os, Windows) {\n        RETURN = $$escape_expand(\\\\r\\\\n\\\\t)\n    }\n    OUT_PATH = $$shell_path($$OUT_PWD)\n\n    QMAKE_POST_LINK += \\\n        $${QMAKE_COPY_DIR} $$shell_path($$PWD/res) $$OUT_PATH $$RETURN \\\n        $${QMAKE_COPY_DIR} $$shell_path($$PWD/src) $$OUT_PATH\n}\n"
  },
  {
    "path": "src/android/java/src/com/hmkcode/android/image/RealPathUtil.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage com.hmkcode.android.image;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.CursorLoader;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.provider.DocumentsContract;\nimport android.provider.MediaStore;\n\npublic class RealPathUtil {\n\n\t@SuppressLint(\"NewApi\")\n\tpublic static String getRealPathFromURI_API19(Context context, Uri uri){\n\t\tString filePath = \"\";\n\t\tString wholeID = DocumentsContract.getDocumentId(uri);\n\n\t     // Split at colon, use second item in the array\n\t     String id = wholeID.split(\":\")[1];\n\n\t     String[] column = { MediaStore.Images.Media.DATA };     \n\n\t     // where id is equal to             \n\t     String sel = MediaStore.Images.Media._ID + \"=?\";\n\n\t     Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, \n\t                               column, sel, new String[]{ id }, null);\n\t     \n\t     int columnIndex = cursor.getColumnIndex(column[0]);\n\n\t     if (cursor.moveToFirst()) {\n\t         filePath = cursor.getString(columnIndex);\n\t     }   \n\n\t     cursor.close();\n\t     \n\t     return filePath;\n\t}\n\t\n\t\n\t@SuppressLint(\"NewApi\")\n\tpublic static String getRealPathFromURI_API11to18(Context context, Uri contentUri) {\n\t\t  String[] proj = { MediaStore.Images.Media.DATA };\n\t\t  String result = null;\n\t\t   \n\t\t  CursorLoader cursorLoader = new CursorLoader(\n\t\t\t\t  context, \n\t\t    contentUri, proj, null, null, null);        \n\t\t  Cursor cursor = cursorLoader.loadInBackground();\n\t\t  \n\t\t  if(cursor != null){\n\t\t   int column_index = \n\t\t     cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);\n\t\t   cursor.moveToFirst();\n\t\t   result = cursor.getString(column_index);\n\t\t  }\n\t\t    \n\t\t  return result;  \n\t}\n\t\n\tpublic static String getRealPathFromURI_BelowAPI11(Context context, Uri contentUri){\n\t\t       String[] proj = { MediaStore.Images.Media.DATA };\n\t\t       Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);\n\t\t       int column_index\n\t\t  = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);\n\t\t       cursor.moveToFirst();\n\t\t       return cursor.getString(column_index);\n\t}\n}\n"
  },
  {
    "path": "src/android/java/src/io/aseman/android/AsemanActivity.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android;\n\nimport org.qtproject.qt5.android.bindings.QtActivity;\n\nimport com.hmkcode.android.image.RealPathUtil;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.os.Build;\nimport android.view.WindowManager;\nimport android.view.Window;\nimport android.view.View ;\nimport android.view.ViewTreeObserver ;\nimport android.provider.MediaStore;\nimport android.database.Cursor;\nimport android.graphics.Rect ;\nimport android.util.Log;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport android.graphics.Color;\nimport android.os.IBinder;\nimport android.content.res.Configuration;\nimport android.app.PendingIntent;\nimport android.app.Notification;\nimport android.content.res.Resources;\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimport android.app.NotificationChannel;\nimport android.graphics.Color;\nimport android.os.Build.VERSION_CODES;\nimport android.os.Build;\nimport android.os.Handler;\n\n//import com.google.android.gms.common.api.GoogleApiClient;\n//import com.google.android.gms.common.api.GoogleSignInOptions;\n\npublic class AsemanActivity extends QtActivity\n{\n    private static AsemanActivity instance;\n    private int keyboardExtraHeight = 0;\n\n    public boolean _transparentStatusBar = false;\n    public boolean _transparentNavigationBar = false;\n    public static final int SELECT_IMAGE = 1;\n\n    private static NotificationManager m_notificationManager;\n    private static Notification.Builder m_builder;\n\n    boolean _storeHasFound;\n    String _storeManagerLastPurchaseSku;\n\n    public AsemanActivity() {\n        AsemanActivity.instance = this;\n    }\n\n    public static AsemanActivity getActivityInstance() {\n        return AsemanActivity.instance;\n    }\n\n    public boolean transparentStatusBar() {\n        return _transparentStatusBar;\n    }\n\n    public boolean transparentNavigationBar() {\n        return _transparentNavigationBar;\n    }\n\n    public String createNotificationChannel(String channelId ,String channelName, int importance){\n        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            NotificationChannel chan = new NotificationChannel(channelId,\n                    channelName, importance);\n            chan.setLightColor(Color.BLUE);\n            chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);\n            NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);\n            manager.createNotificationChannel(chan);\n            return channelId;\n        } else {\n            return \"\";\n        }\n    }\n\n    public boolean startNotification(int id, String title, String body, String iconPath, String icon, String channelId, boolean sound, boolean vibrate)\n    {\n        Resources R = getResources();\n        if (m_notificationManager == null) {\n            m_notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);\n        }\n\n        Intent notificationIntent = new Intent(this, AsemanActivity.class);\n        PendingIntent pendingIntent =\n                PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);\n\n        int detaults = 0;\n        if(sound) detaults |= Notification.DEFAULT_SOUND;\n        if(vibrate) detaults |= Notification.DEFAULT_VIBRATE;\n\n        Notification.Builder builder = new Notification.Builder(this);\n        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) builder.setChannelId(channelId);\n\n        Notification notification =\n            builder\n            .setContentTitle(title)\n            .setContentText(body)\n            .setSmallIcon(R.getIdentifier(icon, iconPath, getPackageName()))\n            .setContentIntent(pendingIntent)\n            .setAutoCancel(true)\n            .setDefaults(detaults)\n            .build();\n\n        m_notificationManager.notify(id, notification);\n        return true;\n    }\n\n    public boolean stopNotification(int id)\n    {\n        if (m_notificationManager == null) {\n            m_notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);\n        }\n        m_notificationManager.cancel(id);\n        return true;\n    }\n\n    boolean setLayoutNoLimit(boolean stt)\n    {\n        Window w = getWindow();\n        if(stt) {\n            w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);\n            _transparentStatusBar = true;\n        } else {\n            w.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);\n            _transparentStatusBar = false;\n        }\n        _transparentNavigationBar = false;\n\n        return true;\n    }\n\n    boolean setStatusBarColor(int color)\n    {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)\n            return false;\n\n//        Window w = getWindow();\n//        w.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);\n//        w.setStatusBarColor(color);\n\n        return true;\n    }\n\n    boolean setTransparentStatusBar(boolean stt)\n    {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)\n            return false;\n\n        Window w = getWindow();\n        if(stt) {\n            w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n            _transparentStatusBar = true;\n        } else {\n            w.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n            _transparentStatusBar = false;\n        }\n\n        return true;\n    }\n\n    boolean setTransparentNavigationBar(boolean stt)\n    {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)\n            return false;\n\n        Window w = getWindow();\n        if(stt) {\n            w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);\n            _transparentNavigationBar = true;\n        } else {\n            w.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);\n            _transparentNavigationBar = false;\n        }\n\n        return true;\n    }\n\n    public void setKeepScreenOn(boolean status) {\n        Window window = getWindow();\n        if (status)\n            window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);\n        else\n            window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);\n    }\n\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data)\n    {\n        if (resultCode == RESULT_OK) {\n            if (requestCode == AsemanActivity.SELECT_IMAGE) {\n                Uri selectedImageUri = data.getData();\n                AsemanJavaLayer.selectImageResult( getPath(selectedImageUri) );\n            }\n        }\n\n        super.onActivityResult(requestCode, resultCode, data);\n    }\n\n    public String getPath(Uri uri) {\n        try {\n            String realPath;\n            // SDK < API11\n            if (Build.VERSION.SDK_INT < 11)\n                    realPath = RealPathUtil.getRealPathFromURI_BelowAPI11(this, uri);\n            // SDK >= 11 && SDK < 19\n            else if (Build.VERSION.SDK_INT < 19)\n                    realPath = RealPathUtil.getRealPathFromURI_API11to18(this, uri);\n            // SDK > 19 (Android 4.4)\n            else\n                realPath = RealPathUtil.getRealPathFromURI_API19(this, uri);\n            return realPath;\n        } catch(Exception e) {\n            String selectedImagePath;\n            String[] projection = { MediaStore.Images.Media.DATA };\n            Cursor cursor = managedQuery(uri, projection, null, null, null);\n            if(cursor != null){\n                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);\n                cursor.moveToFirst();\n                selectedImagePath = cursor.getString(column_index);\n            }else{\n                selectedImagePath = null;\n            }\n\n            if(selectedImagePath == null){\n                selectedImagePath = uri.getPath();\n            }\n            return selectedImagePath;\n        }\n    }\n\n    @Override\n    public void onCreate(Bundle savedInstanceState)\n    {\n        Window w = getWindow();\n        int resID = getResources().getIdentifier(\"splash\" , \"drawable\", getPackageName());\n        if(resID != 0)\n            w.setBackgroundDrawableResource(resID);\n\n//        setTransparentNavigationBar(true);\n        if( !setTransparentStatusBar(true) )\n            setLayoutNoLimit(true);\n\n        super.onCreate(savedInstanceState);\n        final View dview = w.getDecorView();\n        dview.getRootView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){\n            public void onGlobalLayout(){\n                  Rect r = new Rect();\n                  dview.getWindowVisibleDisplayFrame(r);\n\n                  int screenHeight = dview.getRootView().getHeight();\n                  int heightDifference = screenHeight - (r.bottom - r.top);\n                  if(heightDifference > screenHeight/4) {\n                      AsemanJavaLayer.keyboardVisiblityChanged(heightDifference - keyboardExtraHeight);\n                  } else {\n                      keyboardExtraHeight = heightDifference;\n                      AsemanJavaLayer.keyboardVisiblityChanged(0);\n                  }\n               }\n         });\n\n         Intent intent = getIntent();\n         Handler handler = new Handler();\n         handler.postDelayed(new Runnable() {\n             @Override\n             public void run() {\n                 checkIntent(intent);\n             }\n         }, 3000);\n    }\n\n    @Override\n    protected void onNewIntent(Intent intent)\n    {\n        super.onNewIntent(intent);\n        checkIntent(intent);\n    }\n\n    protected void checkIntent(Intent intent)\n    {\n        Uri data = intent.getData();\n        if (data != null) {\n            AsemanJavaLayer.sendDeepLink(data.toString());\n        }\n\n        String action = intent.getAction();\n        String type = intent.getType();\n        if ( !Intent.ACTION_SEND.equals(action) || type == null)\n            return;\n\n        if (\"text/plain\".equals(type))\n            AsemanJavaLayer.sendNote(intent.getStringExtra(Intent.EXTRA_SUBJECT), intent.getStringExtra(Intent.EXTRA_TEXT) );\n        else\n        if(\"image/png\".equals(type) || \"image/jpeg\".equals(type))\n            AsemanJavaLayer.sendImage( (Uri)intent.getExtras().get(Intent.EXTRA_STREAM) );\n    }\n\n    @Override\n    protected void onStart()\n    {\n        super.onStart();\n        AsemanJavaLayer.activityStarted();\n    }\n\n    @Override\n    protected void onRestart()\n    {\n        super.onRestart();\n        AsemanJavaLayer.activityRestarted();\n    }\n\n    @Override\n    protected void onResume()\n    {\n        super.onResume();\n        AsemanJavaLayer.activityResumed();\n    }\n\n    @Override\n    protected void onPause()\n    {\n        AsemanJavaLayer.activityPaused();\n        super.onPause();\n    }\n\n    @Override\n    protected void onStop()\n    {\n        AsemanJavaLayer.activityStopped();\n        super.onStop();\n    }\n\n    @Override\n    protected void onDestroy()\n    {\n        AsemanJavaLayer.activityDestroyed();\n        super.onDestroy();\n    }\n}\n"
  },
  {
    "path": "src/android/java/src/io/aseman/android/AsemanApplication.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android;\n\nimport org.qtproject.qt5.android.bindings.QtApplication;\n\nimport android.app.Application;\nimport android.content.Intent;\nimport android.content.Context;\n\npublic class AsemanApplication extends QtApplication\n{\n    private static Context context;\n    private static Application app_instance = null;\n\n    public void onCreate(){\n        super.onCreate();\n        app_instance = this;\n        AsemanApplication.context = getApplicationContext();\n    }\n\n    public static Context getAppContext() {\n        return AsemanApplication.context;\n    }\n\n    public static Context instance() {\n        return app_instance;\n    }\n}\n"
  },
  {
    "path": "src/android/java/src/io/aseman/android/AsemanBootBroadcast.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\n\nimport io.aseman.android.AsemanService;\n\npublic class AsemanBootBroadcast extends BroadcastReceiver {\n    @Override\n    public void onReceive(Context ctx, Intent intent) {\n        if(intent.getAction().equalsIgnoreCase(Intent.ACTION_BOOT_COMPLETED)) {\n            Intent i = new Intent(ctx, AsemanService.class);\n            i.putExtra(\"name\", \"SurvivingwithAndroid\");\n            try {\n                ctx.startService(i);\n            } catch(Exception e) {\n                return;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/android/java/src/io/aseman/android/AsemanJavaLayer.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android;\n\nimport io.aseman.android.AsemanApplication;\nimport io.aseman.android.AsemanActivity;\nimport io.aseman.android.AsemanQtService;\n\nimport org.qtproject.qt5.android.bindings.QtService;\n\nimport android.util.Log;\nimport android.content.Intent;\nimport android.content.Context;\nimport android.app.Activity;\nimport android.net.Uri;\nimport android.util.DisplayMetrics;\nimport android.provider.MediaStore;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.text.TextUtils;\nimport android.view.WindowManager;\nimport android.os.Build;\nimport android.content.res.Configuration;\nimport android.view.View;\nimport android.view.Window;\nimport android.graphics.Rect;\nimport android.provider.Settings.Secure;\nimport java.lang.Runnable;\nimport android.os.Handler;\nimport android.database.Cursor;\nimport android.provider.ContactsContract;\nimport android.content.ContentResolver;\nimport androidx.core.content.FileProvider;\n\nimport java.io.File;\nimport java.io.InputStream;\nimport java.io.FileOutputStream;\n\nimport android.app.ActivityManager.RunningAppProcessInfo;\nimport android.app.ActivityManager ;\nimport android.os.Process;\nimport java.util.List;\nimport java.util.Iterator;\n\nimport org.json.JSONArray;\nimport org.json.JSONObject;\n\n//import com.google.android.gms.auth.api.signin.GoogleSignInOptions;\n\npublic class AsemanJavaLayer\n{\n    private static native void _sendNote( String title, String msg );\n    private static native void _sendImage( String path );\n    private static native void _sendDeepLink(String link);\n    private static native void _activityPaused();\n    private static native void _activityStopped();\n    private static native void _activityResumed();\n    private static native void _activityStarted();\n    private static native void _activityRestarted();\n    private static native void _activityDestroyed();\n    private static native void _selectImageResult( String path );\n    private static native void _keyboardVisiblityChanged(int height);\n    private static boolean implemented = false;\n\n    public AsemanJavaLayer() {\n    }\n\n    public static void activityPaused(){\n        if(implemented)\n            _activityPaused();\n    }\n\n    public static void activityStopped(){\n        if(implemented)\n            _activityStopped();\n    }\n\n    public static void activityResumed(){\n        if(implemented)\n            _activityResumed();\n    }\n\n    public static void activityStarted(){\n        if(implemented)\n            _activityStarted();\n    }\n\n    public static void activityRestarted(){\n        if(implemented)\n            _activityRestarted();\n    }\n\n    public static void activityDestroyed(){\n        if(implemented)\n            _activityDestroyed();\n    }\n\n    public static void keyboardVisiblityChanged(int height){\n        if(implemented)\n            _keyboardVisiblityChanged(height);\n    }\n\n    public static void sendDeepLink(String link){\n        if(implemented)\n            _sendDeepLink(link);\n    }\n\n    public static void sendNote( String title, String msg ) {\n        if( title == null )\n            title = \"\";\n        if( msg == null )\n            msg = \"\";\n\n        if(implemented)\n            _sendNote(title,msg);\n    }\n\n    public static void setKeepScreenOn(boolean status) {\n        final boolean fstatus = status;\n        final AsemanActivity activtiy = AsemanActivity.getActivityInstance();\n        Handler mainHandler = new Handler(activtiy.getMainLooper());\n        Runnable myRunnable = new Runnable() {\n            @Override\n            public void run() {\n                activtiy.setKeepScreenOn(fstatus);\n            }\n        };\n        mainHandler.post(myRunnable);\n    }\n\n    public static int menuHeight()\n    {\n        Rect r = new Rect();\n        Window window = AsemanActivity.getActivityInstance().getWindow();\n        View rootview = window.getDecorView();\n        rootview.getWindowVisibleDisplayFrame(r);\n\n        return r.top;\n    }\n\n    public static void sendImage( Uri data ) {\n        String imagePath = \"/sdcard/Aseman/tmp_input_image.jpg\";\n\n        File file = new File(imagePath);\n        file.delete();\n\n        try {\n            InputStream stream = AsemanApplication.instance().getContentResolver().openInputStream(data);\n            Bitmap bitmap = BitmapFactory.decodeStream(stream);\n            stream.close();\n\n            FileOutputStream out = new FileOutputStream(imagePath);\n            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);\n            out.close();\n        } catch(Exception e) {\n            return;\n        }\n\n        if(implemented)\n            _sendImage(imagePath);\n    }\n\n    public static void selectImageResult( String path ) {\n        if( path == null )\n            path = \"\";\n\n        if(implemented)\n            _selectImageResult(path);\n    }\n\n    public String packageName()\n    {\n        Context oContext;\n        oContext = AsemanApplication.getAppContext();\n        return oContext.getPackageName();\n    }\n\n    public String deviceName() {\n        String manufacturer = Build.MANUFACTURER;\n        String model = Build.MODEL;\n        if (model.startsWith(manufacturer)) {\n            return capitalize(model);\n        } else {\n            return capitalize(manufacturer) + \" \" + model;\n        }\n    }\n\n    boolean setImplemented(boolean stt) {\n        implemented = stt;\n        return true;\n    }\n\n    public String deviceId() {\n        return Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID);\n    }\n\n\n    private String capitalize(String s) {\n        if (s == null || s.length() == 0) {\n            return \"\";\n        }\n        char first = s.charAt(0);\n        if (Character.isUpperCase(first)) {\n            return s;\n        } else {\n            return Character.toUpperCase(first) + s.substring(1);\n        }\n    }\n\n    public static Context getContext() {\n        if(AsemanActivity.getActivityInstance() != null)\n            return AsemanActivity.getActivityInstance();\n        else\n        if(AsemanQtService.getServiceInstance() != null)\n            return AsemanQtService.getServiceInstance();\n        else\n            return AsemanApplication.getAppContext();\n    }\n\n    public String getLastImages(int offset, int count)\n    {\n        String result = new String();\n        final String[] imageColumns = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA };\n        final String imageOrderBy = MediaStore.Images.Media._ID + \" DESC\";\n        Cursor imageCursor = getContext().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy);\n        imageCursor.moveToFirst();\n        do {\n            String fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));\n            File imageFile = new File(fullPath);\n            if (imageFile.canRead() && imageFile.exists()) {\n                offset--;\n                if(offset >= 0) {\n                    imageCursor.moveToNext();\n                    continue;\n                }\n\n                result = result + fullPath + \"\\n\";\n                count--;\n                if(count <= 0)\n                break;\n            }\n        } while (imageCursor.moveToNext());\n\n        return result;\n    }\n\n    boolean killService(String serviceName)\n    {\n        Context oContext;\n        oContext = AsemanApplication.getAppContext();\n        ActivityManager am = (ActivityManager) oContext.getSystemService(oContext.ACTIVITY_SERVICE);\n        List<RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();\n\n        Iterator<RunningAppProcessInfo> iter = runningAppProcesses.iterator();\n\n        while(iter.hasNext()){\n            RunningAppProcessInfo next = iter.next();\n\n            String pricessName = oContext.getPackageName() + serviceName;\n\n            if(next.processName.equals(pricessName)){\n                Process.killProcess(next.pid);\n                break;\n            }\n        }\n\n        return true;\n    }\n\n    boolean startQtService()\n    {\n        Context oContext;\n        oContext = AsemanApplication.getAppContext();\n        Intent i = new Intent(oContext, AsemanQtService.class);\n        i.putExtra(\"name\", \"SurvivingwithAndroid\");\n        try {\n            oContext.startService(i);\n        } catch(Exception e) {\n            return false;\n        }\n\n        return true;\n    }\n\n    boolean stopQtService()\n    {\n        Context oContext;\n        oContext = AsemanApplication.getAppContext();\n        Intent i = new Intent(oContext, AsemanQtService.class);\n        try {\n        oContext.stopService(i);\n        } catch(Exception e) {\n            return false;\n        }\n        return true;\n    }\n\n    boolean sharePaper( String title, String msg )\n    {\n        Context oContext;\n        oContext = AsemanApplication.getAppContext();\n\n        Intent intent = new Intent(Intent.ACTION_SEND);\n        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        intent.setType(\"text/plain\");\n        intent.putExtra(Intent.EXTRA_TEXT, msg);\n        intent.putExtra(Intent.EXTRA_SUBJECT, title);\n\n        try {\n            oContext.startActivity(intent);\n        } catch(Exception e) {\n            return false;\n        }\n        return true;\n    }\n\n    boolean shareFile(String path, String type)\n    {\n        Context oContext;\n        oContext = AsemanApplication.getAppContext();\n\n        File file = new File(path);\n        Uri photoURI = FileProvider.getUriForFile(oContext, oContext.getApplicationContext().getPackageName() + \".provider\", file);\n\n        Intent intent = new Intent(Intent.ACTION_SEND);\n        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);\n        intent.setType(type);\n        intent.putExtra(Intent.EXTRA_STREAM, photoURI);\n\n        try {\n\n            Intent new_intent = Intent.createChooser(intent , \"Share Via\");\n            new_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n            oContext.startActivity(new_intent);\n\n        } catch(Exception e) {\n            Log.e(\"Share File\" , \"Exception:\" , e);\n            return false;\n        }\n        return true;\n    }\n\n\n    boolean openFile( String path, String type )\n    {\n        Context oContext;\n        oContext = AsemanApplication.getAppContext();\n\n        File file = new File(path);\n        Uri photoURI = FileProvider.getUriForFile(oContext, oContext.getApplicationContext().getPackageName() + \".provider\", file);\n\n        Intent intent = new Intent(android.content.Intent.ACTION_VIEW);\n        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);\n        intent.setType(type);\n        intent.setDataAndType(photoURI,type);\n\n        try {\n            oContext.startActivity(intent);\n        } catch(Exception e) {\n            Log.e(\"Open File\" , \"Exception:\" , e);\n            return false;\n        }\n        return true;\n    }\n\n    DisplayMetrics getMetrics()\n    {\n        DisplayMetrics dm = new DisplayMetrics();\n        try {\n            AsemanActivity.getActivityInstance().getWindowManager().getDefaultDisplay().getMetrics(dm);\n        } catch(Exception e) {\n            return dm;\n        }\n        return dm;\n    }\n\n    double lcdDpiX()\n    {\n        return getMetrics().densityDpi;\n    }\n\n    int densityDpi()\n    {\n        return getMetrics().densityDpi;\n    }\n\n    float density()\n    {\n        return getMetrics().density;\n    }\n\n    int screenSizeWidth()\n    {\n        return getMetrics().widthPixels;\n    }\n\n    int screenSizeHeight()\n    {\n        return getMetrics().heightPixels;\n    }\n\n    int statusBarHeight() {\n        int result = 0;\n        Context context = AsemanApplication.getAppContext();\n        int resourceId = context.getResources().getIdentifier(\"status_bar_height\", \"dimen\", \"android\");\n        if (resourceId > 0) {\n            result = context.getResources().getDimensionPixelSize(resourceId);\n        }\n        return result;\n    }\n\n    int navigationBarHeight() {\n        int result = 0;\n        Context context = AsemanApplication.getAppContext();\n        int resourceId = context.getResources().getIdentifier(\"navigation_bar_height\", \"dimen\", \"android\");\n        if (resourceId > 0) {\n            return context.getResources().getDimensionPixelSize(resourceId);\n        }\n        return 0;\n    }\n\n    boolean isTablet()\n    {\n        Context context = AsemanApplication.getAppContext();\n        return (context.getResources().getConfiguration().screenLayout\n                & Configuration.SCREENLAYOUT_SIZE_MASK)\n                >= Configuration.SCREENLAYOUT_SIZE_LARGE;\n    }\n\n    int getSizeName()\n    {\n        Context context = AsemanApplication.getAppContext();\n        int screenLayout = context.getResources().getConfiguration().screenLayout;\n        screenLayout &= Configuration.SCREENLAYOUT_SIZE_MASK;\n\n        switch (screenLayout) {\n        case Configuration.SCREENLAYOUT_SIZE_SMALL:\n            return 0;\n        case Configuration.SCREENLAYOUT_SIZE_NORMAL:\n            return 1;\n        case Configuration.SCREENLAYOUT_SIZE_LARGE:\n            return 2;\n        case 4: // Configuration.SCREENLAYOUT_SIZE_XLARGE is API >= 9\n            return 3;\n        default:\n            return -1;\n        }\n    }\n\n    boolean getOpenPictures()\n    {\n        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);\n        intent.setType(\"image/*\");\n\n        try {\n            AsemanActivity.getActivityInstance().startActivityForResult(intent, AsemanActivity.SELECT_IMAGE);\n        } catch(Exception e) {\n            return false;\n        }\n\n        return true;\n    }\n\n    boolean startCamera( String output )\n    {\n        Intent intent = new Intent(\"android.media.action.IMAGE_CAPTURE\");\n        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(output)));\n\n        try {\n            AsemanActivity.getActivityInstance().startActivityForResult(intent, 0);\n        } catch(Exception e) {\n            return false;\n        }\n        return true;\n    }\n\n    boolean callNumber( String number )\n    {\n        Intent intent = new Intent(Intent.ACTION_CALL);\n        intent.setData(Uri.parse(\"tel:\" + number));\n\n        try {\n            AsemanActivity.getActivityInstance().startActivity(intent);\n        } catch(Exception e) {\n            return false;\n        }\n        return true;\n    }\n\n    boolean transparentStatusBar()\n    {\n        return AsemanActivity.getActivityInstance().transparentStatusBar();\n    }\n\n    boolean transparentNavigationBar()\n    {\n        return AsemanActivity.getActivityInstance().transparentNavigationBar();\n    }\n\n    boolean release()\n    {\n        return true;\n    }\n\n    boolean setTransparentNavigationBar(boolean stt)\n    {\n        final boolean _stt = stt;\n        Handler mainHandler = new Handler(AsemanActivity.getActivityInstance().getMainLooper());\n        Runnable myRunnable = new Runnable() {\n            @Override\n            public void run() {\n                AsemanActivity.getActivityInstance().setTransparentNavigationBar(_stt);\n            }\n        };\n        mainHandler.post(myRunnable);\n        return true;\n    }\n\n    boolean setTransparentStatusBar(boolean stt)\n    {\n        final boolean _stt = stt;\n        Handler mainHandler = new Handler(AsemanActivity.getActivityInstance().getMainLooper());\n        Runnable myRunnable = new Runnable() {\n            @Override\n            public void run() {\n                AsemanActivity.getActivityInstance().setTransparentStatusBar(_stt);\n            }\n        };\n        mainHandler.post(myRunnable);\n        return true;\n    }\n\n    public String createNotificationChannel(String channelId ,String channelName, int importance){\n        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            if(AsemanActivity.getActivityInstance() != null)\n                return AsemanActivity.getActivityInstance().createNotificationChannel(channelId, channelName, importance);\n            else\n            if(AsemanQtService.getServiceInstance() != null)\n                return AsemanQtService.getServiceInstance().createNotificationChannel(channelId, channelName, importance);\n        } else {\n            return \"\";\n        }\n        return channelId;\n    }\n\n    boolean startForeground(int id, String title, String body, String iconPath, String icon, String channelId)\n    {\n        if(AsemanQtService.getServiceInstance() != null)\n            return AsemanQtService.getServiceInstance().startForeground(id, title, body, iconPath, icon, channelId);\n        return false;\n    }\n\n    boolean stopForeground(boolean removeNotification)\n    {\n        if(AsemanQtService.getServiceInstance() != null) {\n            AsemanQtService.getServiceInstance().stopForeground(removeNotification);\n            return true;\n        }\n        return false;\n    }\n\n    boolean startNotification(int id, String title, String body, String iconPath, String icon, String channelId, boolean sound, boolean vibrate)\n    {\n        if(AsemanActivity.getActivityInstance() != null)\n            return AsemanActivity.getActivityInstance().startNotification(id, title, body, iconPath, icon, channelId, sound, vibrate);\n        else\n        if(AsemanQtService.getServiceInstance() != null)\n            return AsemanQtService.getServiceInstance().startNotification(id, title, body, iconPath, icon, channelId, sound, vibrate);\n        return false;\n    }\n\n    boolean stopNotification(int id)\n    {\n        if(AsemanActivity.getActivityInstance() != null)\n            return AsemanActivity.getActivityInstance().stopNotification(id);\n        else\n        if(AsemanQtService.getServiceInstance() != null)\n            return AsemanQtService.getServiceInstance().stopNotification(id);\n        return false;\n    }\n\n    String getContactList() {\n        Context ctx = getContext();\n        ContentResolver cr = ctx.getContentResolver();\n        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,\n                null, null, null, null);\n\n        JSONArray jsonArray = new JSONArray();\n\n        if ((cur != null ? cur.getCount() : 0) > 0) {\n            while (cur != null && cur.moveToNext()) {\n                String id = cur.getString(\n                        cur.getColumnIndex(ContactsContract.Contacts._ID));\n                String name = cur.getString(cur.getColumnIndex(\n                        ContactsContract.Contacts.DISPLAY_NAME));\n\n                if (cur.getInt(cur.getColumnIndex(\n                        ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {\n                    Cursor pCur = cr.query(\n                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,\n                            null,\n                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + \" = ?\",\n                            new String[]{id}, null);\n                    while (pCur.moveToNext()) {\n                        String phoneNo = pCur.getString(pCur.getColumnIndex(\n                                ContactsContract.CommonDataKinds.Phone.NUMBER));\n\n                        JSONObject obj = new JSONObject();\n                        try {\n                            obj.put(\"id\", id);\n                            obj.put(\"name\", name);\n                            obj.put(\"phone\", phoneNo);\n\n                            jsonArray.put(obj);\n                        } catch (Exception e) {\n                        }\n                    }\n                    pCur.close();\n                }\n            }\n        }\n        if(cur!=null){\n            cur.close();\n        }\n\n        return jsonArray.toString();\n    }\n\n//    public static String getUniquePsuedoID() {\n//        String m_szDevIDShort = \"35\" + (Build.BOARD.length() % 10) + (Build.BRAND.length() % 10) + (Build.CPU_ABI.length() % 10) + (Build.DEVICE.length() % 10) + (Build.MANUFACTURER.length() % 10) + (Build.MODEL.length() % 10) + (Build.PRODUCT.length() % 10);\n//        String serial = null;\n//        try {\n//            serial = android.os.Build.class.getField(\"SERIAL\").get(null).toString();\n//            return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();\n//        } catch (Exception exception) {\n//            serial = \"3077139d-9dde-4ee1-afb5-ecc43f5d1524\";\n//        }\n//        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();\n//    }\n\n//    boolean googleSignIn(String clientId)\n//    {\n//        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)\n//            .requestIdToken(getString(clientId))\n//            .build();\n//    }\n}\n"
  },
  {
    "path": "src/android/java/src/io/aseman/android/AsemanMultimedia.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.net.Uri;\nimport android.provider.MediaStore;\nimport android.database.Cursor;\nimport android.graphics.Rect ;\nimport android.util.Log;\nimport java.util.Iterator;\nimport org.json.JSONArray;\nimport org.json.JSONObject;\n\nimport io.aseman.android.AsemanActivity;\n\npublic class AsemanMultimedia\n{\n    private static boolean implemented = false;\n\n    private static String[] albumsProjection = {\n        MediaStore.Audio.Albums._ID,\n        MediaStore.Audio.Albums.ARTIST,\n        MediaStore.Audio.Albums.ALBUM,\n        MediaStore.Audio.Albums.ALBUM_ART,\n        MediaStore.Audio.Albums.NUMBER_OF_SONGS,\n        MediaStore.Audio.Albums.ARTIST_ID\n    };\n    private static String[] musicsProjection = {\n        MediaStore.Audio.Media._ID,\n        MediaStore.Audio.Media.ARTIST,\n        MediaStore.Audio.Media.ALBUM,\n        MediaStore.Audio.Media.YEAR,\n        MediaStore.Audio.Media.TITLE,\n        MediaStore.Audio.Media.DATA,\n        MediaStore.Audio.Media.DISPLAY_NAME,\n        MediaStore.Audio.Media.DURATION,\n        MediaStore.Audio.Media.ARTIST_ID,\n        MediaStore.Audio.Media.ALBUM_ID\n    };\n    private static String[] artistsProjection = {\n        MediaStore.Audio.Artists._ID,\n        MediaStore.Audio.Artists.ARTIST\n    };\n\n    private String cursorToMusicJson(Cursor cursor) {\n        JSONArray jsonArray = new JSONArray();\n        while(cursor.moveToNext()){\n\n            JSONObject obj = new JSONObject();\n            try {\n                obj.put(\"id\", cursor.getString(0));\n                obj.put(\"artist\", cursor.getString(1));\n                obj.put(\"album\", cursor.getString(2));\n                obj.put(\"art\", cursor.getString(3));\n                obj.put(\"title\", cursor.getString(4));\n                obj.put(\"data\", cursor.getString(5));\n                obj.put(\"displayName\", cursor.getString(6));\n                obj.put(\"duration\", cursor.getString(7));\n                obj.put(\"artistID\", cursor.getString(8));\n                obj.put(\"albumID\", cursor.getString(9));\n\n                jsonArray.put(obj);\n            } catch (Exception e) {\n            }\n        }\n\n        return jsonArray.toString();\n    }\n\n    private String cursorToAlbumJson(Cursor cursor) {\n        JSONArray jsonArray = new JSONArray();\n        while(cursor.moveToNext()){\n\n            JSONObject obj = new JSONObject();\n            try {\n                obj.put(\"id\", cursor.getString(0));\n                obj.put(\"artist\", cursor.getString(1));\n                obj.put(\"album\", cursor.getString(2));\n                obj.put(\"art\", cursor.getString(3));\n                obj.put(\"songs\", cursor.getString(4));\n                obj.put(\"artistId\", cursor.getString(5));\n\n                jsonArray.put(obj);\n            } catch (Exception e) {\n            }\n        }\n\n        return jsonArray.toString();\n    }\n\n    private String cursorToArtistJson(Cursor cursor) {\n        JSONArray jsonArray = new JSONArray();\n        while(cursor.moveToNext()){\n\n            JSONObject obj = new JSONObject();\n            try {\n                obj.put(\"id\", cursor.getString(0));\n                obj.put(\"artist\", cursor.getString(1));\n\n                jsonArray.put(obj);\n            } catch (Exception e) {\n            }\n        }\n\n        return jsonArray.toString();\n    }\n\n    public String getAllMusics() {\n        String selection = MediaStore.Audio.Media.IS_MUSIC + \" != 0\";\n\n        Cursor cursor;\n        try {\n            cursor = AsemanActivity.getActivityInstance().managedQuery(\n                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,\n                musicsProjection,\n                selection,\n                null,\n                null);\n        } catch (Exception e) {\n            return \"\";\n        }\n\n        return cursorToMusicJson(cursor);\n    }\n\n    public String getAllAlbums() {\n        String selection = MediaStore.Audio.Albums._ID + \" != 0\";\n\n        Cursor cursor;\n        try {\n            cursor = AsemanActivity.getActivityInstance().managedQuery(\n                MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,\n                albumsProjection,\n                selection,\n                null,\n                null);\n        } catch (Exception e) {\n            return \"\";\n        }\n\n        return cursorToAlbumJson(cursor);\n    }\n\n    public String getAllArtists() {\n        String selection = MediaStore.Audio.Artists._ID + \" != 0\";\n\n        Cursor cursor;\n        try {\n            cursor = AsemanActivity.getActivityInstance().managedQuery(\n                MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,\n                artistsProjection,\n                selection,\n                null,\n                null);\n        } catch (Exception e) {\n            return \"\";\n        }\n\n        return cursorToArtistJson(cursor);\n    }\n\n    public String getArtistAlbums(String artistId) {\n        String selection = MediaStore.Audio.Albums.ARTIST_ID + \" = \" + artistId;\n\n        Cursor cursor;\n        try {\n            cursor = AsemanActivity.getActivityInstance().managedQuery(\n                MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,\n                albumsProjection,\n                selection,\n                null,\n                null);\n        } catch (Exception e) {\n            return \"\";\n        }\n\n        return cursorToAlbumJson(cursor);\n    }\n\n    public String getArtistSongs(String artistId) {\n        String selection = MediaStore.Audio.Media.ARTIST_ID + \" = \" + artistId;\n\n        Cursor cursor;\n        try {\n            cursor = AsemanActivity.getActivityInstance().managedQuery(\n                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,\n                musicsProjection,\n                selection,\n                null,\n                null);\n        } catch (Exception e) {\n            return \"\";\n        }\n\n        return cursorToMusicJson(cursor);\n    }\n\n    public String getAlbumSongs(String albumId) {\n        String selection = MediaStore.Audio.Media.ALBUM_ID + \" = \" + albumId;\n\n        Cursor cursor;\n        try {\n            cursor = AsemanActivity.getActivityInstance().managedQuery(\n                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,\n                musicsProjection,\n                selection,\n                null,\n                null);\n        } catch (Exception e) {\n            return \"\";\n        }\n\n        return cursorToMusicJson(cursor);\n    }\n\n    public boolean setImplemented(boolean stt) {\n        implemented = stt;\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/android/java/src/io/aseman/android/AsemanQtService.java",
    "content": "/*\n    Copyright (c) 2016, BogDan Vatra <bogdan@kde.org>\n    Contact: http://www.qt.io/licensing/\n\n    Commercial License Usage\n    Licensees holding valid commercial Qt licenses may use this file in\n    accordance with the commercial license agreement provided with the\n    Software or, alternatively, in accordance with the terms contained in\n    a written agreement between you and The Qt Company. For licensing terms\n    and conditions see http://www.qt.io/terms-conditions. For further\n    information use the contact form at http://www.qt.io/contact-us.\n\n    BSD License Usage\n    Alternatively, this file may be used under the BSD license as follows:\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n    1. Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n    2. Redistributions in binary form must reproduce the above copyright\n    notice, this list of conditions and the following disclaimer in the\n    documentation and/or other materials provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n    IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n    NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n    THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\npackage io.aseman.android;\n\nimport android.app.Service;\nimport android.content.Intent;\nimport android.content.res.Configuration;\nimport android.os.IBinder;\nimport android.app.PendingIntent;\nimport android.app.Notification;\nimport android.content.res.Resources;\nimport io.aseman.android.AsemanActivity;\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimport android.content.res.Resources;\nimport android.content.Context;\nimport android.app.NotificationChannel;\nimport android.graphics.Color;\nimport android.os.Build.VERSION_CODES;\nimport android.os.Build;\n\nimport org.qtproject.qt5.android.bindings.QtService;\n\npublic class AsemanQtService extends QtService {\n\n    private static NotificationManager m_notificationManager;\n    private static Notification.Builder m_builder;\n    private static AsemanQtService m_instance = null;\n\n    public static AsemanQtService getServiceInstance() {\n        return AsemanQtService.m_instance;\n    }\n\n    @Override\n    public void onCreate() {\n        m_instance = this;\n        super.onCreate();\n    }\n\n    public String createNotificationChannel(String channelId ,String channelName, int importance){\n        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            NotificationChannel chan = new NotificationChannel(channelId,\n                    channelName, importance);\n            chan.setLightColor(Color.BLUE);\n            chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);\n            NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);\n            manager.createNotificationChannel(chan);\n            return channelId;\n        } else {\n            return \"\";\n        }\n    }\n\n    public boolean startForeground(int id, String title, String msg, String iconPath, String icon, String channelId) {\n        Intent notificationIntent = new Intent(this, AsemanActivity.class);\n        PendingIntent pendingIntent =\n                PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);\n\n        Resources R = getResources();\n\n        Notification.Builder builder = new Notification.Builder(this);\n        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) builder.setChannelId(channelId);\n        Notification notification =\n            builder\n            .setContentTitle(title)\n            .setContentText(msg)\n            .setSmallIcon(R.getIdentifier(icon, iconPath, getPackageName()))\n            .setContentIntent(pendingIntent)\n            .build();\n\n        startForeground(id, notification);\n        return true;\n    }\n\n    public boolean startNotification(int id, String title, String body, String iconPath, String icon, String channelId, boolean sound, boolean vibrate)\n    {\n        Resources R = getResources();\n        if (m_notificationManager == null) {\n            m_notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);\n        }\n\n        Intent notificationIntent = new Intent(this, AsemanActivity.class);\n        PendingIntent pendingIntent =\n                PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);\n\n        int detaults = 0;\n        if(sound) detaults |= Notification.DEFAULT_SOUND;\n        if(vibrate) detaults |= Notification.DEFAULT_VIBRATE;\n\n        Notification.Builder builder = new Notification.Builder(this);\n        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) builder.setChannelId(channelId);\n        Notification notification =\n             builder\n            .setContentTitle(title)\n            .setContentText(body)\n            .setSmallIcon(R.getIdentifier(icon, iconPath, getPackageName()))\n            .setContentIntent(pendingIntent)\n            .setAutoCancel(true)\n            .setDefaults(detaults)\n            .build();\n\n        m_notificationManager.notify(id, notification);\n        return true;\n    }\n\n    public boolean stopNotification(int id)\n    {\n        if (m_notificationManager == null) {\n            m_notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);\n        }\n        m_notificationManager.cancel(id);\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/android/java/src/io/aseman/android/AsemanService.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android;\n\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.io.InputStream;\nimport java.io.FileOutputStream;\nimport java.io.FileInputStream;\nimport java.io.DataOutputStream;\nimport java.io.DataInputStream;\nimport java.lang.reflect.Field;\n\nimport dalvik.system.DexClassLoader;\n\nimport android.content.res.AssetManager;\nimport android.annotation.SuppressLint;\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimport android.app.PendingIntent;\nimport android.app.Service;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageInfo;\nimport android.content.pm.ServiceInfo;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.os.IBinder;\nimport android.util.Log;\nimport android.os.Process;\nimport android.widget.Toast;\n\nimport io.aseman.android.AsemanActivity;\nimport io.aseman.android.AsemanServiceDelegate;\nimport org.qtproject.qt5.android.bindings.QtApplication;\n\npublic class AsemanService extends Service\n{\n    public Boolean started=false;\n    private String[] m_qtLibs = null;\n    private DexClassLoader m_classLoader = null;\n\n    private static final int BUFFER_SIZE = 1024;\n\n    private String[] m_sources = {\"https://download.qt-project.org/ministro/android/qt5/qt-5.2\"}; // Make sure you are using ONLY secure locations\n    private String m_repository = \"default\";\n\n    private ServiceInfo m_serviceInfo = null;\n    protected NotificationManager m_notificationManager;\n    protected Notification.Builder m_builder;\n    protected PendingIntent pi;\n    private static AsemanService m_instance = null;\n    private String m_lib_name;\n\n    private static final String ERROR_CODE_KEY = \"error.code\";\n    private static final String DEX_PATH_KEY = \"dex.path\";\n    private static final String STATIC_INIT_CLASSES_KEY = \"static.init.classes\";\n    private static final String NATIVE_LIBRARIES_KEY = \"native.libraries\";\n    private static final String MAIN_LIBRARY_KEY = \"main.library\";\n    private static final String APPLICATION_PARAMETERS_KEY = \"application.parameters\";\n    private static final String BUNDLED_LIBRARIES_KEY = \"bundled.libraries\";\n    private static final String BUNDLED_IN_LIB_RESOURCE_ID_KEY = \"android.app.bundled_in_lib_resource_id\";\n    private static final String BUNDLED_IN_ASSETS_RESOURCE_ID_KEY = \"android.app.bundled_in_assets_resource_id\";\n    private static final String LOADER_CLASS_NAME_KEY = \"loader.class.name\";\n    private static final String LIB_PATH_KEY = \"lib.path\";\n    private static final String ENVIRONMENT_VARIABLES_KEY = \"env.variable\";\n\n    public String APPLICATION_PARAMETERS = null;\n    public String ENVIRONMENT_VARIABLES = \"QT_USE_ANDROID_NATIVE_STYLE=1\\tQT_USE_ANDROID_NATIVE_DIALOGS=1\\t\";\n\n    @Override\n    public void onCreate() {\n        m_instance = this;\n\n        try{\n            ComponentName myService = new ComponentName(this, this.getClass());\n            m_serviceInfo = getPackageManager().getServiceInfo(myService, PackageManager.GET_META_DATA);\n            m_lib_name = splitCamelCase (m_serviceInfo.metaData.getString(\"android.app.lib_name\"));\n        }\n        catch (Exception e) {\n            e.printStackTrace();\n        }\n\n        super.onCreate();\n    }\n\n    public static AsemanService getServiceInstance() {\n        return AsemanService.m_instance;\n    }\n\n    @Override\n    public int onStartCommand(Intent intent, int flags, int startId) {\n        startApp();\n        return super.onStartCommand(intent, flags, startId);\n    }\n\n    @Override\n    public IBinder onBind(Intent intent) {\n        return null;\n    }\n\n    @Override\n    public void onDestroy() {\n        AsemanServiceDelegate.finishQtApplication();\n        m_serviceInfo = null;\n        m_instance = null;\n        m_classLoader = null;\n        super.onDestroy();\n    }\n\n    private void startApp(){\n        if (!started){\n            started = true;\n//            Toast.makeText(getBaseContext(), m_lib_name + \" starting\", Toast.LENGTH_LONG).show();\n\n            try{\n                if (m_serviceInfo.metaData.containsKey(\"android.app.qt_sources_resource_id\")) {\n                    int resourceId = m_serviceInfo.metaData.getInt(\"android.app.qt_sources_resource_id\");\n                    m_sources = getResources().getStringArray(resourceId);\n                }\n\n                if (m_serviceInfo.metaData.containsKey(\"android.app.repository\"))\n                    m_repository = m_serviceInfo.metaData.getString(\"android.app.repository\");\n\n                if (m_serviceInfo.metaData.containsKey(\"android.app.qt_libs_resource_id\")) {\n                    int resourceId = m_serviceInfo.metaData.getInt(\"android.app.qt_libs_resource_id\");\n                    m_qtLibs = getResources().getStringArray(resourceId);\n                }\n\n                if (m_serviceInfo.metaData.containsKey(\"android.app.use_local_qt_libs\")\n                        && m_serviceInfo.metaData.getInt(\"android.app.use_local_qt_libs\") == 1) {\n                    ArrayList<String> libraryList = new ArrayList<String>();\n\n\n                    String localPrefix = \"/data/local/tmp/qt/\";\n                    if (m_serviceInfo.metaData.containsKey(\"android.app.libs_prefix\"))\n                        localPrefix = m_serviceInfo.metaData.getString(\"android.app.libs_prefix\");\n\n                    String pluginsPrefix = localPrefix;\n\n                    boolean bundlingQtLibs = false;\n                    if (m_serviceInfo.metaData.containsKey(\"android.app.bundle_local_qt_libs\")\n                        && m_serviceInfo.metaData.getInt(\"android.app.bundle_local_qt_libs\") == 1) {\n                        localPrefix = getApplicationInfo().dataDir + \"/\";\n                        pluginsPrefix = localPrefix + \"qt-reserved-files/\";\n                        cleanOldCacheIfNecessary(localPrefix, pluginsPrefix);\n                        extractBundledPluginsAndImports(pluginsPrefix);\n                        bundlingQtLibs = true;\n                    }\n\n                    if (m_qtLibs != null) {\n                        for (int i=0;i<m_qtLibs.length;i++) {\n                            libraryList.add(localPrefix\n                                            + \"lib/lib\"\n                                            + m_qtLibs[i]\n                                            + \".so\");\n                        }\n                    }\n\n                    if (m_serviceInfo.metaData.containsKey(\"android.app.load_local_libs\")) {\n                        String[] extraLibs = m_serviceInfo.metaData.getString(\"android.app.load_local_libs\").split(\":\");\n                        for (String lib : extraLibs) {\n                            if (lib.length() > 0) {\n                                if (lib.startsWith(\"lib/\"))\n                                    libraryList.add(localPrefix + lib);\n                                else\n                                    libraryList.add(pluginsPrefix + lib);\n                            }\n                        }\n                    }\n\n\n                    String dexPaths = new String();\n                    String pathSeparator = System.getProperty(\"path.separator\", \":\");\n                    if (!bundlingQtLibs && m_serviceInfo.metaData.containsKey(\"android.app.load_local_jars\")) {\n                        String[] jarFiles = m_serviceInfo.metaData.getString(\"android.app.load_local_jars\").split(\":\");\n                        for (String jar:jarFiles) {\n                            if (jar.length() > 0) {\n                                if (dexPaths.length() > 0)\n                                    dexPaths += pathSeparator;\n                                dexPaths += localPrefix + jar;\n                            }\n                        }\n                    }\n\n                    Bundle loaderParams = new Bundle();\n                    loaderParams.putInt(ERROR_CODE_KEY, 0);\n                    loaderParams.putString(DEX_PATH_KEY, dexPaths);\n                    loaderParams.putString(LOADER_CLASS_NAME_KEY, \"io.aseman.android.AsemanServiceDelegate\");\n                    if (m_serviceInfo.metaData.containsKey(\"android.app.static_init_classes\")) {\n                        loaderParams.putStringArray(STATIC_INIT_CLASSES_KEY,\n                                                    m_serviceInfo.metaData.getString(\"android.app.static_init_classes\").split(\":\"));\n                    }\n                    loaderParams.putStringArrayList(NATIVE_LIBRARIES_KEY, libraryList);\n\n                    loaderParams.putString(ENVIRONMENT_VARIABLES_KEY, ENVIRONMENT_VARIABLES\n                                                                      + \"\\tQML2_IMPORT_PATH=\" + pluginsPrefix + \"/qml\"\n                                                                      + \"\\tQML_IMPORT_PATH=\" + pluginsPrefix + \"/imports\"\n                                                                      + \"\\tQT_PLUGIN_PATH=\" + pluginsPrefix + \"/plugins\");\n\n                    if (APPLICATION_PARAMETERS != null) {\n                        loaderParams.putString(APPLICATION_PARAMETERS_KEY, APPLICATION_PARAMETERS);\n                    }\n\n                    loadApplication(loaderParams);\n                    return;\n                }\n            }\n            catch (Exception e) {\n                started = false;\n                e.printStackTrace();\n            }\n        }\n    }\n\n    @SuppressLint(\"NewApi\")\n    public void loadApplication(Bundle loaderParams){\n\n        try{\n\n            ArrayList<String> libs = new ArrayList<String>();\n            if ( m_serviceInfo.metaData.containsKey(\"android.app.bundled_libs_resource_id\") )\n                libs.addAll(Arrays.asList(getResources().getStringArray(m_serviceInfo.metaData.getInt(\"android.app.bundled_libs_resource_id\"))));\n\n            String libName = null;\n            if ( m_serviceInfo.metaData.containsKey(\"android.app.lib_name\") ) {\n                libName = m_serviceInfo.metaData.getString(\"android.app.lib_name\");\n                loaderParams.putString(MAIN_LIBRARY_KEY, libName); //main library contains main() function\n            }\n\n            loaderParams.putStringArrayList(BUNDLED_LIBRARIES_KEY, libs);\n            loaderParams.putString(ENVIRONMENT_VARIABLES_KEY, \"\");\n\n            m_classLoader = new DexClassLoader(loaderParams.getString(DEX_PATH_KEY), // .jar/.apk files\n                    getDir(\"outdex\", Context.MODE_PRIVATE).getAbsolutePath(), // directory where optimized DEX files should be written.\n                    loaderParams.containsKey(LIB_PATH_KEY) ? loaderParams.getString(LIB_PATH_KEY) : null, // libs folder (if exists)\n                    getClassLoader()); // parent loader\n\n            String loaderClassName = loaderParams.getString(LOADER_CLASS_NAME_KEY);\n\n            Log.w(getClass().getName(), \"Loader : \" + loaderClassName);\n\n            Class<?> loaderClass = m_classLoader.loadClass(loaderClassName); // load QtLoader class\n            Object qtLoader = loaderClass.newInstance(); // create an instance\n\n            Method perpareAppMethod = qtLoader.getClass().getMethod(\"loadApplication\",\n                                                                    Service.class,\n                                                                    ClassLoader.class,\n                                                                    Bundle.class);\n\n            if (!(Boolean)perpareAppMethod.invoke(qtLoader, this, m_classLoader, loaderParams))\n                throw new Exception(\"\");\n\n            // now load the application library so it's accessible from this class loader\n            if (libName != null)\n                System.loadLibrary(libName);\n\n            Method startAppMethod=qtLoader.getClass().getMethod(\"startApplication\");\n            if (!(Boolean)startAppMethod.invoke(qtLoader))\n                throw new Exception(\"\");\n        }\n        catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    static private void copyFile(InputStream inputStream, OutputStream outputStream)\n        throws IOException\n    {\n        byte[] buffer = new byte[BUFFER_SIZE];\n\n        int count;\n        while ((count = inputStream.read(buffer)) > 0)\n            outputStream.write(buffer, 0, count);\n    }\n\n\n    private void copyAsset(String source, String destination)\n        throws IOException\n    {\n        // Already exists, we don't have to do anything\n        File destinationFile = new File(destination);\n        if (destinationFile.exists())\n            return;\n\n        File parentDirectory = destinationFile.getParentFile();\n        if (!parentDirectory.exists())\n            parentDirectory.mkdirs();\n\n        destinationFile.createNewFile();\n\n        AssetManager assetsManager = getAssets();\n        InputStream inputStream = assetsManager.open(source);\n        OutputStream outputStream = new FileOutputStream(destinationFile);\n        copyFile(inputStream, outputStream);\n\n        inputStream.close();\n        outputStream.close();\n    }\n\n    private static void createBundledBinary(String source, String destination)\n        throws IOException\n    {\n        // Already exists, we don't have to do anything\n        File destinationFile = new File(destination);\n        if (destinationFile.exists())\n            return;\n\n        File parentDirectory = destinationFile.getParentFile();\n        if (!parentDirectory.exists())\n            parentDirectory.mkdirs();\n\n        destinationFile.createNewFile();\n\n        InputStream inputStream = new FileInputStream(source);\n        OutputStream outputStream = new FileOutputStream(destinationFile);\n        copyFile(inputStream, outputStream);\n\n        inputStream.close();\n        outputStream.close();\n    }\n\n    private boolean cleanCacheIfNecessary(String pluginsPrefix, long packageVersion)\n    {\n        File versionFile = new File(pluginsPrefix + \"cache.version\");\n\n        long cacheVersion = 0;\n        if (versionFile.exists() && versionFile.canRead()) {\n            try {\n                DataInputStream inputStream = new DataInputStream(new FileInputStream(versionFile));\n                cacheVersion = inputStream.readLong();\n                inputStream.close();\n             } catch (Exception e) {\n                e.printStackTrace();\n             }\n        }\n\n        if (cacheVersion != packageVersion) {\n            deleteRecursively(new File(pluginsPrefix));\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    private void extractBundledPluginsAndImports(String pluginsPrefix)\n        throws IOException\n    {\n        ArrayList<String> libs = new ArrayList<String>();\n\n        String dataDir = getApplicationInfo().dataDir + \"/\";\n\n        long packageVersion = -1;\n        try {\n            PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);\n            packageVersion = packageInfo.lastUpdateTime;\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n\n        if (!cleanCacheIfNecessary(pluginsPrefix, packageVersion))\n            return;\n\n        {\n            File versionFile = new File(pluginsPrefix + \"cache.version\");\n\n            File parentDirectory = versionFile.getParentFile();\n            if (!parentDirectory.exists())\n                parentDirectory.mkdirs();\n\n            versionFile.createNewFile();\n\n            DataOutputStream outputStream = new DataOutputStream(new FileOutputStream(versionFile));\n            outputStream.writeLong(packageVersion);\n            outputStream.close();\n        }\n\n        {\n            String key = BUNDLED_IN_LIB_RESOURCE_ID_KEY;\n            java.util.Set<String> keys = m_serviceInfo.metaData.keySet();\n            if (m_serviceInfo.metaData.containsKey(key)) {\n                String[] list = getResources().getStringArray(m_serviceInfo.metaData.getInt(key));\n\n                for (String bundledImportBinary : list) {\n                    String[] split = bundledImportBinary.split(\":\");\n                    String sourceFileName = dataDir + \"lib/\" + split[0];\n                    String destinationFileName = pluginsPrefix + split[1];\n                    createBundledBinary(sourceFileName, destinationFileName);\n                }\n            }\n        }\n\n        {\n            String key = BUNDLED_IN_ASSETS_RESOURCE_ID_KEY;\n            if (m_serviceInfo.metaData.containsKey(key)) {\n                String[] list = getResources().getStringArray(m_serviceInfo.metaData.getInt(key));\n\n                for (String fileName : list) {\n                    String[] split = fileName.split(\":\");\n                    String sourceFileName = split[0];\n                    String destinationFileName = pluginsPrefix + split[1];\n                    copyAsset(sourceFileName, destinationFileName);\n                }\n            }\n\n        }\n    }\n\n    private void deleteRecursively(File directory)\n    {\n        File[] files = directory.listFiles();\n        if (files != null) {\n            for (File file : files) {\n                if (file.isDirectory())\n                    deleteRecursively(file);\n                else\n                    file.delete();\n            }\n\n            directory.delete();\n        }\n    }\n\n    private void cleanOldCacheIfNecessary(String oldLocalPrefix, String localPrefix)\n    {\n        File newCache = new File(localPrefix);\n        if (!newCache.exists()) {\n            {\n                File oldPluginsCache = new File(oldLocalPrefix + \"plugins/\");\n                if (oldPluginsCache.exists() && oldPluginsCache.isDirectory())\n                    deleteRecursively(oldPluginsCache);\n            }\n\n            {\n                File oldImportsCache = new File(oldLocalPrefix + \"imports/\");\n                if (oldImportsCache.exists() && oldImportsCache.isDirectory())\n                    deleteRecursively(oldImportsCache);\n            }\n\n            {\n                File oldQmlCache = new File(oldLocalPrefix + \"qml/\");\n                if (oldQmlCache.exists() && oldQmlCache.isDirectory())\n                    deleteRecursively(oldQmlCache);\n            }\n        }\n    }\n\n    static String splitCamelCase(String sp) {\n\n        String s = Character.toUpperCase(sp.charAt(0)) + sp.substring(1);\n\n        return s.replaceAll(\n          String.format(\"%s|%s|%s\",\n             \"(?<=[A-Z])(?=[A-Z][a-z])\",\n             \"(?<=[^A-Z])(?=[A-Z])\",\n             \"(?<=[A-Za-z])(?=[^A-Za-z])\"\n          ),\n          \" \"\n       );\n    }\n}\n"
  },
  {
    "path": "src/android/java/src/io/aseman/android/AsemanServiceDelegate.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android;\n\nimport org.qtproject.qt5.android.QtNative;\n\nimport java.io.File;\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.Iterator;\n\nimport android.app.Service;\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.content.res.Configuration;\nimport android.graphics.Rect;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.util.Log;\n\npublic class AsemanServiceDelegate\n{\n    private Service m_service = null;\n\n    private static final String NATIVE_LIBRARIES_KEY = \"native.libraries\";\n    private static final String BUNDLED_LIBRARIES_KEY = \"bundled.libraries\";\n    private static final String MAIN_LIBRARY_KEY = \"main.library\";\n    private static final String ENVIRONMENT_VARIABLES_KEY = \"environment.variables\";\n    private static final String APPLICATION_PARAMETERS_KEY = \"application.parameters\";\n    private static final String STATIC_INIT_CLASSES_KEY = \"static.init.classes\";\n    private static final String NECESSITAS_API_LEVEL_KEY = \"necessitas.api.level\";\n\n    private String m_environmentVariables = null;\n    private String m_applicationParameters = null;\n\n    private String m_mainLib;\n\n    public boolean loadApplication(Service service, ClassLoader classLoader, Bundle loaderParams)\n    {\n        if (!loaderParams.containsKey(NATIVE_LIBRARIES_KEY))\n            Log.w(getClass().getName(), \"Missing parameters1 in loaderParams\");\n\n        if (!loaderParams.containsKey(BUNDLED_LIBRARIES_KEY))\n            Log.w(getClass().getName(), \"Missing parameters2 in loaderParams\");\n\n        /// check parameters integrity\n        if (!loaderParams.containsKey(NATIVE_LIBRARIES_KEY)\n                || !loaderParams.containsKey(BUNDLED_LIBRARIES_KEY)) {\n\n            Log.w(getClass().getName(), \"Missing parameters in loaderParams\");\n            return false;\n        }\n\n        m_service = service;\n        //QtNative.setActivity(m_activity, this);\n        QtNative.setClassLoader(classLoader);\n        if (loaderParams.containsKey(STATIC_INIT_CLASSES_KEY)) {\n            for (String className: loaderParams.getStringArray(STATIC_INIT_CLASSES_KEY)) {\n                Log.w(getClass().getName(), className);\n                if (className.length() == 0)\n                    continue;\n\n                try {\n                    @SuppressWarnings(\"rawtypes\")\n                    Class initClass = classLoader.loadClass(className);\n                    Object staticInitDataObject = initClass.newInstance(); // create an instance\n                    //Method m = initClass.getMethod(\"setActivity\", Activity.class, Object.class);\n                    //m.invoke(staticInitDataObject, m_activity, this);\n                } catch (Exception e) {\n                    e.printStackTrace();\n                }\n            }\n        }\n\n        QtNative.loadQtLibraries(loaderParams.getStringArrayList(NATIVE_LIBRARIES_KEY));\n        ArrayList<String> libraries = loaderParams.getStringArrayList(BUNDLED_LIBRARIES_KEY);\n        QtNative.loadBundledLibraries(libraries, QtNativeNativeLibrariesDir(m_service));\n        m_mainLib = loaderParams.getString(MAIN_LIBRARY_KEY);\n        // older apps provide the main library as the last bundled library; look for this if the main library isn't provided\n        if (null == m_mainLib && libraries.size() > 0)\n            m_mainLib = libraries.get(libraries.size() - 1);\n\n\n        int necessitasApiLevel = 1;\n        if (loaderParams.containsKey(NECESSITAS_API_LEVEL_KEY))\n            necessitasApiLevel = loaderParams.getInt(NECESSITAS_API_LEVEL_KEY);\n\n        m_environmentVariables = \"\";\n\n        if (loaderParams.containsKey(APPLICATION_PARAMETERS_KEY))\n            m_applicationParameters = loaderParams.getString(APPLICATION_PARAMETERS_KEY);\n        else\n            m_applicationParameters = \"\";\n\n        return true;\n    }\n\n    public void debugLog(String msg)\n    {\n        Log.i(QtNative.QtTAG, \"DEBUGGER: \" + msg);\n    }\n\n    public boolean startApplication()\n    {\n\n        try {\n\n            String nativeLibraryDir = QtNativeNativeLibrariesDir(m_service);\n\n            Log.i(QtNative.QtTAG, \"LIB DIR : \" + nativeLibraryDir);\n\n//            QtNative.startApplication\n            QtNativeStartApplication\n                    (  m_applicationParameters,\n                                        m_environmentVariables,\n                                        m_mainLib,\n                                        nativeLibraryDir);\n            return true;\n        }\n        catch (Exception e) {\n\n            e.printStackTrace();\n            return false;\n        }\n    }\n\n    public static String QtNativeNativeLibrariesDir(Service service)\n    {\n        String m_nativeLibraryDir = null;\n        try {\n            ApplicationInfo ai = service.getPackageManager().getApplicationInfo(service.getPackageName(), 0);\n            m_nativeLibraryDir = ai.nativeLibraryDir+\"/\";\n        } catch (NameNotFoundException e) {\n            e.printStackTrace();\n        }\n        return m_nativeLibraryDir;\n    }\n\n\n    public static boolean QtNativeStartApplication(String params,\n                                           String environment,\n                                           String mainLibrary,\n                                           String nativeLibraryDir) throws Exception\n    {\n        File f = new File(nativeLibraryDir + \"lib\" + mainLibrary + \".so\");\n        if (!f.exists())\n            throw new Exception(\"Can't find main library '\" + mainLibrary + \"'\");\n\n        if (params == null)\n            params = \"-platform\\tandroid\";\n\n        boolean res = false;\n\n        if (params.length() > 0 && !params.startsWith(\"\\t\"))\n            params = \"\\t\" + params;\n        startQtApplication(f.getAbsolutePath() + params, environment);\n\n        return res;\n    }\n\n    public static native void startQtApplication(String params, String env);\n    public static native void finishQtApplication();\n}\n"
  },
  {
    "path": "src/android/java/src/io/aseman/android/extra/AsemanCameraCapture.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android.extra;\n\nimport io.aseman.android.AsemanApplication;\nimport io.aseman.android.AsemanActivity;\nimport io.aseman.android.AsemanService;\n\nimport android.os.Bundle;\nimport android.content.Context;\nimport android.content.ContentResolver;\nimport android.provider.Settings;\nimport android.util.Log;\nimport android.view.SurfaceView;\nimport android.view.SurfaceHolder;\nimport android.view.SurfaceHolder.Callback;\nimport android.view.WindowManager;\nimport android.graphics.PixelFormat;\nimport android.hardware.Camera;\nimport android.hardware.Camera.PictureCallback;\nimport android.os.Environment;\nimport java.util.HashMap;\nimport java.io.IOException;\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Date;\nimport java.util.TimerTask;\nimport java.util.Timer;\nimport java.lang.Runnable;\nimport java.text.SimpleDateFormat;\nimport android.os.Handler;\n\npublic class AsemanCameraCapture\n{\n    private static final String TAG = \"AsemanCameraCapture\";\n\n    public native void _imageCaptured(int id, String path);\n\n    public void capture(final int id, final String path, final boolean frontCamera) {\n        Handler mainHandler = new Handler(getContext().getMainLooper());\n        Runnable myRunnable = new Runnable() {\n            @Override\n            public void run() {\n                try {\n                    takePhoto(id, path,\n                              frontCamera? Camera.CameraInfo.CAMERA_FACING_FRONT :\n                                           Camera.CameraInfo.CAMERA_FACING_BACK);\n                } catch (Exception e) {\n                    _imageCaptured(id, \"\");\n                }\n            }\n        };\n        mainHandler.post(myRunnable);\n    }\n\n    public static Context getContext() {\n        if(AsemanActivity.getActivityInstance() != null)\n            return AsemanActivity.getActivityInstance();\n        else\n        if(AsemanService.getServiceInstance() != null)\n            return AsemanService.getServiceInstance();\n        else\n            return AsemanApplication.getAppContext();\n    }\n\n    private void takePhoto(final int actionId, final String path, final int cameraType) {\n        Context context = getContext();\n        final SurfaceView view = new SurfaceView(context);\n        final Camera camera = openCamera(cameraType);\n        if(camera == null) {\n            camera.release();\n            _imageCaptured(actionId, \"\");\n            return;\n        }\n\n        Log.d(TAG, \"Opened camera\");\n\n        SurfaceHolder holder = view.getHolder();\n        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);\n\n        holder.addCallback(new Callback() {\n            @Override\n            //The preview must happen at or after this point or takePicture fails\n            public void surfaceCreated(SurfaceHolder holder) {\n\n                try {\n                    camera.setPreviewDisplay(holder);\n                } catch (Exception e) {\n                    if (camera != null)\n                        camera.release();\n                    _imageCaptured(actionId, \"\");\n                    throw new RuntimeException(e);\n                }\n\n                Log.d(TAG, \"Started preview\");\n                Timer timer = new Timer();\n                timer.schedule( new TimerTask() {\n                    @Override\n                    public void run() {\n                        try {\n                            camera.takePicture(null, null, new PictureCallback() {\n                                @Override\n                                public void onPictureTaken(byte[] data, Camera camera) {\n                                    Log.d(TAG, \"Took picture\");\n                                    savePicture(data, path);\n                                    camera.release();\n                                    _imageCaptured(actionId, path);\n                                }\n                            });\n                        } catch (Exception e) {\n                            if (camera != null)\n                                camera.release();\n                            _imageCaptured(actionId, \"\");\n                            throw new RuntimeException(e);\n                        }\n                    }\n                } , 3000);\n            }\n\n            @Override public void surfaceDestroyed(SurfaceHolder holder) {}\n            @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}\n        });\n\n        WindowManager wm = (WindowManager)context\n            .getSystemService(Context.WINDOW_SERVICE);\n        WindowManager.LayoutParams params = new WindowManager.LayoutParams(\n                1, 1, //Must be at least 1x1\n                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,\n                0,\n                //Don't know if this is a safe default\n                PixelFormat.UNKNOWN);\n\n        //Don't set the preview visibility to GONE or INVISIBLE\n        wm.addView(view, params);\n    }\n\n    /** null if unable to save the file */\n    public boolean savePicture(byte[] data, String filePath) {\n        try {\n            File pictureFile = new File(filePath);\n\n            FileOutputStream fos = new FileOutputStream(pictureFile);\n            fos.write(data);\n            fos.close();\n\n            return true;\n        } catch (Exception e) {\n            return false;\n        }\n    }\n\n    private Camera openCamera(final int type) {\n        int cameraCount = 0;\n        Camera cam = null;\n        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();\n        cameraCount = Camera.getNumberOfCameras();\n\n        boolean typeFounded = false;\n        for (int camIdx = 0; camIdx < cameraCount; camIdx++) {\n            Camera.getCameraInfo(camIdx, cameraInfo);\n            if (cameraInfo.facing == type) {\n                typeFounded = true;\n                try {\n                    cam = Camera.open(camIdx);\n                } catch (RuntimeException e) {\n                    Log.e(TAG, \"Camera failed to open: \" + e.getLocalizedMessage());\n                }\n            }\n        }\n        if(!typeFounded) {\n            Log.d(TAG, \"Can't find requested camera. Try to open default camera.\");\n            try {\n                cam = Camera.open();\n            } catch (RuntimeException e) {\n                Log.e(TAG, \"Default camera failed to open: \" + e.getLocalizedMessage());\n            }\n        }\n\n        return cam;\n    }\n}\n"
  },
  {
    "path": "src/android/java/src/io/aseman/android/extra/AsemanLocationListener.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android.extra;\n\nimport io.aseman.android.AsemanApplication;\nimport io.aseman.android.AsemanActivity;\nimport io.aseman.android.AsemanService;\n\nimport android.os.Bundle;\nimport android.content.Context;\nimport android.content.ContentResolver;\nimport android.location.Address;\nimport android.location.Geocoder;\nimport android.location.Location;\nimport android.location.LocationListener;\nimport android.location.LocationManager;\nimport android.provider.Settings;\nimport android.util.Log;\nimport java.util.HashMap;\nimport java.io.IOException;\nimport java.util.List;\nimport java.util.Locale;\nimport java.lang.Runnable;\nimport android.os.Handler;\n\npublic class AsemanLocationListener\n{\n    private final int TWO_MINUTES = 1000 * 60 * 2;\n    private final String TAG = \"AsemanLocationListener\";\n    private int lastInterval = -1;\n\n    private LocationManager locationManager;\n\n    public native void _locationListened(double longitude, double latitude, double altitude, String city);\n\n    AsemanLocationListener() {\n        locationManager = (LocationManager)getContext().getSystemService(Context.LOCATION_SERVICE);\n    }\n\n    private Boolean displayGpsStatus() {\n        ContentResolver contentResolver = getContext().getContentResolver();\n        boolean gpsStatus = Settings.Secure.isLocationProviderEnabled(contentResolver, LocationManager.GPS_PROVIDER);\n        if (gpsStatus) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    public static Context getContext() {\n        if(AsemanActivity.getActivityInstance() != null)\n            return AsemanActivity.getActivityInstance();\n        else\n        if(AsemanService.getServiceInstance() != null)\n            return AsemanService.getServiceInstance();\n        else\n            return AsemanApplication.getAppContext();\n    }\n\n    public void requestLocationUpdates(final int interval) {\n        Handler mainHandler = new Handler(getContext().getMainLooper());\n        Runnable myRunnable = new Runnable() {\n            @Override\n            public void run() {\n                if(lastInterval == interval)\n                    return;\n                if(lastInterval != -1)\n                    locationManager.removeUpdates(locationListener);\n\n                lastInterval = interval;\n                if(lastInterval == -1)\n                    return;\n\n                if(displayGpsStatus())\n                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, interval, 10, locationListener);\n                else\n                    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, interval, 10, locationListener);\n            }\n        };\n        mainHandler.post(myRunnable);\n    }\n\n    public void getLastKnownLocation() {\n        Location locationGPS = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);\n        Location locationNet = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);\n\n        Location loc = locationGPS;\n        if(isBetterLocation(locationNet, loc))\n            loc = locationNet;\n\n        double longitude = loc.getLongitude();\n        double latitude = loc.getLatitude();\n\n        _locationListened(longitude, latitude, 0, \"\");\n    }\n\n    protected boolean isBetterLocation(Location location, Location currentBestLocation) {\n        if (currentBestLocation == null)\n            return true;\n        if (location == null)\n            return false;\n\n        // Check whether the new location fix is newer or older\n        long timeDelta = location.getTime() - currentBestLocation.getTime();\n        boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;\n        boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;\n        boolean isNewer = timeDelta > 0;\n\n        // If it's been more than two minutes since the current location, use the new location,\n        // because the user has likely moved.\n        if (isSignificantlyNewer) {\n            return true;\n            // If the new location is more than two minutes older, it must be worse.\n        } else if (isSignificantlyOlder) {\n            return false;\n        }\n\n        // Check whether the new location fix is more or less accurate\n        int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());\n        boolean isLessAccurate = accuracyDelta > 0;\n        boolean isMoreAccurate = accuracyDelta < 0;\n        boolean isSignificantlyLessAccurate = accuracyDelta > 200;\n\n        // Check if the old and new location are from the same provider\n        boolean isFromSameProvider = isSameProvider(location.getProvider(),\n                                                    currentBestLocation.getProvider());\n\n        // Determine location quality using a combination of timeliness and accuracy\n        if (isMoreAccurate) {\n            return true;\n        } else if (isNewer && !isLessAccurate) {\n            return true;\n        } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {\n            return true;\n        }\n        return false;\n    }\n\n    /** Checks whether two providers are the same */\n    private boolean isSameProvider(String provider1, String provider2) {\n        if (provider1 == null) {\n            return provider2 == null;\n        }\n        return provider1.equals(provider2);\n    }\n\n    /*---------- Listener class to get coordinates ------------- */\n    LocationListener locationListener = new LocationListener() {\n\n        @Override\n        public void onLocationChanged(Location loc) {\n            double longitude = loc.getLongitude();\n            double latitude = loc.getLatitude();\n\n            /*------- To get city name from coordinates -------- */\n            String cityName = null;\n\n            _locationListened(longitude, latitude, 0, cityName);\n        }\n\n        @Override\n        public void onProviderDisabled(String provider) {}\n\n        @Override\n        public void onProviderEnabled(String provider) {}\n\n        @Override\n        public void onStatusChanged(String provider, int status, Bundle extras) {}\n    };\n}\n"
  },
  {
    "path": "src/android/java-qt6/READ-THIS-BEFORE-MANUALLY-ADDING-FILES-TO-PACKAGE.txt",
    "content": "If this package is accessed by Qt Creator, certain changes can be\noverwritten without warning. In particular, Qt Creator may overwrite\nsettings which are maintained using its own UI, and files and\ndirectories containing the string \"--Managed_by_Qt_Creator--\", as well\nas native libraries whose file names begin with \"libQt5\" may be\ndeleted without warning if they are contained inside this package.\n"
  },
  {
    "path": "src/android/java-qt6/java-qt6.pro",
    "content": "TEMPLATE = aux\nCONFIG -= qt android_install\n\njavaresources.files = \\\n    $$PWD/res \\\n    $$PWD/src\n\njavaresources.path = $$[QT_INSTALL_PREFIX]/src/android/java\n\nINSTALLS += javaresources\n\n!prefix_build:!equals(OUT_PWD, $$PWD) {\n    RETURN = $$escape_expand(\\\\n\\\\t)\n    equals(QMAKE_HOST.os, Windows) {\n        RETURN = $$escape_expand(\\\\r\\\\n\\\\t)\n    }\n    OUT_PATH = $$shell_path($$OUT_PWD)\n\n    QMAKE_POST_LINK += \\\n        $${QMAKE_COPY_DIR} $$shell_path($$PWD/res) $$OUT_PATH $$RETURN \\\n        $${QMAKE_COPY_DIR} $$shell_path($$PWD/src) $$OUT_PATH\n}\n"
  },
  {
    "path": "src/android/java-qt6/src/com/hmkcode/android/image/RealPathUtil.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage com.hmkcode.android.image;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.CursorLoader;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.provider.DocumentsContract;\nimport android.provider.MediaStore;\n\npublic class RealPathUtil {\n\n\t@SuppressLint(\"NewApi\")\n\tpublic static String getRealPathFromURI_API19(Context context, Uri uri){\n\t\tString filePath = \"\";\n\t\tString wholeID = DocumentsContract.getDocumentId(uri);\n\n\t     // Split at colon, use second item in the array\n\t     String id = wholeID.split(\":\")[1];\n\n\t     String[] column = { MediaStore.Images.Media.DATA };     \n\n\t     // where id is equal to             \n\t     String sel = MediaStore.Images.Media._ID + \"=?\";\n\n\t     Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, \n\t                               column, sel, new String[]{ id }, null);\n\t     \n\t     int columnIndex = cursor.getColumnIndex(column[0]);\n\n\t     if (cursor.moveToFirst()) {\n\t         filePath = cursor.getString(columnIndex);\n\t     }   \n\n\t     cursor.close();\n\t     \n\t     return filePath;\n\t}\n\t\n\t\n\t@SuppressLint(\"NewApi\")\n\tpublic static String getRealPathFromURI_API11to18(Context context, Uri contentUri) {\n\t\t  String[] proj = { MediaStore.Images.Media.DATA };\n\t\t  String result = null;\n\t\t   \n\t\t  CursorLoader cursorLoader = new CursorLoader(\n\t\t\t\t  context, \n\t\t    contentUri, proj, null, null, null);        \n\t\t  Cursor cursor = cursorLoader.loadInBackground();\n\t\t  \n\t\t  if(cursor != null){\n\t\t   int column_index = \n\t\t     cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);\n\t\t   cursor.moveToFirst();\n\t\t   result = cursor.getString(column_index);\n\t\t  }\n\t\t    \n\t\t  return result;  \n\t}\n\t\n\tpublic static String getRealPathFromURI_BelowAPI11(Context context, Uri contentUri){\n\t\t       String[] proj = { MediaStore.Images.Media.DATA };\n\t\t       Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);\n\t\t       int column_index\n\t\t  = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);\n\t\t       cursor.moveToFirst();\n\t\t       return cursor.getString(column_index);\n\t}\n}\n"
  },
  {
    "path": "src/android/java-qt6/src/io/aseman/android/AsemanActivity.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android;\n\nimport org.qtproject.qt.android.bindings.QtActivity;\n\nimport com.hmkcode.android.image.RealPathUtil;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.os.Build;\nimport android.view.WindowManager;\nimport android.view.Window;\nimport android.view.View ;\nimport android.view.ViewTreeObserver ;\nimport android.provider.MediaStore;\nimport android.database.Cursor;\nimport android.graphics.Rect ;\nimport android.util.Log;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport android.graphics.Color;\nimport android.os.IBinder;\nimport android.content.res.Configuration;\nimport android.app.PendingIntent;\nimport android.app.Notification;\nimport android.content.res.Resources;\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimport android.app.NotificationChannel;\nimport android.graphics.Color;\nimport android.os.Build.VERSION_CODES;\nimport android.os.Build;\nimport android.os.Handler;\n\n//import com.google.android.gms.common.api.GoogleApiClient;\n//import com.google.android.gms.common.api.GoogleSignInOptions;\n\npublic class AsemanActivity extends QtActivity\n{\n    private static AsemanActivity instance;\n    private int keyboardExtraHeight = 0;\n\n    public boolean _transparentStatusBar = false;\n    public boolean _transparentNavigationBar = false;\n    public static final int SELECT_IMAGE = 1;\n\n    private static NotificationManager m_notificationManager;\n    private static Notification.Builder m_builder;\n\n    boolean _storeHasFound;\n    String _storeManagerLastPurchaseSku;\n\n    public AsemanActivity() {\n        AsemanActivity.instance = this;\n    }\n\n    public static AsemanActivity getActivityInstance() {\n        return AsemanActivity.instance;\n    }\n\n    public boolean transparentStatusBar() {\n        return _transparentStatusBar;\n    }\n\n    public boolean transparentNavigationBar() {\n        return _transparentNavigationBar;\n    }\n\n    public String createNotificationChannel(String channelId ,String channelName, int importance){\n        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            NotificationChannel chan = new NotificationChannel(channelId,\n                    channelName, importance);\n            chan.setLightColor(Color.BLUE);\n            chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);\n            NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);\n            manager.createNotificationChannel(chan);\n            return channelId;\n        } else {\n            return \"\";\n        }\n    }\n\n    public boolean startNotification(int id, String title, String body, String iconPath, String icon, String channelId, boolean sound, boolean vibrate)\n    {\n        Resources R = getResources();\n        if (m_notificationManager == null) {\n            m_notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);\n        }\n\n        Intent notificationIntent = new Intent(this, AsemanActivity.class);\n        PendingIntent pendingIntent =\n                PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);\n\n        int detaults = 0;\n        if(sound) detaults |= Notification.DEFAULT_SOUND;\n        if(vibrate) detaults |= Notification.DEFAULT_VIBRATE;\n\n        Notification.Builder builder = new Notification.Builder(this);\n        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) builder.setChannelId(channelId);\n\n        Notification notification =\n            builder\n            .setContentTitle(title)\n            .setContentText(body)\n            .setSmallIcon(R.getIdentifier(icon, iconPath, getPackageName()))\n            .setContentIntent(pendingIntent)\n            .setAutoCancel(true)\n            .setDefaults(detaults)\n            .build();\n\n        m_notificationManager.notify(id, notification);\n        return true;\n    }\n\n    public boolean stopNotification(int id)\n    {\n        if (m_notificationManager == null) {\n            m_notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);\n        }\n        m_notificationManager.cancel(id);\n        return true;\n    }\n\n    boolean setLayoutNoLimit(boolean stt)\n    {\n        Window w = getWindow();\n        if(stt) {\n            w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);\n            _transparentStatusBar = true;\n        } else {\n            w.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);\n            _transparentStatusBar = false;\n        }\n        _transparentNavigationBar = false;\n\n        return true;\n    }\n\n    boolean setStatusBarColor(int color)\n    {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)\n            return false;\n\n//        Window w = getWindow();\n//        w.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);\n//        w.setStatusBarColor(color);\n\n        return true;\n    }\n\n    boolean setTransparentStatusBar(boolean stt)\n    {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)\n            return false;\n\n        Window w = getWindow();\n        if(stt) {\n            w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n            _transparentStatusBar = true;\n        } else {\n            w.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n            _transparentStatusBar = false;\n        }\n\n        return true;\n    }\n\n    boolean setTransparentNavigationBar(boolean stt)\n    {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)\n            return false;\n\n        Window w = getWindow();\n        if(stt) {\n            w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);\n            _transparentNavigationBar = true;\n        } else {\n            w.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);\n            _transparentNavigationBar = false;\n        }\n\n        return true;\n    }\n\n    public void setKeepScreenOn(boolean status) {\n        Window window = getWindow();\n        if (status)\n            window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);\n        else\n            window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);\n    }\n\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data)\n    {\n        if (resultCode == RESULT_OK) {\n            if (requestCode == AsemanActivity.SELECT_IMAGE) {\n                Uri selectedImageUri = data.getData();\n                AsemanJavaLayer.selectImageResult( getPath(selectedImageUri) );\n            }\n        }\n\n        super.onActivityResult(requestCode, resultCode, data);\n    }\n\n    public String getPath(Uri uri) {\n        try {\n            String realPath;\n            // SDK < API11\n            if (Build.VERSION.SDK_INT < 11)\n                    realPath = RealPathUtil.getRealPathFromURI_BelowAPI11(this, uri);\n            // SDK >= 11 && SDK < 19\n            else if (Build.VERSION.SDK_INT < 19)\n                    realPath = RealPathUtil.getRealPathFromURI_API11to18(this, uri);\n            // SDK > 19 (Android 4.4)\n            else\n                realPath = RealPathUtil.getRealPathFromURI_API19(this, uri);\n            return realPath;\n        } catch(Exception e) {\n            String selectedImagePath;\n            String[] projection = { MediaStore.Images.Media.DATA };\n            Cursor cursor = managedQuery(uri, projection, null, null, null);\n            if(cursor != null){\n                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);\n                cursor.moveToFirst();\n                selectedImagePath = cursor.getString(column_index);\n            }else{\n                selectedImagePath = null;\n            }\n\n            if(selectedImagePath == null){\n                selectedImagePath = uri.getPath();\n            }\n            return selectedImagePath;\n        }\n    }\n\n    @Override\n    public void onCreate(Bundle savedInstanceState)\n    {\n        Window w = getWindow();\n        int resID = getResources().getIdentifier(\"splash\" , \"drawable\", getPackageName());\n        if(resID != 0)\n            w.setBackgroundDrawableResource(resID);\n\n//        setTransparentNavigationBar(true);\n        if( !setTransparentStatusBar(true) )\n            setLayoutNoLimit(true);\n\n        super.onCreate(savedInstanceState);\n        final View dview = w.getDecorView();\n        dview.getRootView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){\n            public void onGlobalLayout(){\n                  Rect r = new Rect();\n                  dview.getWindowVisibleDisplayFrame(r);\n\n                  int screenHeight = dview.getRootView().getHeight();\n                  int heightDifference = screenHeight - (r.bottom - r.top);\n                  if(heightDifference > screenHeight/4) {\n                      AsemanJavaLayer.keyboardVisiblityChanged(heightDifference - keyboardExtraHeight);\n                  } else {\n                      keyboardExtraHeight = heightDifference;\n                      AsemanJavaLayer.keyboardVisiblityChanged(0);\n                  }\n               }\n         });\n\n         Intent intent = getIntent();\n         Handler handler = new Handler();\n         handler.postDelayed(new Runnable() {\n             @Override\n             public void run() {\n                 checkIntent(intent);\n             }\n         }, 3000);\n    }\n\n    @Override\n    protected void onNewIntent(Intent intent)\n    {\n        super.onNewIntent(intent);\n        checkIntent(intent);\n    }\n\n    protected void checkIntent(Intent intent)\n    {\n        Uri data = intent.getData();\n        if (data != null) {\n            AsemanJavaLayer.sendDeepLink(data.toString());\n        }\n\n        String action = intent.getAction();\n        String type = intent.getType();\n        if ( !Intent.ACTION_SEND.equals(action) || type == null)\n            return;\n\n        if (\"text/plain\".equals(type))\n            AsemanJavaLayer.sendNote(intent.getStringExtra(Intent.EXTRA_SUBJECT), intent.getStringExtra(Intent.EXTRA_TEXT) );\n        else\n        if(\"image/png\".equals(type) || \"image/jpeg\".equals(type))\n            AsemanJavaLayer.sendImage( (Uri)intent.getExtras().get(Intent.EXTRA_STREAM) );\n    }\n\n    @Override\n    protected void onStart()\n    {\n        super.onStart();\n        AsemanJavaLayer.activityStarted();\n    }\n\n    @Override\n    protected void onRestart()\n    {\n        super.onRestart();\n        AsemanJavaLayer.activityRestarted();\n    }\n\n    @Override\n    protected void onResume()\n    {\n        super.onResume();\n        AsemanJavaLayer.activityResumed();\n    }\n\n    @Override\n    protected void onPause()\n    {\n        AsemanJavaLayer.activityPaused();\n        super.onPause();\n    }\n\n    @Override\n    protected void onStop()\n    {\n        AsemanJavaLayer.activityStopped();\n        super.onStop();\n    }\n\n    @Override\n    protected void onDestroy()\n    {\n        AsemanJavaLayer.activityDestroyed();\n        super.onDestroy();\n    }\n}\n"
  },
  {
    "path": "src/android/java-qt6/src/io/aseman/android/AsemanApplication.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android;\n\nimport org.qtproject.qt.android.bindings.QtApplication;\n\nimport android.app.Application;\nimport android.content.Intent;\nimport android.content.Context;\n\npublic class AsemanApplication extends QtApplication\n{\n    private static Context context;\n    private static Application app_instance = null;\n\n    public void onCreate(){\n        super.onCreate();\n        app_instance = this;\n        AsemanApplication.context = getApplicationContext();\n    }\n\n    public static Context getAppContext() {\n        return AsemanApplication.context;\n    }\n\n    public static Context instance() {\n        return app_instance;\n    }\n}\n"
  },
  {
    "path": "src/android/java-qt6/src/io/aseman/android/AsemanBootBroadcast.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\n\nimport io.aseman.android.AsemanService;\n\npublic class AsemanBootBroadcast extends BroadcastReceiver {\n    @Override\n    public void onReceive(Context ctx, Intent intent) {\n        if(intent.getAction().equalsIgnoreCase(Intent.ACTION_BOOT_COMPLETED)) {\n            Intent i = new Intent(ctx, AsemanService.class);\n            i.putExtra(\"name\", \"SurvivingwithAndroid\");\n            try {\n                ctx.startService(i);\n            } catch(Exception e) {\n                return;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/android/java-qt6/src/io/aseman/android/AsemanJavaLayer.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android;\n\nimport io.aseman.android.AsemanApplication;\nimport io.aseman.android.AsemanActivity;\nimport io.aseman.android.AsemanQtService;\n\nimport org.qtproject.qt.android.bindings.QtService;\n\nimport android.util.Log;\nimport android.content.Intent;\nimport android.content.Context;\nimport android.app.Activity;\nimport android.net.Uri;\nimport android.util.DisplayMetrics;\nimport android.provider.MediaStore;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.text.TextUtils;\nimport android.view.WindowManager;\nimport android.os.Build;\nimport android.content.res.Configuration;\nimport android.view.View;\nimport android.view.Window;\nimport android.graphics.Rect;\nimport android.provider.Settings.Secure;\nimport java.lang.Runnable;\nimport android.os.Handler;\nimport android.database.Cursor;\nimport android.provider.ContactsContract;\nimport android.content.ContentResolver;\nimport androidx.core.content.FileProvider;\n\nimport java.io.File;\nimport java.io.InputStream;\nimport java.io.FileOutputStream;\n\nimport android.app.ActivityManager.RunningAppProcessInfo;\nimport android.app.ActivityManager ;\nimport android.os.Process;\nimport java.util.List;\nimport java.util.Iterator;\n\nimport org.json.JSONArray;\nimport org.json.JSONObject;\n\n//import com.google.android.gms.auth.api.signin.GoogleSignInOptions;\n\npublic class AsemanJavaLayer\n{\n    private static native void _sendNote( String title, String msg );\n    private static native void _sendImage( String path );\n    private static native void _sendDeepLink(String link);\n    private static native void _activityPaused();\n    private static native void _activityStopped();\n    private static native void _activityResumed();\n    private static native void _activityStarted();\n    private static native void _activityRestarted();\n    private static native void _activityDestroyed();\n    private static native void _selectImageResult( String path );\n    private static native void _keyboardVisiblityChanged(int height);\n    private static boolean implemented = false;\n\n    public AsemanJavaLayer() {\n    }\n\n    public static void activityPaused(){\n        if(implemented)\n            _activityPaused();\n    }\n\n    public static void activityStopped(){\n        if(implemented)\n            _activityStopped();\n    }\n\n    public static void activityResumed(){\n        if(implemented)\n            _activityResumed();\n    }\n\n    public static void activityStarted(){\n        if(implemented)\n            _activityStarted();\n    }\n\n    public static void activityRestarted(){\n        if(implemented)\n            _activityRestarted();\n    }\n\n    public static void activityDestroyed(){\n        if(implemented)\n            _activityDestroyed();\n    }\n\n    public static void keyboardVisiblityChanged(int height){\n        if(implemented)\n            _keyboardVisiblityChanged(height);\n    }\n\n    public static void sendDeepLink(String link){\n        if(implemented)\n            _sendDeepLink(link);\n    }\n\n    public static void sendNote( String title, String msg ) {\n        if( title == null )\n            title = \"\";\n        if( msg == null )\n            msg = \"\";\n\n        if(implemented)\n            _sendNote(title,msg);\n    }\n\n    public static void setKeepScreenOn(boolean status) {\n        final boolean fstatus = status;\n        final AsemanActivity activtiy = AsemanActivity.getActivityInstance();\n        Handler mainHandler = new Handler(activtiy.getMainLooper());\n        Runnable myRunnable = new Runnable() {\n            @Override\n            public void run() {\n                activtiy.setKeepScreenOn(fstatus);\n            }\n        };\n        mainHandler.post(myRunnable);\n    }\n\n    public static int menuHeight()\n    {\n        Rect r = new Rect();\n        Window window = AsemanActivity.getActivityInstance().getWindow();\n        View rootview = window.getDecorView();\n        rootview.getWindowVisibleDisplayFrame(r);\n\n        return r.top;\n    }\n\n    public static void sendImage( Uri data ) {\n        String imagePath = \"/sdcard/Aseman/tmp_input_image.jpg\";\n\n        File file = new File(imagePath);\n        file.delete();\n\n        try {\n            InputStream stream = AsemanApplication.instance().getContentResolver().openInputStream(data);\n            Bitmap bitmap = BitmapFactory.decodeStream(stream);\n            stream.close();\n\n            FileOutputStream out = new FileOutputStream(imagePath);\n            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);\n            out.close();\n        } catch(Exception e) {\n            return;\n        }\n\n        if(implemented)\n            _sendImage(imagePath);\n    }\n\n    public static void selectImageResult( String path ) {\n        if( path == null )\n            path = \"\";\n\n        if(implemented)\n            _selectImageResult(path);\n    }\n\n    public String packageName()\n    {\n        Context oContext;\n        oContext = AsemanApplication.getAppContext();\n        return oContext.getPackageName();\n    }\n\n    public String deviceName() {\n        String manufacturer = Build.MANUFACTURER;\n        String model = Build.MODEL;\n        if (model.startsWith(manufacturer)) {\n            return capitalize(model);\n        } else {\n            return capitalize(manufacturer) + \" \" + model;\n        }\n    }\n\n    boolean setImplemented(boolean stt) {\n        implemented = stt;\n        return true;\n    }\n\n    public String deviceId() {\n        return Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID);\n    }\n\n\n    private String capitalize(String s) {\n        if (s == null || s.length() == 0) {\n            return \"\";\n        }\n        char first = s.charAt(0);\n        if (Character.isUpperCase(first)) {\n            return s;\n        } else {\n            return Character.toUpperCase(first) + s.substring(1);\n        }\n    }\n\n    public static Context getContext() {\n        if(AsemanActivity.getActivityInstance() != null)\n            return AsemanActivity.getActivityInstance();\n        else\n        if(AsemanQtService.getServiceInstance() != null)\n            return AsemanQtService.getServiceInstance();\n        else\n            return AsemanApplication.getAppContext();\n    }\n\n    public String getLastImages(int offset, int count)\n    {\n        String result = new String();\n        final String[] imageColumns = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA };\n        final String imageOrderBy = MediaStore.Images.Media._ID + \" DESC\";\n        Cursor imageCursor = getContext().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy);\n        imageCursor.moveToFirst();\n        do {\n            String fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));\n            File imageFile = new File(fullPath);\n            if (imageFile.canRead() && imageFile.exists()) {\n                offset--;\n                if(offset >= 0) {\n                    imageCursor.moveToNext();\n                    continue;\n                }\n\n                result = result + fullPath + \"\\n\";\n                count--;\n                if(count <= 0)\n                break;\n            }\n        } while (imageCursor.moveToNext());\n\n        return result;\n    }\n\n    boolean killService(String serviceName)\n    {\n        Context oContext;\n        oContext = AsemanApplication.getAppContext();\n        ActivityManager am = (ActivityManager) oContext.getSystemService(oContext.ACTIVITY_SERVICE);\n        List<RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();\n\n        Iterator<RunningAppProcessInfo> iter = runningAppProcesses.iterator();\n\n        while(iter.hasNext()){\n            RunningAppProcessInfo next = iter.next();\n\n            String pricessName = oContext.getPackageName() + serviceName;\n\n            if(next.processName.equals(pricessName)){\n                Process.killProcess(next.pid);\n                break;\n            }\n        }\n\n        return true;\n    }\n\n    boolean startQtService()\n    {\n        Context oContext;\n        oContext = AsemanApplication.getAppContext();\n        Intent i = new Intent(oContext, AsemanQtService.class);\n        i.putExtra(\"name\", \"SurvivingwithAndroid\");\n        try {\n            oContext.startService(i);\n        } catch(Exception e) {\n            return false;\n        }\n\n        return true;\n    }\n\n    boolean stopQtService()\n    {\n        Context oContext;\n        oContext = AsemanApplication.getAppContext();\n        Intent i = new Intent(oContext, AsemanQtService.class);\n        try {\n        oContext.stopService(i);\n        } catch(Exception e) {\n            return false;\n        }\n        return true;\n    }\n\n    boolean sharePaper( String title, String msg )\n    {\n        Context oContext;\n        oContext = AsemanApplication.getAppContext();\n\n        Intent intent = new Intent(Intent.ACTION_SEND);\n        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        intent.setType(\"text/plain\");\n        intent.putExtra(Intent.EXTRA_TEXT, msg);\n        intent.putExtra(Intent.EXTRA_SUBJECT, title);\n\n        try {\n            oContext.startActivity(intent);\n        } catch(Exception e) {\n            return false;\n        }\n        return true;\n    }\n\n    boolean shareFile(String path, String type)\n    {\n        Context oContext;\n        oContext = AsemanApplication.getAppContext();\n\n        File file = new File(path);\n        Uri photoURI = FileProvider.getUriForFile(oContext, oContext.getApplicationContext().getPackageName() + \".provider\", file);\n\n        Intent intent = new Intent(Intent.ACTION_SEND);\n        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);\n        intent.setType(type);\n        intent.putExtra(Intent.EXTRA_STREAM, photoURI);\n\n        try {\n\n            Intent new_intent = Intent.createChooser(intent , \"Share Via\");\n            new_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n            oContext.startActivity(new_intent);\n\n        } catch(Exception e) {\n            Log.e(\"Share File\" , \"Exception:\" , e);\n            return false;\n        }\n        return true;\n    }\n\n\n    boolean openFile( String path, String type )\n    {\n        Context oContext;\n        oContext = AsemanApplication.getAppContext();\n\n        File file = new File(path);\n        Uri photoURI = FileProvider.getUriForFile(oContext, oContext.getApplicationContext().getPackageName() + \".provider\", file);\n\n        Intent intent = new Intent(android.content.Intent.ACTION_VIEW);\n        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);\n        intent.setType(type);\n        intent.setDataAndType(photoURI,type);\n\n        try {\n            oContext.startActivity(intent);\n        } catch(Exception e) {\n            Log.e(\"Open File\" , \"Exception:\" , e);\n            return false;\n        }\n        return true;\n    }\n\n    DisplayMetrics getMetrics()\n    {\n        DisplayMetrics dm = new DisplayMetrics();\n        try {\n            AsemanActivity.getActivityInstance().getWindowManager().getDefaultDisplay().getMetrics(dm);\n        } catch(Exception e) {\n            return dm;\n        }\n        return dm;\n    }\n\n    double lcdDpiX()\n    {\n        return getMetrics().densityDpi;\n    }\n\n    int densityDpi()\n    {\n        return getMetrics().densityDpi;\n    }\n\n    float density()\n    {\n        return getMetrics().density;\n    }\n\n    int screenSizeWidth()\n    {\n        return getMetrics().widthPixels;\n    }\n\n    int screenSizeHeight()\n    {\n        return getMetrics().heightPixels;\n    }\n\n    int statusBarHeight() {\n        int result = 0;\n        Context context = AsemanApplication.getAppContext();\n        int resourceId = context.getResources().getIdentifier(\"status_bar_height\", \"dimen\", \"android\");\n        if (resourceId > 0) {\n            result = context.getResources().getDimensionPixelSize(resourceId);\n        }\n        return result;\n    }\n\n    int navigationBarHeight() {\n        int result = 0;\n        Context context = AsemanApplication.getAppContext();\n        int resourceId = context.getResources().getIdentifier(\"navigation_bar_height\", \"dimen\", \"android\");\n        if (resourceId > 0) {\n            return context.getResources().getDimensionPixelSize(resourceId);\n        }\n        return 0;\n    }\n\n    boolean isTablet()\n    {\n        Context context = AsemanApplication.getAppContext();\n        return (context.getResources().getConfiguration().screenLayout\n                & Configuration.SCREENLAYOUT_SIZE_MASK)\n                >= Configuration.SCREENLAYOUT_SIZE_LARGE;\n    }\n\n    int getSizeName()\n    {\n        Context context = AsemanApplication.getAppContext();\n        int screenLayout = context.getResources().getConfiguration().screenLayout;\n        screenLayout &= Configuration.SCREENLAYOUT_SIZE_MASK;\n\n        switch (screenLayout) {\n        case Configuration.SCREENLAYOUT_SIZE_SMALL:\n            return 0;\n        case Configuration.SCREENLAYOUT_SIZE_NORMAL:\n            return 1;\n        case Configuration.SCREENLAYOUT_SIZE_LARGE:\n            return 2;\n        case 4: // Configuration.SCREENLAYOUT_SIZE_XLARGE is API >= 9\n            return 3;\n        default:\n            return -1;\n        }\n    }\n\n    boolean getOpenPictures()\n    {\n        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);\n        intent.setType(\"image/*\");\n\n        try {\n            AsemanActivity.getActivityInstance().startActivityForResult(intent, AsemanActivity.SELECT_IMAGE);\n        } catch(Exception e) {\n            return false;\n        }\n\n        return true;\n    }\n\n    boolean startCamera( String output )\n    {\n        Intent intent = new Intent(\"android.media.action.IMAGE_CAPTURE\");\n        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(output)));\n\n        try {\n            AsemanActivity.getActivityInstance().startActivityForResult(intent, 0);\n        } catch(Exception e) {\n            return false;\n        }\n        return true;\n    }\n\n    boolean callNumber( String number )\n    {\n        Intent intent = new Intent(Intent.ACTION_CALL);\n        intent.setData(Uri.parse(\"tel:\" + number));\n\n        try {\n            AsemanActivity.getActivityInstance().startActivity(intent);\n        } catch(Exception e) {\n            return false;\n        }\n        return true;\n    }\n\n    boolean transparentStatusBar()\n    {\n        return AsemanActivity.getActivityInstance().transparentStatusBar();\n    }\n\n    boolean transparentNavigationBar()\n    {\n        return AsemanActivity.getActivityInstance().transparentNavigationBar();\n    }\n\n    boolean release()\n    {\n        return true;\n    }\n\n    boolean setTransparentNavigationBar(boolean stt)\n    {\n        final boolean _stt = stt;\n        Handler mainHandler = new Handler(AsemanActivity.getActivityInstance().getMainLooper());\n        Runnable myRunnable = new Runnable() {\n            @Override\n            public void run() {\n                AsemanActivity.getActivityInstance().setTransparentNavigationBar(_stt);\n            }\n        };\n        mainHandler.post(myRunnable);\n        return true;\n    }\n\n    boolean setTransparentStatusBar(boolean stt)\n    {\n        final boolean _stt = stt;\n        Handler mainHandler = new Handler(AsemanActivity.getActivityInstance().getMainLooper());\n        Runnable myRunnable = new Runnable() {\n            @Override\n            public void run() {\n                AsemanActivity.getActivityInstance().setTransparentStatusBar(_stt);\n            }\n        };\n        mainHandler.post(myRunnable);\n        return true;\n    }\n\n    public String createNotificationChannel(String channelId ,String channelName, int importance){\n        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            if(AsemanActivity.getActivityInstance() != null)\n                return AsemanActivity.getActivityInstance().createNotificationChannel(channelId, channelName, importance);\n            else\n            if(AsemanQtService.getServiceInstance() != null)\n                return AsemanQtService.getServiceInstance().createNotificationChannel(channelId, channelName, importance);\n        } else {\n            return \"\";\n        }\n        return channelId;\n    }\n\n    boolean startForeground(int id, String title, String body, String iconPath, String icon, String channelId)\n    {\n        if(AsemanQtService.getServiceInstance() != null)\n            return AsemanQtService.getServiceInstance().startForeground(id, title, body, iconPath, icon, channelId);\n        return false;\n    }\n\n    boolean stopForeground(boolean removeNotification)\n    {\n        if(AsemanQtService.getServiceInstance() != null) {\n            AsemanQtService.getServiceInstance().stopForeground(removeNotification);\n            return true;\n        }\n        return false;\n    }\n\n    boolean startNotification(int id, String title, String body, String iconPath, String icon, String channelId, boolean sound, boolean vibrate)\n    {\n        if(AsemanActivity.getActivityInstance() != null)\n            return AsemanActivity.getActivityInstance().startNotification(id, title, body, iconPath, icon, channelId, sound, vibrate);\n        else\n        if(AsemanQtService.getServiceInstance() != null)\n            return AsemanQtService.getServiceInstance().startNotification(id, title, body, iconPath, icon, channelId, sound, vibrate);\n        return false;\n    }\n\n    boolean stopNotification(int id)\n    {\n        if(AsemanActivity.getActivityInstance() != null)\n            return AsemanActivity.getActivityInstance().stopNotification(id);\n        else\n        if(AsemanQtService.getServiceInstance() != null)\n            return AsemanQtService.getServiceInstance().stopNotification(id);\n        return false;\n    }\n\n    String getContactList() {\n        Context ctx = getContext();\n        ContentResolver cr = ctx.getContentResolver();\n        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,\n                null, null, null, null);\n\n        JSONArray jsonArray = new JSONArray();\n\n        if ((cur != null ? cur.getCount() : 0) > 0) {\n            while (cur != null && cur.moveToNext()) {\n                String id = cur.getString(\n                        cur.getColumnIndex(ContactsContract.Contacts._ID));\n                String name = cur.getString(cur.getColumnIndex(\n                        ContactsContract.Contacts.DISPLAY_NAME));\n\n                if (cur.getInt(cur.getColumnIndex(\n                        ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {\n                    Cursor pCur = cr.query(\n                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,\n                            null,\n                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + \" = ?\",\n                            new String[]{id}, null);\n                    while (pCur.moveToNext()) {\n                        String phoneNo = pCur.getString(pCur.getColumnIndex(\n                                ContactsContract.CommonDataKinds.Phone.NUMBER));\n\n                        JSONObject obj = new JSONObject();\n                        try {\n                            obj.put(\"id\", id);\n                            obj.put(\"name\", name);\n                            obj.put(\"phone\", phoneNo);\n\n                            jsonArray.put(obj);\n                        } catch (Exception e) {\n                        }\n                    }\n                    pCur.close();\n                }\n            }\n        }\n        if(cur!=null){\n            cur.close();\n        }\n\n        return jsonArray.toString();\n    }\n\n//    public static String getUniquePsuedoID() {\n//        String m_szDevIDShort = \"35\" + (Build.BOARD.length() % 10) + (Build.BRAND.length() % 10) + (Build.CPU_ABI.length() % 10) + (Build.DEVICE.length() % 10) + (Build.MANUFACTURER.length() % 10) + (Build.MODEL.length() % 10) + (Build.PRODUCT.length() % 10);\n//        String serial = null;\n//        try {\n//            serial = android.os.Build.class.getField(\"SERIAL\").get(null).toString();\n//            return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();\n//        } catch (Exception exception) {\n//            serial = \"3077139d-9dde-4ee1-afb5-ecc43f5d1524\";\n//        }\n//        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();\n//    }\n\n//    boolean googleSignIn(String clientId)\n//    {\n//        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)\n//            .requestIdToken(getString(clientId))\n//            .build();\n//    }\n}\n"
  },
  {
    "path": "src/android/java-qt6/src/io/aseman/android/AsemanMultimedia.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.net.Uri;\nimport android.provider.MediaStore;\nimport android.database.Cursor;\nimport android.graphics.Rect ;\nimport android.util.Log;\nimport java.util.Iterator;\nimport org.json.JSONArray;\nimport org.json.JSONObject;\n\nimport io.aseman.android.AsemanActivity;\n\npublic class AsemanMultimedia\n{\n    private static boolean implemented = false;\n\n    private static String[] albumsProjection = {\n        MediaStore.Audio.Albums._ID,\n        MediaStore.Audio.Albums.ARTIST,\n        MediaStore.Audio.Albums.ALBUM,\n        MediaStore.Audio.Albums.ALBUM_ART,\n        MediaStore.Audio.Albums.NUMBER_OF_SONGS,\n        MediaStore.Audio.Albums.ARTIST_ID\n    };\n    private static String[] musicsProjection = {\n        MediaStore.Audio.Media._ID,\n        MediaStore.Audio.Media.ARTIST,\n        MediaStore.Audio.Media.ALBUM,\n        MediaStore.Audio.Media.YEAR,\n        MediaStore.Audio.Media.TITLE,\n        MediaStore.Audio.Media.DATA,\n        MediaStore.Audio.Media.DISPLAY_NAME,\n        MediaStore.Audio.Media.DURATION,\n        MediaStore.Audio.Media.ARTIST_ID,\n        MediaStore.Audio.Media.ALBUM_ID\n    };\n    private static String[] artistsProjection = {\n        MediaStore.Audio.Artists._ID,\n        MediaStore.Audio.Artists.ARTIST\n    };\n\n    private String cursorToMusicJson(Cursor cursor) {\n        JSONArray jsonArray = new JSONArray();\n        while(cursor.moveToNext()){\n\n            JSONObject obj = new JSONObject();\n            try {\n                obj.put(\"id\", cursor.getString(0));\n                obj.put(\"artist\", cursor.getString(1));\n                obj.put(\"album\", cursor.getString(2));\n                obj.put(\"art\", cursor.getString(3));\n                obj.put(\"title\", cursor.getString(4));\n                obj.put(\"data\", cursor.getString(5));\n                obj.put(\"displayName\", cursor.getString(6));\n                obj.put(\"duration\", cursor.getString(7));\n                obj.put(\"artistID\", cursor.getString(8));\n                obj.put(\"albumID\", cursor.getString(9));\n\n                jsonArray.put(obj);\n            } catch (Exception e) {\n            }\n        }\n\n        return jsonArray.toString();\n    }\n\n    private String cursorToAlbumJson(Cursor cursor) {\n        JSONArray jsonArray = new JSONArray();\n        while(cursor.moveToNext()){\n\n            JSONObject obj = new JSONObject();\n            try {\n                obj.put(\"id\", cursor.getString(0));\n                obj.put(\"artist\", cursor.getString(1));\n                obj.put(\"album\", cursor.getString(2));\n                obj.put(\"art\", cursor.getString(3));\n                obj.put(\"songs\", cursor.getString(4));\n                obj.put(\"artistId\", cursor.getString(5));\n\n                jsonArray.put(obj);\n            } catch (Exception e) {\n            }\n        }\n\n        return jsonArray.toString();\n    }\n\n    private String cursorToArtistJson(Cursor cursor) {\n        JSONArray jsonArray = new JSONArray();\n        while(cursor.moveToNext()){\n\n            JSONObject obj = new JSONObject();\n            try {\n                obj.put(\"id\", cursor.getString(0));\n                obj.put(\"artist\", cursor.getString(1));\n\n                jsonArray.put(obj);\n            } catch (Exception e) {\n            }\n        }\n\n        return jsonArray.toString();\n    }\n\n    public String getAllMusics() {\n        String selection = MediaStore.Audio.Media.IS_MUSIC + \" != 0\";\n\n        Cursor cursor;\n        try {\n            cursor = AsemanActivity.getActivityInstance().managedQuery(\n                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,\n                musicsProjection,\n                selection,\n                null,\n                null);\n        } catch (Exception e) {\n            return \"\";\n        }\n\n        return cursorToMusicJson(cursor);\n    }\n\n    public String getAllAlbums() {\n        String selection = MediaStore.Audio.Albums._ID + \" != 0\";\n\n        Cursor cursor;\n        try {\n            cursor = AsemanActivity.getActivityInstance().managedQuery(\n                MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,\n                albumsProjection,\n                selection,\n                null,\n                null);\n        } catch (Exception e) {\n            return \"\";\n        }\n\n        return cursorToAlbumJson(cursor);\n    }\n\n    public String getAllArtists() {\n        String selection = MediaStore.Audio.Artists._ID + \" != 0\";\n\n        Cursor cursor;\n        try {\n            cursor = AsemanActivity.getActivityInstance().managedQuery(\n                MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,\n                artistsProjection,\n                selection,\n                null,\n                null);\n        } catch (Exception e) {\n            return \"\";\n        }\n\n        return cursorToArtistJson(cursor);\n    }\n\n    public String getArtistAlbums(String artistId) {\n        String selection = MediaStore.Audio.Albums.ARTIST_ID + \" = \" + artistId;\n\n        Cursor cursor;\n        try {\n            cursor = AsemanActivity.getActivityInstance().managedQuery(\n                MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,\n                albumsProjection,\n                selection,\n                null,\n                null);\n        } catch (Exception e) {\n            return \"\";\n        }\n\n        return cursorToAlbumJson(cursor);\n    }\n\n    public String getArtistSongs(String artistId) {\n        String selection = MediaStore.Audio.Media.ARTIST_ID + \" = \" + artistId;\n\n        Cursor cursor;\n        try {\n            cursor = AsemanActivity.getActivityInstance().managedQuery(\n                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,\n                musicsProjection,\n                selection,\n                null,\n                null);\n        } catch (Exception e) {\n            return \"\";\n        }\n\n        return cursorToMusicJson(cursor);\n    }\n\n    public String getAlbumSongs(String albumId) {\n        String selection = MediaStore.Audio.Media.ALBUM_ID + \" = \" + albumId;\n\n        Cursor cursor;\n        try {\n            cursor = AsemanActivity.getActivityInstance().managedQuery(\n                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,\n                musicsProjection,\n                selection,\n                null,\n                null);\n        } catch (Exception e) {\n            return \"\";\n        }\n\n        return cursorToMusicJson(cursor);\n    }\n\n    public boolean setImplemented(boolean stt) {\n        implemented = stt;\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/android/java-qt6/src/io/aseman/android/AsemanQtService.java",
    "content": "/*\n    Copyright (c) 2016, BogDan Vatra <bogdan@kde.org>\n    Contact: http://www.qt.io/licensing/\n\n    Commercial License Usage\n    Licensees holding valid commercial Qt licenses may use this file in\n    accordance with the commercial license agreement provided with the\n    Software or, alternatively, in accordance with the terms contained in\n    a written agreement between you and The Qt Company. For licensing terms\n    and conditions see http://www.qt.io/terms-conditions. For further\n    information use the contact form at http://www.qt.io/contact-us.\n\n    BSD License Usage\n    Alternatively, this file may be used under the BSD license as follows:\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n    1. Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n    2. Redistributions in binary form must reproduce the above copyright\n    notice, this list of conditions and the following disclaimer in the\n    documentation and/or other materials provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n    IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n    NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n    THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\npackage io.aseman.android;\n\nimport android.app.Service;\nimport android.content.Intent;\nimport android.content.res.Configuration;\nimport android.os.IBinder;\nimport android.app.PendingIntent;\nimport android.app.Notification;\nimport android.content.res.Resources;\nimport io.aseman.android.AsemanActivity;\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimport android.content.res.Resources;\nimport android.content.Context;\nimport android.app.NotificationChannel;\nimport android.graphics.Color;\nimport android.os.Build.VERSION_CODES;\nimport android.os.Build;\n\nimport org.qtproject.qt.android.bindings.QtService;\n\npublic class AsemanQtService extends QtService {\n\n    private static NotificationManager m_notificationManager;\n    private static Notification.Builder m_builder;\n    private static AsemanQtService m_instance = null;\n\n    public static AsemanQtService getServiceInstance() {\n        return AsemanQtService.m_instance;\n    }\n\n    @Override\n    public void onCreate() {\n        m_instance = this;\n        super.onCreate();\n    }\n\n    public String createNotificationChannel(String channelId ,String channelName, int importance){\n        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            NotificationChannel chan = new NotificationChannel(channelId,\n                    channelName, importance);\n            chan.setLightColor(Color.BLUE);\n            chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);\n            NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);\n            manager.createNotificationChannel(chan);\n            return channelId;\n        } else {\n            return \"\";\n        }\n    }\n\n    public boolean startForeground(int id, String title, String msg, String iconPath, String icon, String channelId) {\n        Intent notificationIntent = new Intent(this, AsemanActivity.class);\n        PendingIntent pendingIntent =\n                PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);\n\n        Resources R = getResources();\n\n        Notification.Builder builder = new Notification.Builder(this);\n        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) builder.setChannelId(channelId);\n        Notification notification =\n            builder\n            .setContentTitle(title)\n            .setContentText(msg)\n            .setSmallIcon(R.getIdentifier(icon, iconPath, getPackageName()))\n            .setContentIntent(pendingIntent)\n            .build();\n\n        startForeground(id, notification);\n        return true;\n    }\n\n    public boolean startNotification(int id, String title, String body, String iconPath, String icon, String channelId, boolean sound, boolean vibrate)\n    {\n        Resources R = getResources();\n        if (m_notificationManager == null) {\n            m_notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);\n        }\n\n        Intent notificationIntent = new Intent(this, AsemanActivity.class);\n        PendingIntent pendingIntent =\n                PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);\n\n        int detaults = 0;\n        if(sound) detaults |= Notification.DEFAULT_SOUND;\n        if(vibrate) detaults |= Notification.DEFAULT_VIBRATE;\n\n        Notification.Builder builder = new Notification.Builder(this);\n        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) builder.setChannelId(channelId);\n        Notification notification =\n             builder\n            .setContentTitle(title)\n            .setContentText(body)\n            .setSmallIcon(R.getIdentifier(icon, iconPath, getPackageName()))\n            .setContentIntent(pendingIntent)\n            .setAutoCancel(true)\n            .setDefaults(detaults)\n            .build();\n\n        m_notificationManager.notify(id, notification);\n        return true;\n    }\n\n    public boolean stopNotification(int id)\n    {\n        if (m_notificationManager == null) {\n            m_notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);\n        }\n        m_notificationManager.cancel(id);\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/android/java-qt6/src/io/aseman/android/AsemanService.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android;\n\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.io.InputStream;\nimport java.io.FileOutputStream;\nimport java.io.FileInputStream;\nimport java.io.DataOutputStream;\nimport java.io.DataInputStream;\nimport java.lang.reflect.Field;\n\nimport dalvik.system.DexClassLoader;\n\nimport android.content.res.AssetManager;\nimport android.annotation.SuppressLint;\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimport android.app.PendingIntent;\nimport android.app.Service;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageInfo;\nimport android.content.pm.ServiceInfo;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.os.IBinder;\nimport android.util.Log;\nimport android.os.Process;\nimport android.widget.Toast;\n\nimport io.aseman.android.AsemanActivity;\nimport io.aseman.android.AsemanServiceDelegate;\nimport org.qtproject.qt.android.bindings.QtApplication;\n\npublic class AsemanService extends Service\n{\n    public Boolean started=false;\n    private String[] m_qtLibs = null;\n    private DexClassLoader m_classLoader = null;\n\n    private static final int BUFFER_SIZE = 1024;\n\n    private String[] m_sources = {\"https://download.qt-project.org/ministro/android/qt5/qt-5.2\"}; // Make sure you are using ONLY secure locations\n    private String m_repository = \"default\";\n\n    private ServiceInfo m_serviceInfo = null;\n    protected NotificationManager m_notificationManager;\n    protected Notification.Builder m_builder;\n    protected PendingIntent pi;\n    private static AsemanService m_instance = null;\n    private String m_lib_name;\n\n    private static final String ERROR_CODE_KEY = \"error.code\";\n    private static final String DEX_PATH_KEY = \"dex.path\";\n    private static final String STATIC_INIT_CLASSES_KEY = \"static.init.classes\";\n    private static final String NATIVE_LIBRARIES_KEY = \"native.libraries\";\n    private static final String MAIN_LIBRARY_KEY = \"main.library\";\n    private static final String APPLICATION_PARAMETERS_KEY = \"application.parameters\";\n    private static final String BUNDLED_LIBRARIES_KEY = \"bundled.libraries\";\n    private static final String BUNDLED_IN_LIB_RESOURCE_ID_KEY = \"android.app.bundled_in_lib_resource_id\";\n    private static final String BUNDLED_IN_ASSETS_RESOURCE_ID_KEY = \"android.app.bundled_in_assets_resource_id\";\n    private static final String LOADER_CLASS_NAME_KEY = \"loader.class.name\";\n    private static final String LIB_PATH_KEY = \"lib.path\";\n    private static final String ENVIRONMENT_VARIABLES_KEY = \"env.variable\";\n\n    public String APPLICATION_PARAMETERS = null;\n    public String ENVIRONMENT_VARIABLES = \"QT_USE_ANDROID_NATIVE_STYLE=1\\tQT_USE_ANDROID_NATIVE_DIALOGS=1\\t\";\n\n    @Override\n    public void onCreate() {\n        m_instance = this;\n\n        try{\n            ComponentName myService = new ComponentName(this, this.getClass());\n            m_serviceInfo = getPackageManager().getServiceInfo(myService, PackageManager.GET_META_DATA);\n            m_lib_name = splitCamelCase (m_serviceInfo.metaData.getString(\"android.app.lib_name\"));\n        }\n        catch (Exception e) {\n            e.printStackTrace();\n        }\n\n        super.onCreate();\n    }\n\n    public static AsemanService getServiceInstance() {\n        return AsemanService.m_instance;\n    }\n\n    @Override\n    public int onStartCommand(Intent intent, int flags, int startId) {\n        startApp();\n        return super.onStartCommand(intent, flags, startId);\n    }\n\n    @Override\n    public IBinder onBind(Intent intent) {\n        return null;\n    }\n\n    @Override\n    public void onDestroy() {\n        AsemanServiceDelegate.finishQtApplication();\n        m_serviceInfo = null;\n        m_instance = null;\n        m_classLoader = null;\n        super.onDestroy();\n    }\n\n    private void startApp(){\n        if (!started){\n            started = true;\n//            Toast.makeText(getBaseContext(), m_lib_name + \" starting\", Toast.LENGTH_LONG).show();\n\n            try{\n                if (m_serviceInfo.metaData.containsKey(\"android.app.qt_sources_resource_id\")) {\n                    int resourceId = m_serviceInfo.metaData.getInt(\"android.app.qt_sources_resource_id\");\n                    m_sources = getResources().getStringArray(resourceId);\n                }\n\n                if (m_serviceInfo.metaData.containsKey(\"android.app.repository\"))\n                    m_repository = m_serviceInfo.metaData.getString(\"android.app.repository\");\n\n                if (m_serviceInfo.metaData.containsKey(\"android.app.qt_libs_resource_id\")) {\n                    int resourceId = m_serviceInfo.metaData.getInt(\"android.app.qt_libs_resource_id\");\n                    m_qtLibs = getResources().getStringArray(resourceId);\n                }\n\n                if (m_serviceInfo.metaData.containsKey(\"android.app.use_local_qt_libs\")\n                        && m_serviceInfo.metaData.getInt(\"android.app.use_local_qt_libs\") == 1) {\n                    ArrayList<String> libraryList = new ArrayList<String>();\n\n\n                    String localPrefix = \"/data/local/tmp/qt/\";\n                    if (m_serviceInfo.metaData.containsKey(\"android.app.libs_prefix\"))\n                        localPrefix = m_serviceInfo.metaData.getString(\"android.app.libs_prefix\");\n\n                    String pluginsPrefix = localPrefix;\n\n                    boolean bundlingQtLibs = false;\n                    if (m_serviceInfo.metaData.containsKey(\"android.app.bundle_local_qt_libs\")\n                        && m_serviceInfo.metaData.getInt(\"android.app.bundle_local_qt_libs\") == 1) {\n                        localPrefix = getApplicationInfo().dataDir + \"/\";\n                        pluginsPrefix = localPrefix + \"qt-reserved-files/\";\n                        cleanOldCacheIfNecessary(localPrefix, pluginsPrefix);\n                        extractBundledPluginsAndImports(pluginsPrefix);\n                        bundlingQtLibs = true;\n                    }\n\n                    if (m_qtLibs != null) {\n                        for (int i=0;i<m_qtLibs.length;i++) {\n                            libraryList.add(localPrefix\n                                            + \"lib/lib\"\n                                            + m_qtLibs[i]\n                                            + \".so\");\n                        }\n                    }\n\n                    if (m_serviceInfo.metaData.containsKey(\"android.app.load_local_libs\")) {\n                        String[] extraLibs = m_serviceInfo.metaData.getString(\"android.app.load_local_libs\").split(\":\");\n                        for (String lib : extraLibs) {\n                            if (lib.length() > 0) {\n                                if (lib.startsWith(\"lib/\"))\n                                    libraryList.add(localPrefix + lib);\n                                else\n                                    libraryList.add(pluginsPrefix + lib);\n                            }\n                        }\n                    }\n\n\n                    String dexPaths = new String();\n                    String pathSeparator = System.getProperty(\"path.separator\", \":\");\n                    if (!bundlingQtLibs && m_serviceInfo.metaData.containsKey(\"android.app.load_local_jars\")) {\n                        String[] jarFiles = m_serviceInfo.metaData.getString(\"android.app.load_local_jars\").split(\":\");\n                        for (String jar:jarFiles) {\n                            if (jar.length() > 0) {\n                                if (dexPaths.length() > 0)\n                                    dexPaths += pathSeparator;\n                                dexPaths += localPrefix + jar;\n                            }\n                        }\n                    }\n\n                    Bundle loaderParams = new Bundle();\n                    loaderParams.putInt(ERROR_CODE_KEY, 0);\n                    loaderParams.putString(DEX_PATH_KEY, dexPaths);\n                    loaderParams.putString(LOADER_CLASS_NAME_KEY, \"io.aseman.android.AsemanServiceDelegate\");\n                    if (m_serviceInfo.metaData.containsKey(\"android.app.static_init_classes\")) {\n                        loaderParams.putStringArray(STATIC_INIT_CLASSES_KEY,\n                                                    m_serviceInfo.metaData.getString(\"android.app.static_init_classes\").split(\":\"));\n                    }\n                    loaderParams.putStringArrayList(NATIVE_LIBRARIES_KEY, libraryList);\n\n                    loaderParams.putString(ENVIRONMENT_VARIABLES_KEY, ENVIRONMENT_VARIABLES\n                                                                      + \"\\tQML2_IMPORT_PATH=\" + pluginsPrefix + \"/qml\"\n                                                                      + \"\\tQML_IMPORT_PATH=\" + pluginsPrefix + \"/imports\"\n                                                                      + \"\\tQT_PLUGIN_PATH=\" + pluginsPrefix + \"/plugins\");\n\n                    if (APPLICATION_PARAMETERS != null) {\n                        loaderParams.putString(APPLICATION_PARAMETERS_KEY, APPLICATION_PARAMETERS);\n                    }\n\n                    loadApplication(loaderParams);\n                    return;\n                }\n            }\n            catch (Exception e) {\n                started = false;\n                e.printStackTrace();\n            }\n        }\n    }\n\n    @SuppressLint(\"NewApi\")\n    public void loadApplication(Bundle loaderParams){\n\n        try{\n\n            ArrayList<String> libs = new ArrayList<String>();\n            if ( m_serviceInfo.metaData.containsKey(\"android.app.bundled_libs_resource_id\") )\n                libs.addAll(Arrays.asList(getResources().getStringArray(m_serviceInfo.metaData.getInt(\"android.app.bundled_libs_resource_id\"))));\n\n            String libName = null;\n            if ( m_serviceInfo.metaData.containsKey(\"android.app.lib_name\") ) {\n                libName = m_serviceInfo.metaData.getString(\"android.app.lib_name\");\n                loaderParams.putString(MAIN_LIBRARY_KEY, libName); //main library contains main() function\n            }\n\n            loaderParams.putStringArrayList(BUNDLED_LIBRARIES_KEY, libs);\n            loaderParams.putString(ENVIRONMENT_VARIABLES_KEY, \"\");\n\n            m_classLoader = new DexClassLoader(loaderParams.getString(DEX_PATH_KEY), // .jar/.apk files\n                    getDir(\"outdex\", Context.MODE_PRIVATE).getAbsolutePath(), // directory where optimized DEX files should be written.\n                    loaderParams.containsKey(LIB_PATH_KEY) ? loaderParams.getString(LIB_PATH_KEY) : null, // libs folder (if exists)\n                    getClassLoader()); // parent loader\n\n            String loaderClassName = loaderParams.getString(LOADER_CLASS_NAME_KEY);\n\n            Log.w(getClass().getName(), \"Loader : \" + loaderClassName);\n\n            Class<?> loaderClass = m_classLoader.loadClass(loaderClassName); // load QtLoader class\n            Object qtLoader = loaderClass.newInstance(); // create an instance\n\n            Method perpareAppMethod = qtLoader.getClass().getMethod(\"loadApplication\",\n                                                                    Service.class,\n                                                                    ClassLoader.class,\n                                                                    Bundle.class);\n\n            if (!(Boolean)perpareAppMethod.invoke(qtLoader, this, m_classLoader, loaderParams))\n                throw new Exception(\"\");\n\n            // now load the application library so it's accessible from this class loader\n            if (libName != null)\n                System.loadLibrary(libName);\n\n            Method startAppMethod=qtLoader.getClass().getMethod(\"startApplication\");\n            if (!(Boolean)startAppMethod.invoke(qtLoader))\n                throw new Exception(\"\");\n        }\n        catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    static private void copyFile(InputStream inputStream, OutputStream outputStream)\n        throws IOException\n    {\n        byte[] buffer = new byte[BUFFER_SIZE];\n\n        int count;\n        while ((count = inputStream.read(buffer)) > 0)\n            outputStream.write(buffer, 0, count);\n    }\n\n\n    private void copyAsset(String source, String destination)\n        throws IOException\n    {\n        // Already exists, we don't have to do anything\n        File destinationFile = new File(destination);\n        if (destinationFile.exists())\n            return;\n\n        File parentDirectory = destinationFile.getParentFile();\n        if (!parentDirectory.exists())\n            parentDirectory.mkdirs();\n\n        destinationFile.createNewFile();\n\n        AssetManager assetsManager = getAssets();\n        InputStream inputStream = assetsManager.open(source);\n        OutputStream outputStream = new FileOutputStream(destinationFile);\n        copyFile(inputStream, outputStream);\n\n        inputStream.close();\n        outputStream.close();\n    }\n\n    private static void createBundledBinary(String source, String destination)\n        throws IOException\n    {\n        // Already exists, we don't have to do anything\n        File destinationFile = new File(destination);\n        if (destinationFile.exists())\n            return;\n\n        File parentDirectory = destinationFile.getParentFile();\n        if (!parentDirectory.exists())\n            parentDirectory.mkdirs();\n\n        destinationFile.createNewFile();\n\n        InputStream inputStream = new FileInputStream(source);\n        OutputStream outputStream = new FileOutputStream(destinationFile);\n        copyFile(inputStream, outputStream);\n\n        inputStream.close();\n        outputStream.close();\n    }\n\n    private boolean cleanCacheIfNecessary(String pluginsPrefix, long packageVersion)\n    {\n        File versionFile = new File(pluginsPrefix + \"cache.version\");\n\n        long cacheVersion = 0;\n        if (versionFile.exists() && versionFile.canRead()) {\n            try {\n                DataInputStream inputStream = new DataInputStream(new FileInputStream(versionFile));\n                cacheVersion = inputStream.readLong();\n                inputStream.close();\n             } catch (Exception e) {\n                e.printStackTrace();\n             }\n        }\n\n        if (cacheVersion != packageVersion) {\n            deleteRecursively(new File(pluginsPrefix));\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    private void extractBundledPluginsAndImports(String pluginsPrefix)\n        throws IOException\n    {\n        ArrayList<String> libs = new ArrayList<String>();\n\n        String dataDir = getApplicationInfo().dataDir + \"/\";\n\n        long packageVersion = -1;\n        try {\n            PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);\n            packageVersion = packageInfo.lastUpdateTime;\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n\n        if (!cleanCacheIfNecessary(pluginsPrefix, packageVersion))\n            return;\n\n        {\n            File versionFile = new File(pluginsPrefix + \"cache.version\");\n\n            File parentDirectory = versionFile.getParentFile();\n            if (!parentDirectory.exists())\n                parentDirectory.mkdirs();\n\n            versionFile.createNewFile();\n\n            DataOutputStream outputStream = new DataOutputStream(new FileOutputStream(versionFile));\n            outputStream.writeLong(packageVersion);\n            outputStream.close();\n        }\n\n        {\n            String key = BUNDLED_IN_LIB_RESOURCE_ID_KEY;\n            java.util.Set<String> keys = m_serviceInfo.metaData.keySet();\n            if (m_serviceInfo.metaData.containsKey(key)) {\n                String[] list = getResources().getStringArray(m_serviceInfo.metaData.getInt(key));\n\n                for (String bundledImportBinary : list) {\n                    String[] split = bundledImportBinary.split(\":\");\n                    String sourceFileName = dataDir + \"lib/\" + split[0];\n                    String destinationFileName = pluginsPrefix + split[1];\n                    createBundledBinary(sourceFileName, destinationFileName);\n                }\n            }\n        }\n\n        {\n            String key = BUNDLED_IN_ASSETS_RESOURCE_ID_KEY;\n            if (m_serviceInfo.metaData.containsKey(key)) {\n                String[] list = getResources().getStringArray(m_serviceInfo.metaData.getInt(key));\n\n                for (String fileName : list) {\n                    String[] split = fileName.split(\":\");\n                    String sourceFileName = split[0];\n                    String destinationFileName = pluginsPrefix + split[1];\n                    copyAsset(sourceFileName, destinationFileName);\n                }\n            }\n\n        }\n    }\n\n    private void deleteRecursively(File directory)\n    {\n        File[] files = directory.listFiles();\n        if (files != null) {\n            for (File file : files) {\n                if (file.isDirectory())\n                    deleteRecursively(file);\n                else\n                    file.delete();\n            }\n\n            directory.delete();\n        }\n    }\n\n    private void cleanOldCacheIfNecessary(String oldLocalPrefix, String localPrefix)\n    {\n        File newCache = new File(localPrefix);\n        if (!newCache.exists()) {\n            {\n                File oldPluginsCache = new File(oldLocalPrefix + \"plugins/\");\n                if (oldPluginsCache.exists() && oldPluginsCache.isDirectory())\n                    deleteRecursively(oldPluginsCache);\n            }\n\n            {\n                File oldImportsCache = new File(oldLocalPrefix + \"imports/\");\n                if (oldImportsCache.exists() && oldImportsCache.isDirectory())\n                    deleteRecursively(oldImportsCache);\n            }\n\n            {\n                File oldQmlCache = new File(oldLocalPrefix + \"qml/\");\n                if (oldQmlCache.exists() && oldQmlCache.isDirectory())\n                    deleteRecursively(oldQmlCache);\n            }\n        }\n    }\n\n    static String splitCamelCase(String sp) {\n\n        String s = Character.toUpperCase(sp.charAt(0)) + sp.substring(1);\n\n        return s.replaceAll(\n          String.format(\"%s|%s|%s\",\n             \"(?<=[A-Z])(?=[A-Z][a-z])\",\n             \"(?<=[^A-Z])(?=[A-Z])\",\n             \"(?<=[A-Za-z])(?=[^A-Za-z])\"\n          ),\n          \" \"\n       );\n    }\n}\n"
  },
  {
    "path": "src/android/java-qt6/src/io/aseman/android/AsemanServiceDelegate.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android;\n\nimport org.qtproject.qt.android.QtNative;\n\nimport java.io.File;\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.Iterator;\n\nimport android.app.Service;\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.content.res.Configuration;\nimport android.graphics.Rect;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.util.Log;\n\npublic class AsemanServiceDelegate\n{\n    private Service m_service = null;\n\n    private static final String NATIVE_LIBRARIES_KEY = \"native.libraries\";\n    private static final String BUNDLED_LIBRARIES_KEY = \"bundled.libraries\";\n    private static final String MAIN_LIBRARY_KEY = \"main.library\";\n    private static final String ENVIRONMENT_VARIABLES_KEY = \"environment.variables\";\n    private static final String APPLICATION_PARAMETERS_KEY = \"application.parameters\";\n    private static final String STATIC_INIT_CLASSES_KEY = \"static.init.classes\";\n    private static final String NECESSITAS_API_LEVEL_KEY = \"necessitas.api.level\";\n\n    private String m_environmentVariables = null;\n    private String m_applicationParameters = null;\n\n    private String m_mainLib;\n\n    public boolean loadApplication(Service service, ClassLoader classLoader, Bundle loaderParams)\n    {\n        if (!loaderParams.containsKey(NATIVE_LIBRARIES_KEY))\n            Log.w(getClass().getName(), \"Missing parameters1 in loaderParams\");\n\n        if (!loaderParams.containsKey(BUNDLED_LIBRARIES_KEY))\n            Log.w(getClass().getName(), \"Missing parameters2 in loaderParams\");\n\n        /// check parameters integrity\n        if (!loaderParams.containsKey(NATIVE_LIBRARIES_KEY)\n                || !loaderParams.containsKey(BUNDLED_LIBRARIES_KEY)) {\n\n            Log.w(getClass().getName(), \"Missing parameters in loaderParams\");\n            return false;\n        }\n\n        m_service = service;\n        //QtNative.setActivity(m_activity, this);\n        QtNative.setClassLoader(classLoader);\n        if (loaderParams.containsKey(STATIC_INIT_CLASSES_KEY)) {\n            for (String className: loaderParams.getStringArray(STATIC_INIT_CLASSES_KEY)) {\n                Log.w(getClass().getName(), className);\n                if (className.length() == 0)\n                    continue;\n\n                try {\n                    @SuppressWarnings(\"rawtypes\")\n                    Class initClass = classLoader.loadClass(className);\n                    Object staticInitDataObject = initClass.newInstance(); // create an instance\n                    //Method m = initClass.getMethod(\"setActivity\", Activity.class, Object.class);\n                    //m.invoke(staticInitDataObject, m_activity, this);\n                } catch (Exception e) {\n                    e.printStackTrace();\n                }\n            }\n        }\n\n        QtNative.loadQtLibraries(loaderParams.getStringArrayList(NATIVE_LIBRARIES_KEY));\n        ArrayList<String> libraries = loaderParams.getStringArrayList(BUNDLED_LIBRARIES_KEY);\n        QtNative.loadBundledLibraries(libraries, QtNativeNativeLibrariesDir(m_service));\n        m_mainLib = loaderParams.getString(MAIN_LIBRARY_KEY);\n        // older apps provide the main library as the last bundled library; look for this if the main library isn't provided\n        if (null == m_mainLib && libraries.size() > 0)\n            m_mainLib = libraries.get(libraries.size() - 1);\n\n\n        int necessitasApiLevel = 1;\n        if (loaderParams.containsKey(NECESSITAS_API_LEVEL_KEY))\n            necessitasApiLevel = loaderParams.getInt(NECESSITAS_API_LEVEL_KEY);\n\n        m_environmentVariables = \"\";\n\n        if (loaderParams.containsKey(APPLICATION_PARAMETERS_KEY))\n            m_applicationParameters = loaderParams.getString(APPLICATION_PARAMETERS_KEY);\n        else\n            m_applicationParameters = \"\";\n\n        return true;\n    }\n\n    public void debugLog(String msg)\n    {\n        Log.i(QtNative.QtTAG, \"DEBUGGER: \" + msg);\n    }\n\n    public boolean startApplication()\n    {\n\n        try {\n\n            String nativeLibraryDir = QtNativeNativeLibrariesDir(m_service);\n\n            Log.i(QtNative.QtTAG, \"LIB DIR : \" + nativeLibraryDir);\n\n//            QtNative.startApplication\n            QtNativeStartApplication\n                    (  m_applicationParameters,\n                                        m_environmentVariables,\n                                        m_mainLib,\n                                        nativeLibraryDir);\n            return true;\n        }\n        catch (Exception e) {\n\n            e.printStackTrace();\n            return false;\n        }\n    }\n\n    public static String QtNativeNativeLibrariesDir(Service service)\n    {\n        String m_nativeLibraryDir = null;\n        try {\n            ApplicationInfo ai = service.getPackageManager().getApplicationInfo(service.getPackageName(), 0);\n            m_nativeLibraryDir = ai.nativeLibraryDir+\"/\";\n        } catch (NameNotFoundException e) {\n            e.printStackTrace();\n        }\n        return m_nativeLibraryDir;\n    }\n\n\n    public static boolean QtNativeStartApplication(String params,\n                                           String environment,\n                                           String mainLibrary,\n                                           String nativeLibraryDir) throws Exception\n    {\n        File f = new File(nativeLibraryDir + \"lib\" + mainLibrary + \".so\");\n        if (!f.exists())\n            throw new Exception(\"Can't find main library '\" + mainLibrary + \"'\");\n\n        if (params == null)\n            params = \"-platform\\tandroid\";\n\n        boolean res = false;\n\n        if (params.length() > 0 && !params.startsWith(\"\\t\"))\n            params = \"\\t\" + params;\n        startQtApplication(f.getAbsolutePath() + params, environment);\n\n        return res;\n    }\n\n    public static native void startQtApplication(String params, String env);\n    public static native void finishQtApplication();\n}\n"
  },
  {
    "path": "src/android/java-qt6/src/io/aseman/android/extra/AsemanCameraCapture.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android.extra;\n\nimport io.aseman.android.AsemanApplication;\nimport io.aseman.android.AsemanActivity;\nimport io.aseman.android.AsemanService;\n\nimport android.os.Bundle;\nimport android.content.Context;\nimport android.content.ContentResolver;\nimport android.provider.Settings;\nimport android.util.Log;\nimport android.view.SurfaceView;\nimport android.view.SurfaceHolder;\nimport android.view.SurfaceHolder.Callback;\nimport android.view.WindowManager;\nimport android.graphics.PixelFormat;\nimport android.hardware.Camera;\nimport android.hardware.Camera.PictureCallback;\nimport android.os.Environment;\nimport java.util.HashMap;\nimport java.io.IOException;\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Date;\nimport java.util.TimerTask;\nimport java.util.Timer;\nimport java.lang.Runnable;\nimport java.text.SimpleDateFormat;\nimport android.os.Handler;\n\npublic class AsemanCameraCapture\n{\n    private static final String TAG = \"AsemanCameraCapture\";\n\n    public native void _imageCaptured(int id, String path);\n\n    public void capture(final int id, final String path, final boolean frontCamera) {\n        Handler mainHandler = new Handler(getContext().getMainLooper());\n        Runnable myRunnable = new Runnable() {\n            @Override\n            public void run() {\n                try {\n                    takePhoto(id, path,\n                              frontCamera? Camera.CameraInfo.CAMERA_FACING_FRONT :\n                                           Camera.CameraInfo.CAMERA_FACING_BACK);\n                } catch (Exception e) {\n                    _imageCaptured(id, \"\");\n                }\n            }\n        };\n        mainHandler.post(myRunnable);\n    }\n\n    public static Context getContext() {\n        if(AsemanActivity.getActivityInstance() != null)\n            return AsemanActivity.getActivityInstance();\n        else\n        if(AsemanService.getServiceInstance() != null)\n            return AsemanService.getServiceInstance();\n        else\n            return AsemanApplication.getAppContext();\n    }\n\n    private void takePhoto(final int actionId, final String path, final int cameraType) {\n        Context context = getContext();\n        final SurfaceView view = new SurfaceView(context);\n        final Camera camera = openCamera(cameraType);\n        if(camera == null) {\n            camera.release();\n            _imageCaptured(actionId, \"\");\n            return;\n        }\n\n        Log.d(TAG, \"Opened camera\");\n\n        SurfaceHolder holder = view.getHolder();\n        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);\n\n        holder.addCallback(new Callback() {\n            @Override\n            //The preview must happen at or after this point or takePicture fails\n            public void surfaceCreated(SurfaceHolder holder) {\n\n                try {\n                    camera.setPreviewDisplay(holder);\n                } catch (Exception e) {\n                    if (camera != null)\n                        camera.release();\n                    _imageCaptured(actionId, \"\");\n                    throw new RuntimeException(e);\n                }\n\n                Log.d(TAG, \"Started preview\");\n                Timer timer = new Timer();\n                timer.schedule( new TimerTask() {\n                    @Override\n                    public void run() {\n                        try {\n                            camera.takePicture(null, null, new PictureCallback() {\n                                @Override\n                                public void onPictureTaken(byte[] data, Camera camera) {\n                                    Log.d(TAG, \"Took picture\");\n                                    savePicture(data, path);\n                                    camera.release();\n                                    _imageCaptured(actionId, path);\n                                }\n                            });\n                        } catch (Exception e) {\n                            if (camera != null)\n                                camera.release();\n                            _imageCaptured(actionId, \"\");\n                            throw new RuntimeException(e);\n                        }\n                    }\n                } , 3000);\n            }\n\n            @Override public void surfaceDestroyed(SurfaceHolder holder) {}\n            @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}\n        });\n\n        WindowManager wm = (WindowManager)context\n            .getSystemService(Context.WINDOW_SERVICE);\n        WindowManager.LayoutParams params = new WindowManager.LayoutParams(\n                1, 1, //Must be at least 1x1\n                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,\n                0,\n                //Don't know if this is a safe default\n                PixelFormat.UNKNOWN);\n\n        //Don't set the preview visibility to GONE or INVISIBLE\n        wm.addView(view, params);\n    }\n\n    /** null if unable to save the file */\n    public boolean savePicture(byte[] data, String filePath) {\n        try {\n            File pictureFile = new File(filePath);\n\n            FileOutputStream fos = new FileOutputStream(pictureFile);\n            fos.write(data);\n            fos.close();\n\n            return true;\n        } catch (Exception e) {\n            return false;\n        }\n    }\n\n    private Camera openCamera(final int type) {\n        int cameraCount = 0;\n        Camera cam = null;\n        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();\n        cameraCount = Camera.getNumberOfCameras();\n\n        boolean typeFounded = false;\n        for (int camIdx = 0; camIdx < cameraCount; camIdx++) {\n            Camera.getCameraInfo(camIdx, cameraInfo);\n            if (cameraInfo.facing == type) {\n                typeFounded = true;\n                try {\n                    cam = Camera.open(camIdx);\n                } catch (RuntimeException e) {\n                    Log.e(TAG, \"Camera failed to open: \" + e.getLocalizedMessage());\n                }\n            }\n        }\n        if(!typeFounded) {\n            Log.d(TAG, \"Can't find requested camera. Try to open default camera.\");\n            try {\n                cam = Camera.open();\n            } catch (RuntimeException e) {\n                Log.e(TAG, \"Default camera failed to open: \" + e.getLocalizedMessage());\n            }\n        }\n\n        return cam;\n    }\n}\n"
  },
  {
    "path": "src/android/java-qt6/src/io/aseman/android/extra/AsemanLocationListener.java",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npackage io.aseman.android.extra;\n\nimport io.aseman.android.AsemanApplication;\nimport io.aseman.android.AsemanActivity;\nimport io.aseman.android.AsemanService;\n\nimport android.os.Bundle;\nimport android.content.Context;\nimport android.content.ContentResolver;\nimport android.location.Address;\nimport android.location.Geocoder;\nimport android.location.Location;\nimport android.location.LocationListener;\nimport android.location.LocationManager;\nimport android.provider.Settings;\nimport android.util.Log;\nimport java.util.HashMap;\nimport java.io.IOException;\nimport java.util.List;\nimport java.util.Locale;\nimport java.lang.Runnable;\nimport android.os.Handler;\n\npublic class AsemanLocationListener\n{\n    private final int TWO_MINUTES = 1000 * 60 * 2;\n    private final String TAG = \"AsemanLocationListener\";\n    private int lastInterval = -1;\n\n    private LocationManager locationManager;\n\n    public native void _locationListened(double longitude, double latitude, double altitude, String city);\n\n    AsemanLocationListener() {\n        locationManager = (LocationManager)getContext().getSystemService(Context.LOCATION_SERVICE);\n    }\n\n    private Boolean displayGpsStatus() {\n        ContentResolver contentResolver = getContext().getContentResolver();\n        boolean gpsStatus = Settings.Secure.isLocationProviderEnabled(contentResolver, LocationManager.GPS_PROVIDER);\n        if (gpsStatus) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    public static Context getContext() {\n        if(AsemanActivity.getActivityInstance() != null)\n            return AsemanActivity.getActivityInstance();\n        else\n        if(AsemanService.getServiceInstance() != null)\n            return AsemanService.getServiceInstance();\n        else\n            return AsemanApplication.getAppContext();\n    }\n\n    public void requestLocationUpdates(final int interval) {\n        Handler mainHandler = new Handler(getContext().getMainLooper());\n        Runnable myRunnable = new Runnable() {\n            @Override\n            public void run() {\n                if(lastInterval == interval)\n                    return;\n                if(lastInterval != -1)\n                    locationManager.removeUpdates(locationListener);\n\n                lastInterval = interval;\n                if(lastInterval == -1)\n                    return;\n\n                if(displayGpsStatus())\n                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, interval, 10, locationListener);\n                else\n                    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, interval, 10, locationListener);\n            }\n        };\n        mainHandler.post(myRunnable);\n    }\n\n    public void getLastKnownLocation() {\n        Location locationGPS = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);\n        Location locationNet = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);\n\n        Location loc = locationGPS;\n        if(isBetterLocation(locationNet, loc))\n            loc = locationNet;\n\n        double longitude = loc.getLongitude();\n        double latitude = loc.getLatitude();\n\n        _locationListened(longitude, latitude, 0, \"\");\n    }\n\n    protected boolean isBetterLocation(Location location, Location currentBestLocation) {\n        if (currentBestLocation == null)\n            return true;\n        if (location == null)\n            return false;\n\n        // Check whether the new location fix is newer or older\n        long timeDelta = location.getTime() - currentBestLocation.getTime();\n        boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;\n        boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;\n        boolean isNewer = timeDelta > 0;\n\n        // If it's been more than two minutes since the current location, use the new location,\n        // because the user has likely moved.\n        if (isSignificantlyNewer) {\n            return true;\n            // If the new location is more than two minutes older, it must be worse.\n        } else if (isSignificantlyOlder) {\n            return false;\n        }\n\n        // Check whether the new location fix is more or less accurate\n        int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());\n        boolean isLessAccurate = accuracyDelta > 0;\n        boolean isMoreAccurate = accuracyDelta < 0;\n        boolean isSignificantlyLessAccurate = accuracyDelta > 200;\n\n        // Check if the old and new location are from the same provider\n        boolean isFromSameProvider = isSameProvider(location.getProvider(),\n                                                    currentBestLocation.getProvider());\n\n        // Determine location quality using a combination of timeliness and accuracy\n        if (isMoreAccurate) {\n            return true;\n        } else if (isNewer && !isLessAccurate) {\n            return true;\n        } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {\n            return true;\n        }\n        return false;\n    }\n\n    /** Checks whether two providers are the same */\n    private boolean isSameProvider(String provider1, String provider2) {\n        if (provider1 == null) {\n            return provider2 == null;\n        }\n        return provider1.equals(provider2);\n    }\n\n    /*---------- Listener class to get coordinates ------------- */\n    LocationListener locationListener = new LocationListener() {\n\n        @Override\n        public void onLocationChanged(Location loc) {\n            double longitude = loc.getLongitude();\n            double latitude = loc.getLatitude();\n\n            /*------- To get city name from coordinates -------- */\n            String cityName = null;\n\n            _locationListened(longitude, latitude, 0, cityName);\n        }\n\n        @Override\n        public void onProviderDisabled(String provider) {}\n\n        @Override\n        public void onProviderEnabled(String provider) {}\n\n        @Override\n        public void onStatusChanged(String provider, int status, Bundle extras) {}\n    };\n}\n"
  },
  {
    "path": "src/asemanqml/CMakeLists.txt",
    "content": "\nadd_subdirectory(base)\nadd_subdirectory(graphicaleffects)\n\nif (ASEMAN_QML_MODULES_AWESOME)\n    add_subdirectory(awesome)\nendif ()\n\nif (ASEMAN_QML_MODULES_MATERIALICONS)\n    add_subdirectory(materialicons)\nendif ()\n\nif (ASEMAN_QML_MODULES_MULTIMEDIA)\n    add_subdirectory(multimedia)\nendif ()\n\nif (ASEMAN_QML_MODULES_WIDGETS)\n    add_subdirectory(widgets)\nendif ()\n\nif (ASEMAN_QML_MODULES_MODERN)\n    add_subdirectory(modern)\nendif ()\n\nif (ASEMAN_QML_MODULES_CONTROLS)\n    add_subdirectory(controls)\nendif ()\n\nif (ASEMAN_QML_MODULES_CONTROLS_BETA)\n    add_subdirectory(controls_beta)\nendif ()\n\nif (ASEMAN_QML_MODULES_NETWORK)\n    add_subdirectory(network)\nendif ()\n\nif (ASEMAN_QML_MODULES_VIEWPORT)\n    add_subdirectory(viewport)\nendif ()\n\nif (ASEMAN_QML_MODULES_MODELS)\n    add_subdirectory(models)\nendif ()\n\nif (ASEMAN_QML_MODULES_SQL)\n    add_subdirectory(sql)\nendif ()\n\n# if (ASEMAN_QML_MODULES_GRAPHICAL_EFFECTS)\n#     add_subdirectory(graphicaleffects)\n# endif ()\n\nset(SOURCE\n    ${SOURCE}\n    PARENT_SCOPE)\n\nset(ASEMAN_COMPILE_DEFINITION\n    ${ASEMAN_COMPILE_DEFINITION}\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n\nset(ASEMAN_QML_IMPORT_PATH\n    ${ASEMAN_QML_IMPORT_PATH}\n    ${CMAKE_CURRENT_SOURCE_DIR}/import\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/asemanqml/asemanqml.pri",
    "content": "\ninclude(base/base.pri)\ninclude(graphicaleffects/graphicaleffects.pri)\n\ncontains(ASEMAN_QML_MODULES, awesome) {\n    include(awesome/awesome.pri)\n}\n\ncontains(ASEMAN_QML_MODULES, materialicons) {\n    include(materialicons/materialicons.pri)\n}\n\ncontains(ASEMAN_QML_MODULES, multimedia) {\n    include(multimedia/multimedia.pri)\n}\n\ncontains(ASEMAN_QML_MODULES, widgets) {\n    include(widgets/widgets.pri)\n}\n\ncontains(ASEMAN_QML_MODULES, modern) {\n    include(modern/modern.pri)\n}\n\ncontains(ASEMAN_QML_MODULES, controls) {\n    include(controls/controls.pri)\n}\n\ncontains(ASEMAN_QML_MODULES, controls_beta) {\n    include(controls_beta/controls_beta.pri)\n}\n\ncontains(ASEMAN_QML_MODULES, network) {\n    include(network/network.pri)\n}\n\ncontains(ASEMAN_QML_MODULES, viewport) {\n    include(viewport/viewport.pri)\n}\n\ncontains(ASEMAN_QML_MODULES, models) {\n    include(models/models.pri)\n}\n\ncontains(QT_ASEMAN_MODULES, sql) {\n    include(sql/sql.pri)\n}\n\ncontains(QT_ASEMAN_MODULES, graphicaleffects) {\n    include(graphicaleffects/graphicaleffects.pri)\n}\n"
  },
  {
    "path": "src/asemanqml/asemanqml.pro",
    "content": "TEMPLATE = subdirs\nCONFIG += ordered\nSUBDIRS += \\\n    base \\\n    awesome \\\n    materialicons \\\n    graphicaleffects \\\n    widgets \\\n    modern \\\n    controls \\\n    controls_beta \\\n    network \\\n    viewport \\\n    models \\\n    sql\n\n\ngreaterThan(QT_MAJOR_VERSION, 5) {\n} else {\n    SUBDIRS += multimedia\n}\n"
  },
  {
    "path": "src/asemanqml/awesome/Awesome/Awesome.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\npragma Singleton\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nAsemanObject {\n    readonly property string family: reguler.name + \", \" + solid.name + \", \" + brands.name + \", \" + fallback.name\n\n    FontLoader {\n        id: brands\n        source: \"fa-brands-400.ttf\"\n    }\n\t\n\tFontLoader {\n        id: reguler\n        source: \"fa-regular-400.ttf\"\n    }\n\n    FontLoader {\n        id: solid\n        source: \"fa-solid-900.ttf\"\n    }\n\n    FontLoader {\n        id: fallback\n        source: \"fontawesome-webfont.ttf\"\n    }\n\n    function init() {}\n\n    readonly property string fa_500px: \"\\uf26e\"\n    readonly property string fa_accessible_ico: \"\\uf368\"\n    readonly property string fa_accusoft: \"\\uf369\"\n    readonly property string fa_acquisitions_incorporated: \"\\uf6af\"\n    readonly property string fa_ad: \"\\uf641\"\n    readonly property string fa_address_book: \"\\uf2b9\"\n    readonly property string fa_address_card: \"\\uf2bb\"\n    readonly property string fa_adjust: \"\\uf042\"\n    readonly property string fa_adn: \"\\uf170\"\n    readonly property string fa_adobe: \"\\uf778\"\n    readonly property string fa_adversal: \"\\uf36a\"\n    readonly property string fa_affiliatetheme: \"\\uf36b\"\n    readonly property string fa_air_freshener: \"\\uf5d0\"\n    readonly property string fa_algolia: \"\\uf36c\"\n    readonly property string fa_align_center: \"\\uf037\"\n    readonly property string fa_align_justify: \"\\uf039\"\n    readonly property string fa_align_left: \"\\uf036\"\n    readonly property string fa_align_right: \"\\uf038\"\n    readonly property string fa_alipay: \"\\uf642\"\n    readonly property string fa_allergies: \"\\uf461\"\n    readonly property string fa_amazon: \"\\uf270\"\n    readonly property string fa_amazon_pay: \"\\uf42c\"\n    readonly property string fa_ambulance: \"\\uf0f9\"\n    readonly property string fa_american_sign_language_interpreting: \"\\uf2a3\"\n    readonly property string fa_amilia: \"\\uf36d\"\n    readonly property string fa_anchor: \"\\uf13d\"\n    readonly property string fa_android: \"\\uf17b\"\n    readonly property string fa_angellist: \"\\uf209\"\n    readonly property string fa_angle_double_down: \"\\uf103\"\n    readonly property string fa_angle_double_left: \"\\uf100\"\n    readonly property string fa_angle_double_right: \"\\uf101\"\n    readonly property string fa_angle_double_up: \"\\uf102\"\n    readonly property string fa_angle_down: \"\\uf107\"\n    readonly property string fa_angle_left: \"\\uf104\"\n    readonly property string fa_angle_right: \"\\uf105\"\n    readonly property string fa_angle_up: \"\\uf106\"\n    readonly property string fa_angry: \"\\uf556\"\n    readonly property string fa_angrycreative: \"\\uf36e\"\n    readonly property string fa_angular: \"\\uf420\"\n    readonly property string fa_ankh: \"\\uf644\"\n    readonly property string fa_app_store: \"\\uf36f\"\n    readonly property string fa_app_store_ios: \"\\uf370\"\n    readonly property string fa_apper: \"\\uf371\"\n    readonly property string fa_apple: \"\\uf179\"\n    readonly property string fa_apple_alt: \"\\uf5d1\"\n    readonly property string fa_apple_pay: \"\\uf415\"\n    readonly property string fa_archive: \"\\uf187\"\n    readonly property string fa_archway: \"\\uf557\"\n    readonly property string fa_arrow_alt_circle_down: \"\\uf358\"\n    readonly property string fa_arrow_alt_circle_left: \"\\uf359\"\n    readonly property string fa_arrow_alt_circle_right: \"\\uf35a\"\n    readonly property string fa_arrow_alt_circle_up: \"\\uf35b\"\n    readonly property string fa_arrow_circle_down: \"\\uf0ab\"\n    readonly property string fa_arrow_circle_left: \"\\uf0a8\"\n    readonly property string fa_arrow_circle_right: \"\\uf0a9\"\n    readonly property string fa_arrow_circle_up: \"\\uf0aa\"\n    readonly property string fa_arrow_down: \"\\uf063\"\n    readonly property string fa_arrow_left: \"\\uf060\"\n    readonly property string fa_arrow_right: \"\\uf061\"\n    readonly property string fa_arrow_up: \"\\uf062\"\n    readonly property string fa_arrows_alt: \"\\uf0b2\"\n    readonly property string fa_arrows_alt_h: \"\\uf337\"\n    readonly property string fa_arrows_alt_v: \"\\uf338\"\n    readonly property string fa_artstation: \"\\uf77a\"\n    readonly property string fa_assistive_listening_systems: \"\\uf2a2\"\n    readonly property string fa_asterisk: \"\\uf069\"\n    readonly property string fa_asymmetrik: \"\\uf372\"\n    readonly property string fa_at: \"\\uf1fa\"\n    readonly property string fa_atlas: \"\\uf558\"\n    readonly property string fa_atlassian: \"\\uf77b\"\n    readonly property string fa_atom: \"\\uf5d2\"\n    readonly property string fa_audible: \"\\uf373\"\n    readonly property string fa_audio_description: \"\\uf29e\"\n    readonly property string fa_autoprefixer: \"\\uf41c\"\n    readonly property string fa_avianex: \"\\uf374\"\n    readonly property string fa_aviato: \"\\uf421\"\n    readonly property string fa_award: \"\\uf559\"\n    readonly property string fa_aws: \"\\uf375\"\n    readonly property string fa_baby: \"\\uf77c\"\n    readonly property string fa_baby_carriage: \"\\uf77d\"\n    readonly property string fa_backspace: \"\\uf55a\"\n    readonly property string fa_backward: \"\\uf04a\"\n    readonly property string fa_bacon: \"\\uf7e5\"\n    readonly property string fa_balance_scale: \"\\uf24e\"\n    readonly property string fa_ban: \"\\uf05e\"\n    readonly property string fa_band_aid: \"\\uf462\"\n    readonly property string fa_bandcamp: \"\\uf2d5\"\n    readonly property string fa_barcode: \"\\uf02a\"\n    readonly property string fa_bars: \"\\uf0c9\"\n    readonly property string fa_baseball_ball: \"\\uf433\"\n    readonly property string fa_basketball_ball: \"\\uf434\"\n    readonly property string fa_bath: \"\\uf2cd\"\n    readonly property string fa_battery_empty: \"\\uf244\"\n    readonly property string fa_battery_full: \"\\uf240\"\n    readonly property string fa_battery_half: \"\\uf242\"\n    readonly property string fa_battery_quarter: \"\\uf243\"\n    readonly property string fa_battery_three_quarters: \"\\uf241\"\n    readonly property string fa_bed: \"\\uf236\"\n    readonly property string fa_beer: \"\\uf0fc\"\n    readonly property string fa_behance: \"\\uf1b4\"\n    readonly property string fa_behance_square: \"\\uf1b5\"\n    readonly property string fa_bell: \"\\uf0f3\"\n    readonly property string fa_bell_slash: \"\\uf1f6\"\n    readonly property string fa_bezier_curve: \"\\uf55b\"\n    readonly property string fa_bible: \"\\uf647\"\n    readonly property string fa_bicycle: \"\\uf206\"\n    readonly property string fa_bimobject: \"\\uf378\"\n    readonly property string fa_binoculars: \"\\uf1e5\"\n    readonly property string fa_biohazard: \"\\uf780\"\n    readonly property string fa_birthday_cake: \"\\uf1fd\"\n    readonly property string fa_bitbucket: \"\\uf171\"\n    readonly property string fa_bitcoin: \"\\uf379\"\n    readonly property string fa_bity: \"\\uf37a\"\n    readonly property string fa_black_tie: \"\\uf27e\"\n    readonly property string fa_blackberry: \"\\uf37b\"\n    readonly property string fa_blender: \"\\uf517\"\n    readonly property string fa_blender_phone: \"\\uf6b6\"\n    readonly property string fa_blind: \"\\uf29d\"\n    readonly property string fa_blog: \"\\uf781\"\n    readonly property string fa_blogger: \"\\uf37c\"\n    readonly property string fa_blogger_b: \"\\uf37d\"\n    readonly property string fa_bluetooth: \"\\uf293\"\n    readonly property string fa_bluetooth_b: \"\\uf294\"\n    readonly property string fa_bold: \"\\uf032\"\n    readonly property string fa_bolt: \"\\uf0e7\"\n    readonly property string fa_bomb: \"\\uf1e2\"\n    readonly property string fa_bone: \"\\uf5d7\"\n    readonly property string fa_bong: \"\\uf55c\"\n    readonly property string fa_book: \"\\uf02d\"\n    readonly property string fa_book_dead: \"\\uf6b7\"\n    readonly property string fa_book_medical: \"\\uf7e6\"\n    readonly property string fa_book_open: \"\\uf518\"\n    readonly property string fa_book_reader: \"\\uf5da\"\n    readonly property string fa_bookmark: \"\\uf02e\"\n    readonly property string fa_bowling_ball: \"\\uf436\"\n    readonly property string fa_box: \"\\uf466\"\n    readonly property string fa_box_open: \"\\uf49e\"\n    readonly property string fa_boxes: \"\\uf468\"\n    readonly property string fa_braille: \"\\uf2a1\"\n    readonly property string fa_brain: \"\\uf5dc\"\n    readonly property string fa_bread_slice: \"\\uf7ec\"\n    readonly property string fa_briefcase: \"\\uf0b1\"\n    readonly property string fa_briefcase_medical: \"\\uf469\"\n    readonly property string fa_broadcast_tower: \"\\uf519\"\n    readonly property string fa_broom: \"\\uf51a\"\n    readonly property string fa_brush: \"\\uf55d\"\n    readonly property string fa_btc: \"\\uf15a\"\n    readonly property string fa_bug: \"\\uf188\"\n    readonly property string fa_building: \"\\uf1ad\"\n    readonly property string fa_bullhorn: \"\\uf0a1\"\n    readonly property string fa_bullseye: \"\\uf140\"\n    readonly property string fa_burn: \"\\uf46a\"\n    readonly property string fa_buromobelexperte: \"\\uf37f\"\n    readonly property string fa_bus: \"\\uf207\"\n    readonly property string fa_bus_alt: \"\\uf55e\"\n    readonly property string fa_business_time: \"\\uf64a\"\n    readonly property string fa_buysellads: \"\\uf20d\"\n    readonly property string fa_calculator: \"\\uf1ec\"\n    readonly property string fa_calendar: \"\\uf133\"\n    readonly property string fa_calendar_alt: \"\\uf073\"\n    readonly property string fa_calendar_check: \"\\uf274\"\n    readonly property string fa_calendar_day: \"\\uf783\"\n    readonly property string fa_calendar_minus: \"\\uf272\"\n    readonly property string fa_calendar_plus: \"\\uf271\"\n    readonly property string fa_calendar_times: \"\\uf273\"\n    readonly property string fa_calendar_week: \"\\uf784\"\n    readonly property string fa_camera: \"\\uf030\"\n    readonly property string fa_camera_retro: \"\\uf083\"\n    readonly property string fa_campground: \"\\uf6bb\"\n    readonly property string fa_canadian_maple_leaf: \"\\uf785\"\n    readonly property string fa_candy_cane: \"\\uf786\"\n    readonly property string fa_cannabis: \"\\uf55f\"\n    readonly property string fa_capsules: \"\\uf46b\"\n    readonly property string fa_car: \"\\uf1b9\"\n    readonly property string fa_car_alt: \"\\uf5de\"\n    readonly property string fa_car_battery: \"\\uf5df\"\n    readonly property string fa_car_crash: \"\\uf5e1\"\n    readonly property string fa_car_side: \"\\uf5e4\"\n    readonly property string fa_caret_down: \"\\uf0d7\"\n    readonly property string fa_caret_left: \"\\uf0d9\"\n    readonly property string fa_caret_right: \"\\uf0da\"\n    readonly property string fa_caret_square_down: \"\\uf150\"\n    readonly property string fa_caret_square_left: \"\\uf191\"\n    readonly property string fa_caret_square_right: \"\\uf152\"\n    readonly property string fa_caret_square_up: \"\\uf151\"\n    readonly property string fa_caret_up: \"\\uf0d8\"\n    readonly property string fa_carrot: \"\\uf787\"\n    readonly property string fa_cart_arrow_down: \"\\uf218\"\n    readonly property string fa_cart_plus: \"\\uf217\"\n    readonly property string fa_cash_register: \"\\uf788\"\n    readonly property string fa_cat: \"\\uf6be\"\n    readonly property string fa_cc_amazon_pay: \"\\uf42d\"\n    readonly property string fa_cc_amex: \"\\uf1f3\"\n    readonly property string fa_cc_apple_pay: \"\\uf416\"\n    readonly property string fa_cc_diners_club: \"\\uf24c\"\n    readonly property string fa_cc_discover: \"\\uf1f2\"\n    readonly property string fa_cc_jcb: \"\\uf24b\"\n    readonly property string fa_cc_mastercard: \"\\uf1f1\"\n    readonly property string fa_cc_paypal: \"\\uf1f4\"\n    readonly property string fa_cc_stripe: \"\\uf1f5\"\n    readonly property string fa_cc_visa: \"\\uf1f0\"\n    readonly property string fa_centercode: \"\\uf380\"\n    readonly property string fa_centos: \"\\uf789\"\n    readonly property string fa_certificate: \"\\uf0a3\"\n    readonly property string fa_chair: \"\\uf6c0\"\n    readonly property string fa_chalkboard: \"\\uf51b\"\n    readonly property string fa_chalkboard_teacher: \"\\uf51c\"\n    readonly property string fa_charging_station: \"\\uf5e7\"\n    readonly property string fa_chart_area: \"\\uf1fe\"\n    readonly property string fa_chart_bar: \"\\uf080\"\n    readonly property string fa_chart_line: \"\\uf201\"\n    readonly property string fa_chart_pie: \"\\uf200\"\n    readonly property string fa_check: \"\\uf00c\"\n    readonly property string fa_check_circle: \"\\uf058\"\n    readonly property string fa_check_double: \"\\uf560\"\n    readonly property string fa_check_square: \"\\uf14a\"\n    readonly property string fa_cheese: \"\\uf7ef\"\n    readonly property string fa_chess: \"\\uf439\"\n    readonly property string fa_chess_bishop: \"\\uf43a\"\n    readonly property string fa_chess_board: \"\\uf43c\"\n    readonly property string fa_chess_king: \"\\uf43f\"\n    readonly property string fa_chess_knight: \"\\uf441\"\n    readonly property string fa_chess_pawn: \"\\uf443\"\n    readonly property string fa_chess_queen: \"\\uf445\"\n    readonly property string fa_chess_rook: \"\\uf447\"\n    readonly property string fa_chevron_circle_down: \"\\uf13a\"\n    readonly property string fa_chevron_circle_left: \"\\uf137\"\n    readonly property string fa_chevron_circle_right: \"\\uf138\"\n    readonly property string fa_chevron_circle_up: \"\\uf139\"\n    readonly property string fa_chevron_down: \"\\uf078\"\n    readonly property string fa_chevron_left: \"\\uf053\"\n    readonly property string fa_chevron_right: \"\\uf054\"\n    readonly property string fa_chevron_up: \"\\uf077\"\n    readonly property string fa_child: \"\\uf1ae\"\n    readonly property string fa_chrome: \"\\uf268\"\n    readonly property string fa_church: \"\\uf51d\"\n    readonly property string fa_circle: \"\\uf111\"\n    readonly property string fa_circle_notch: \"\\uf1ce\"\n    readonly property string fa_city: \"\\uf64f\"\n    readonly property string fa_clinic_medical: \"\\uf7f2\"\n    readonly property string fa_clipboard: \"\\uf328\"\n    readonly property string fa_clipboard_check: \"\\uf46c\"\n    readonly property string fa_clipboard_list: \"\\uf46d\"\n    readonly property string fa_clock: \"\\uf017\"\n    readonly property string fa_clone: \"\\uf24d\"\n    readonly property string fa_closed_captioning: \"\\uf20a\"\n    readonly property string fa_cloud: \"\\uf0c2\"\n    readonly property string fa_cloud_download_alt: \"\\uf381\"\n    readonly property string fa_cloud_meatball: \"\\uf73b\"\n    readonly property string fa_cloud_moon: \"\\uf6c3\"\n    readonly property string fa_cloud_moon_rain: \"\\uf73c\"\n    readonly property string fa_cloud_rain: \"\\uf73d\"\n    readonly property string fa_cloud_showers_heavy: \"\\uf740\"\n    readonly property string fa_cloud_sun: \"\\uf6c4\"\n    readonly property string fa_cloud_sun_rain: \"\\uf743\"\n    readonly property string fa_cloud_upload_alt: \"\\uf382\"\n    readonly property string fa_cloudscale: \"\\uf383\"\n    readonly property string fa_cloudsmith: \"\\uf384\"\n    readonly property string fa_cloudversify: \"\\uf385\"\n    readonly property string fa_cocktail: \"\\uf561\"\n    readonly property string fa_code: \"\\uf121\"\n    readonly property string fa_code_branch: \"\\uf126\"\n    readonly property string fa_codepen: \"\\uf1cb\"\n    readonly property string fa_codiepie: \"\\uf284\"\n    readonly property string fa_coffee: \"\\uf0f4\"\n    readonly property string fa_cog: \"\\uf013\"\n    readonly property string fa_cogs: \"\\uf085\"\n    readonly property string fa_coins: \"\\uf51e\"\n    readonly property string fa_columns: \"\\uf0db\"\n    readonly property string fa_comment: \"\\uf075\"\n    readonly property string fa_comment_alt: \"\\uf27a\"\n    readonly property string fa_comment_dollar: \"\\uf651\"\n    readonly property string fa_comment_dots: \"\\uf4ad\"\n    readonly property string fa_comment_medical: \"\\uf7f5\"\n    readonly property string fa_comment_slash: \"\\uf4b3\"\n    readonly property string fa_comments: \"\\uf086\"\n    readonly property string fa_comments_dollar: \"\\uf653\"\n    readonly property string fa_compact_disc: \"\\uf51f\"\n    readonly property string fa_compass: \"\\uf14e\"\n    readonly property string fa_compress: \"\\uf066\"\n    readonly property string fa_compress_arrows_alt: \"\\uf78c\"\n    readonly property string fa_concierge_bell: \"\\uf562\"\n    readonly property string fa_confluence: \"\\uf78d\"\n    readonly property string fa_connectdevelop: \"\\uf20e\"\n    readonly property string fa_contao: \"\\uf26d\"\n    readonly property string fa_cookie: \"\\uf563\"\n    readonly property string fa_cookie_bite: \"\\uf564\"\n    readonly property string fa_copy: \"\\uf0c5\"\n    readonly property string fa_copyright: \"\\uf1f9\"\n    readonly property string fa_couch: \"\\uf4b8\"\n    readonly property string fa_cpanel: \"\\uf388\"\n    readonly property string fa_creative_commons: \"\\uf25e\"\n    readonly property string fa_creative_commons_by: \"\\uf4e7\"\n    readonly property string fa_creative_commons_nc: \"\\uf4e8\"\n    readonly property string fa_creative_commons_nc_eu: \"\\uf4e9\"\n    readonly property string fa_creative_commons_nc_jp: \"\\uf4ea\"\n    readonly property string fa_creative_commons_nd: \"\\uf4eb\"\n    readonly property string fa_creative_commons_pd: \"\\uf4ec\"\n    readonly property string fa_creative_commons_pd_alt: \"\\uf4ed\"\n    readonly property string fa_creative_commons_remix: \"\\uf4ee\"\n    readonly property string fa_creative_commons_sa: \"\\uf4ef\"\n    readonly property string fa_creative_commons_sampling: \"\\uf4f0\"\n    readonly property string fa_creative_commons_sampling_plus: \"\\uf4f1\"\n    readonly property string fa_creative_commons_share: \"\\uf4f2\"\n    readonly property string fa_creative_commons_zero: \"\\uf4f3\"\n    readonly property string fa_credit_card: \"\\uf09d\"\n    readonly property string fa_critical_role: \"\\uf6c9\"\n    readonly property string fa_crop: \"\\uf125\"\n    readonly property string fa_crop_alt: \"\\uf565\"\n    readonly property string fa_cross: \"\\uf654\"\n    readonly property string fa_crosshairs: \"\\uf05b\"\n    readonly property string fa_crow: \"\\uf520\"\n    readonly property string fa_crown: \"\\uf521\"\n    readonly property string fa_crutch: \"\\uf7f7\"\n    readonly property string fa_css3: \"\\uf13c\"\n    readonly property string fa_css3_alt: \"\\uf38b\"\n    readonly property string fa_cube: \"\\uf1b2\"\n    readonly property string fa_cubes: \"\\uf1b3\"\n    readonly property string fa_cut: \"\\uf0c4\"\n    readonly property string fa_cuttlefish: \"\\uf38c\"\n    readonly property string fa_d_and_d: \"\\uf38d\"\n    readonly property string fa_d_and_d_beyond: \"\\uf6ca\"\n    readonly property string fa_dashcube: \"\\uf210\"\n    readonly property string fa_database: \"\\uf1c0\"\n    readonly property string fa_deaf: \"\\uf2a4\"\n    readonly property string fa_delicious: \"\\uf1a5\"\n    readonly property string fa_democrat: \"\\uf747\"\n    readonly property string fa_deploydog: \"\\uf38e\"\n    readonly property string fa_deskpro: \"\\uf38f\"\n    readonly property string fa_desktop: \"\\uf108\"\n    readonly property string fa_dev: \"\\uf6cc\"\n    readonly property string fa_deviantart: \"\\uf1bd\"\n    readonly property string fa_dharmachakra: \"\\uf655\"\n    readonly property string fa_dhl: \"\\uf790\"\n    readonly property string fa_diagnoses: \"\\uf470\"\n    readonly property string fa_diaspora: \"\\uf791\"\n    readonly property string fa_dice: \"\\uf522\"\n    readonly property string fa_dice_d20: \"\\uf6cf\"\n    readonly property string fa_dice_d6: \"\\uf6d1\"\n    readonly property string fa_dice_five: \"\\uf523\"\n    readonly property string fa_dice_four: \"\\uf524\"\n    readonly property string fa_dice_one: \"\\uf525\"\n    readonly property string fa_dice_six: \"\\uf526\"\n    readonly property string fa_dice_three: \"\\uf527\"\n    readonly property string fa_dice_two: \"\\uf528\"\n    readonly property string fa_digg: \"\\uf1a6\"\n    readonly property string fa_digital_ocean: \"\\uf391\"\n    readonly property string fa_digital_tachograph: \"\\uf566\"\n    readonly property string fa_directions: \"\\uf5eb\"\n    readonly property string fa_discord: \"\\uf392\"\n    readonly property string fa_discourse: \"\\uf393\"\n    readonly property string fa_divide: \"\\uf529\"\n    readonly property string fa_dizzy: \"\\uf567\"\n    readonly property string fa_dna: \"\\uf471\"\n    readonly property string fa_dochub: \"\\uf394\"\n    readonly property string fa_docker: \"\\uf395\"\n    readonly property string fa_dog: \"\\uf6d3\"\n    readonly property string fa_dollar_sign: \"\\uf155\"\n    readonly property string fa_dolly: \"\\uf472\"\n    readonly property string fa_dolly_flatbed: \"\\uf474\"\n    readonly property string fa_donate: \"\\uf4b9\"\n    readonly property string fa_door_closed: \"\\uf52a\"\n    readonly property string fa_door_open: \"\\uf52b\"\n    readonly property string fa_dot_circle: \"\\uf192\"\n    readonly property string fa_dove: \"\\uf4ba\"\n    readonly property string fa_download: \"\\uf019\"\n    readonly property string fa_draft2digital: \"\\uf396\"\n    readonly property string fa_drafting_compass: \"\\uf568\"\n    readonly property string fa_dragon: \"\\uf6d5\"\n    readonly property string fa_draw_polygon: \"\\uf5ee\"\n    readonly property string fa_dribbble: \"\\uf17d\"\n    readonly property string fa_dribbble_square: \"\\uf397\"\n    readonly property string fa_dropbox: \"\\uf16b\"\n    readonly property string fa_drum: \"\\uf569\"\n    readonly property string fa_drum_steelpan: \"\\uf56a\"\n    readonly property string fa_drumstick_bite: \"\\uf6d7\"\n    readonly property string fa_drupal: \"\\uf1a9\"\n    readonly property string fa_dumbbell: \"\\uf44b\"\n    readonly property string fa_dumpster: \"\\uf793\"\n    readonly property string fa_dumpster_fire: \"\\uf794\"\n    readonly property string fa_dungeon: \"\\uf6d9\"\n    readonly property string fa_dyalog: \"\\uf399\"\n    readonly property string fa_earlybirds: \"\\uf39a\"\n    readonly property string fa_ebay: \"\\uf4f4\"\n    readonly property string fa_edge: \"\\uf282\"\n    readonly property string fa_edit: \"\\uf044\"\n    readonly property string fa_egg: \"\\uf7fb\"\n    readonly property string fa_eject: \"\\uf052\"\n    readonly property string fa_elementor: \"\\uf430\"\n    readonly property string fa_ellipsis_h: \"\\uf141\"\n    readonly property string fa_ellipsis_v: \"\\uf142\"\n    readonly property string fa_ello: \"\\uf5f1\"\n    readonly property string fa_ember: \"\\uf423\"\n    readonly property string fa_empire: \"\\uf1d1\"\n    readonly property string fa_envelope: \"\\uf0e0\"\n    readonly property string fa_envelope_open: \"\\uf2b6\"\n    readonly property string fa_envelope_open_text: \"\\uf658\"\n    readonly property string fa_envelope_square: \"\\uf199\"\n    readonly property string fa_envira: \"\\uf299\"\n    readonly property string fa_equals: \"\\uf52c\"\n    readonly property string fa_eraser: \"\\uf12d\"\n    readonly property string fa_erlang: \"\\uf39d\"\n    readonly property string fa_ethereum: \"\\uf42e\"\n    readonly property string fa_ethernet: \"\\uf796\"\n    readonly property string fa_etsy: \"\\uf2d7\"\n    readonly property string fa_euro_sign: \"\\uf153\"\n    readonly property string fa_exchange_alt: \"\\uf362\"\n    readonly property string fa_exclamation: \"\\uf12a\"\n    readonly property string fa_exclamation_circle: \"\\uf06a\"\n    readonly property string fa_exclamation_triangle: \"\\uf071\"\n    readonly property string fa_expand: \"\\uf065\"\n    readonly property string fa_expand_arrows_alt: \"\\uf31e\"\n    readonly property string fa_expeditedssl: \"\\uf23e\"\n    readonly property string fa_external_link_alt: \"\\uf35d\"\n    readonly property string fa_external_link_square_alt: \"\\uf360\"\n    readonly property string fa_eye: \"\\uf06e\"\n    readonly property string fa_eye_dropper: \"\\uf1fb\"\n    readonly property string fa_eye_slash: \"\\uf070\"\n    readonly property string fa_facebook: \"\\uf09a\"\n    readonly property string fa_facebook_f: \"\\uf39e\"\n    readonly property string fa_facebook_messenger: \"\\uf39f\"\n    readonly property string fa_facebook_square: \"\\uf082\"\n    readonly property string fa_fantasy_flight_games: \"\\uf6dc\"\n    readonly property string fa_fast_backward: \"\\uf049\"\n    readonly property string fa_fast_forward: \"\\uf050\"\n    readonly property string fa_fax: \"\\uf1ac\"\n    readonly property string fa_feather: \"\\uf52d\"\n    readonly property string fa_feather_alt: \"\\uf56b\"\n    readonly property string fa_fedex: \"\\uf797\"\n    readonly property string fa_fedora: \"\\uf798\"\n    readonly property string fa_female: \"\\uf182\"\n    readonly property string fa_fighter_jet: \"\\uf0fb\"\n    readonly property string fa_figma: \"\\uf799\"\n    readonly property string fa_file: \"\\uf15b\"\n    readonly property string fa_file_alt: \"\\uf15c\"\n    readonly property string fa_file_archive: \"\\uf1c6\"\n    readonly property string fa_file_audio: \"\\uf1c7\"\n    readonly property string fa_file_code: \"\\uf1c9\"\n    readonly property string fa_file_contract: \"\\uf56c\"\n    readonly property string fa_file_csv: \"\\uf6dd\"\n    readonly property string fa_file_download: \"\\uf56d\"\n    readonly property string fa_file_excel: \"\\uf1c3\"\n    readonly property string fa_file_export: \"\\uf56e\"\n    readonly property string fa_file_image: \"\\uf1c5\"\n    readonly property string fa_file_import: \"\\uf56f\"\n    readonly property string fa_file_invoice: \"\\uf570\"\n    readonly property string fa_file_invoice_dollar: \"\\uf571\"\n    readonly property string fa_file_medical: \"\\uf477\"\n    readonly property string fa_file_medical_alt: \"\\uf478\"\n    readonly property string fa_file_pdf: \"\\uf1c1\"\n    readonly property string fa_file_powerpoint: \"\\uf1c4\"\n    readonly property string fa_file_prescription: \"\\uf572\"\n    readonly property string fa_file_signature: \"\\uf573\"\n    readonly property string fa_file_upload: \"\\uf574\"\n    readonly property string fa_file_video: \"\\uf1c8\"\n    readonly property string fa_file_word: \"\\uf1c2\"\n    readonly property string fa_fill: \"\\uf575\"\n    readonly property string fa_fill_drip: \"\\uf576\"\n    readonly property string fa_film: \"\\uf008\"\n    readonly property string fa_filter: \"\\uf0b0\"\n    readonly property string fa_fingerprint: \"\\uf577\"\n    readonly property string fa_fire: \"\\uf06d\"\n    readonly property string fa_fire_alt: \"\\uf7e4\"\n    readonly property string fa_fire_extinguisher: \"\\uf134\"\n    readonly property string fa_firefox: \"\\uf269\"\n    readonly property string fa_first_aid: \"\\uf479\"\n    readonly property string fa_first_order: \"\\uf2b0\"\n    readonly property string fa_first_order_alt: \"\\uf50a\"\n    readonly property string fa_firstdraft: \"\\uf3a1\"\n    readonly property string fa_fish: \"\\uf578\"\n    readonly property string fa_fist_raised: \"\\uf6de\"\n    readonly property string fa_flag: \"\\uf024\"\n    readonly property string fa_flag_checkered: \"\\uf11e\"\n    readonly property string fa_flag_usa: \"\\uf74d\"\n    readonly property string fa_flask: \"\\uf0c3\"\n    readonly property string fa_flickr: \"\\uf16e\"\n    readonly property string fa_flipboard: \"\\uf44d\"\n    readonly property string fa_flushed: \"\\uf579\"\n    readonly property string fa_fly: \"\\uf417\"\n    readonly property string fa_folder: \"\\uf07b\"\n    readonly property string fa_folder_minus: \"\\uf65d\"\n    readonly property string fa_folder_open: \"\\uf07c\"\n    readonly property string fa_folder_plus: \"\\uf65e\"\n    readonly property string fa_font: \"\\uf031\"\n    readonly property string fa_font_awesome: \"\\uf2b4\"\n    readonly property string fa_font_awesome_alt: \"\\uf35c\"\n    readonly property string fa_font_awesome_flag: \"\\uf425\"\n    readonly property string fa_font_awesome_logo_full: \"\\uf4e6\"\n    readonly property string fa_fonticons: \"\\uf280\"\n    readonly property string fa_fonticons_fi: \"\\uf3a2\"\n    readonly property string fa_football_ball: \"\\uf44e\"\n    readonly property string fa_fort_awesome: \"\\uf286\"\n    readonly property string fa_fort_awesome_alt: \"\\uf3a3\"\n    readonly property string fa_forumbee: \"\\uf211\"\n    readonly property string fa_forward: \"\\uf04e\"\n    readonly property string fa_foursquare: \"\\uf180\"\n    readonly property string fa_free_code_camp: \"\\uf2c5\"\n    readonly property string fa_freebsd: \"\\uf3a4\"\n    readonly property string fa_frog: \"\\uf52e\"\n    readonly property string fa_frown: \"\\uf119\"\n    readonly property string fa_frown_open: \"\\uf57a\"\n    readonly property string fa_fulcrum: \"\\uf50b\"\n    readonly property string fa_funnel_dollar: \"\\uf662\"\n    readonly property string fa_futbol: \"\\uf1e3\"\n    readonly property string fa_galactic_republic: \"\\uf50c\"\n    readonly property string fa_galactic_senate: \"\\uf50d\"\n    readonly property string fa_gamepad: \"\\uf11b\"\n    readonly property string fa_gas_pump: \"\\uf52f\"\n    readonly property string fa_gavel: \"\\uf0e3\"\n    readonly property string fa_gem: \"\\uf3a5\"\n    readonly property string fa_genderless: \"\\uf22d\"\n    readonly property string fa_get_pocket: \"\\uf265\"\n    readonly property string fa_gg: \"\\uf260\"\n    readonly property string fa_gg_circle: \"\\uf261\"\n    readonly property string fa_ghost: \"\\uf6e2\"\n    readonly property string fa_gift: \"\\uf06b\"\n    readonly property string fa_gifts: \"\\uf79c\"\n    readonly property string fa_git: \"\\uf1d3\"\n    readonly property string fa_git_square: \"\\uf1d2\"\n    readonly property string fa_github: \"\\uf09b\"\n    readonly property string fa_github_alt: \"\\uf113\"\n    readonly property string fa_github_square: \"\\uf092\"\n    readonly property string fa_gitkraken: \"\\uf3a6\"\n    readonly property string fa_gitlab: \"\\uf296\"\n    readonly property string fa_gitter: \"\\uf426\"\n    readonly property string fa_glass_cheers: \"\\uf79f\"\n    readonly property string fa_glass_martini: \"\\uf000\"\n    readonly property string fa_glass_martini_alt: \"\\uf57b\"\n    readonly property string fa_glass_whiskey: \"\\uf7a0\"\n    readonly property string fa_glasses: \"\\uf530\"\n    readonly property string fa_glide: \"\\uf2a5\"\n    readonly property string fa_glide_g: \"\\uf2a6\"\n    readonly property string fa_globe: \"\\uf0ac\"\n    readonly property string fa_globe_africa: \"\\uf57c\"\n    readonly property string fa_globe_americas: \"\\uf57d\"\n    readonly property string fa_globe_asia: \"\\uf57e\"\n    readonly property string fa_globe_europe: \"\\uf7a2\"\n    readonly property string fa_gofore: \"\\uf3a7\"\n    readonly property string fa_golf_ball: \"\\uf450\"\n    readonly property string fa_goodreads: \"\\uf3a8\"\n    readonly property string fa_goodreads_g: \"\\uf3a9\"\n    readonly property string fa_google: \"\\uf1a0\"\n    readonly property string fa_google_drive: \"\\uf3aa\"\n    readonly property string fa_google_play: \"\\uf3ab\"\n    readonly property string fa_google_plus: \"\\uf2b3\"\n    readonly property string fa_google_plus_g: \"\\uf0d5\"\n    readonly property string fa_google_plus_square: \"\\uf0d4\"\n    readonly property string fa_google_wallet: \"\\uf1ee\"\n    readonly property string fa_gopuram: \"\\uf664\"\n    readonly property string fa_graduation_cap: \"\\uf19d\"\n    readonly property string fa_gratipay: \"\\uf184\"\n    readonly property string fa_grav: \"\\uf2d6\"\n    readonly property string fa_greater_than: \"\\uf531\"\n    readonly property string fa_greater_than_equal: \"\\uf532\"\n    readonly property string fa_grimace: \"\\uf57f\"\n    readonly property string fa_grin: \"\\uf580\"\n    readonly property string fa_grin_alt: \"\\uf581\"\n    readonly property string fa_grin_beam: \"\\uf582\"\n    readonly property string fa_grin_beam_sweat: \"\\uf583\"\n    readonly property string fa_grin_hearts: \"\\uf584\"\n    readonly property string fa_grin_squint: \"\\uf585\"\n    readonly property string fa_grin_squint_tears: \"\\uf586\"\n    readonly property string fa_grin_stars: \"\\uf587\"\n    readonly property string fa_grin_tears: \"\\uf588\"\n    readonly property string fa_grin_tongue: \"\\uf589\"\n    readonly property string fa_grin_tongue_squint: \"\\uf58a\"\n    readonly property string fa_grin_tongue_wink: \"\\uf58b\"\n    readonly property string fa_grin_wink: \"\\uf58c\"\n    readonly property string fa_grip_horizontal: \"\\uf58d\"\n    readonly property string fa_grip_lines: \"\\uf7a4\"\n    readonly property string fa_grip_lines_vertical: \"\\uf7a5\"\n    readonly property string fa_grip_vertical: \"\\uf58e\"\n    readonly property string fa_gripfire: \"\\uf3ac\"\n    readonly property string fa_grunt: \"\\uf3ad\"\n    readonly property string fa_guitar: \"\\uf7a6\"\n    readonly property string fa_gulp: \"\\uf3ae\"\n    readonly property string fa_h_square: \"\\uf0fd\"\n    readonly property string fa_hacker_news: \"\\uf1d4\"\n    readonly property string fa_hacker_news_square: \"\\uf3af\"\n    readonly property string fa_hackerrank: \"\\uf5f7\"\n    readonly property string fa_hamburger: \"\\uf805\"\n    readonly property string fa_hammer: \"\\uf6e3\"\n    readonly property string fa_hamsa: \"\\uf665\"\n    readonly property string fa_hand_holding: \"\\uf4bd\"\n    readonly property string fa_hand_holding_heart: \"\\uf4be\"\n    readonly property string fa_hand_holding_usd: \"\\uf4c0\"\n    readonly property string fa_hand_lizard: \"\\uf258\"\n    readonly property string fa_hand_middle_finger: \"\\uf806\"\n    readonly property string fa_hand_paper: \"\\uf256\"\n    readonly property string fa_hand_peace: \"\\uf25b\"\n    readonly property string fa_hand_point_down: \"\\uf0a7\"\n    readonly property string fa_hand_point_left: \"\\uf0a5\"\n    readonly property string fa_hand_point_right: \"\\uf0a4\"\n    readonly property string fa_hand_point_up: \"\\uf0a6\"\n    readonly property string fa_hand_pointer: \"\\uf25a\"\n    readonly property string fa_hand_rock: \"\\uf255\"\n    readonly property string fa_hand_scissors: \"\\uf257\"\n    readonly property string fa_hand_spock: \"\\uf259\"\n    readonly property string fa_hands: \"\\uf4c2\"\n    readonly property string fa_hands_helping: \"\\uf4c4\"\n    readonly property string fa_handshake: \"\\uf2b5\"\n    readonly property string fa_hanukiah: \"\\uf6e6\"\n    readonly property string fa_hard_hat: \"\\uf807\"\n    readonly property string fa_hashtag: \"\\uf292\"\n    readonly property string fa_hat_wizard: \"\\uf6e8\"\n    readonly property string fa_haykal: \"\\uf666\"\n    readonly property string fa_hdd: \"\\uf0a0\"\n    readonly property string fa_heading: \"\\uf1dc\"\n    readonly property string fa_headphones: \"\\uf025\"\n    readonly property string fa_headphones_alt: \"\\uf58f\"\n    readonly property string fa_headset: \"\\uf590\"\n    readonly property string fa_heart: \"\\uf004\"\n    readonly property string fa_heart_broken: \"\\uf7a9\"\n    readonly property string fa_heartbeat: \"\\uf21e\"\n    readonly property string fa_helicopter: \"\\uf533\"\n    readonly property string fa_highlighter: \"\\uf591\"\n    readonly property string fa_hiking: \"\\uf6ec\"\n    readonly property string fa_hippo: \"\\uf6ed\"\n    readonly property string fa_hips: \"\\uf452\"\n    readonly property string fa_hire_a_helper: \"\\uf3b0\"\n    readonly property string fa_history: \"\\uf1da\"\n    readonly property string fa_hockey_puck: \"\\uf453\"\n    readonly property string fa_holly_berry: \"\\uf7aa\"\n    readonly property string fa_home: \"\\uf015\"\n    readonly property string fa_hooli: \"\\uf427\"\n    readonly property string fa_hornbill: \"\\uf592\"\n    readonly property string fa_horse: \"\\uf6f0\"\n    readonly property string fa_horse_head: \"\\uf7ab\"\n    readonly property string fa_hospital: \"\\uf0f8\"\n    readonly property string fa_hospital_alt: \"\\uf47d\"\n    readonly property string fa_hospital_symbol: \"\\uf47e\"\n    readonly property string fa_hot_tub: \"\\uf593\"\n    readonly property string fa_hotdog: \"\\uf80f\"\n    readonly property string fa_hotel: \"\\uf594\"\n    readonly property string fa_hotjar: \"\\uf3b1\"\n    readonly property string fa_hourglass: \"\\uf254\"\n    readonly property string fa_hourglass_end: \"\\uf253\"\n    readonly property string fa_hourglass_half: \"\\uf252\"\n    readonly property string fa_hourglass_start: \"\\uf251\"\n    readonly property string fa_house_damage: \"\\uf6f1\"\n    readonly property string fa_houzz: \"\\uf27c\"\n    readonly property string fa_hryvnia: \"\\uf6f2\"\n    readonly property string fa_html5: \"\\uf13b\"\n    readonly property string fa_hubspot: \"\\uf3b2\"\n    readonly property string fa_i_cursor: \"\\uf246\"\n    readonly property string fa_ice_cream: \"\\uf810\"\n    readonly property string fa_icicles: \"\\uf7ad\"\n    readonly property string fa_id_badge: \"\\uf2c1\"\n    readonly property string fa_id_card: \"\\uf2c2\"\n    readonly property string fa_id_card_alt: \"\\uf47f\"\n    readonly property string fa_igloo: \"\\uf7ae\"\n    readonly property string fa_image: \"\\uf03e\"\n    readonly property string fa_images: \"\\uf302\"\n    readonly property string fa_imdb: \"\\uf2d8\"\n    readonly property string fa_inbox: \"\\uf01c\"\n    readonly property string fa_indent: \"\\uf03c\"\n    readonly property string fa_industry: \"\\uf275\"\n    readonly property string fa_infinity: \"\\uf534\"\n    readonly property string fa_info: \"\\uf129\"\n    readonly property string fa_info_circle: \"\\uf05a\"\n    readonly property string fa_instagram: \"\\uf16d\"\n    readonly property string fa_intercom: \"\\uf7af\"\n    readonly property string fa_internet_explorer: \"\\uf26b\"\n    readonly property string fa_invision: \"\\uf7b0\"\n    readonly property string fa_ioxhost: \"\\uf208\"\n    readonly property string fa_italic: \"\\uf033\"\n    readonly property string fa_itunes: \"\\uf3b4\"\n    readonly property string fa_itunes_note: \"\\uf3b5\"\n    readonly property string fa_java: \"\\uf4e4\"\n    readonly property string fa_jedi: \"\\uf669\"\n    readonly property string fa_jedi_order: \"\\uf50e\"\n    readonly property string fa_jenkins: \"\\uf3b6\"\n    readonly property string fa_jira: \"\\uf7b1\"\n    readonly property string fa_joget: \"\\uf3b7\"\n    readonly property string fa_joint: \"\\uf595\"\n    readonly property string fa_joomla: \"\\uf1aa\"\n    readonly property string fa_journal_whills: \"\\uf66a\"\n    readonly property string fa_js: \"\\uf3b8\"\n    readonly property string fa_js_square: \"\\uf3b9\"\n    readonly property string fa_jsfiddle: \"\\uf1cc\"\n    readonly property string fa_kaaba: \"\\uf66b\"\n    readonly property string fa_kaggle: \"\\uf5fa\"\n    readonly property string fa_key: \"\\uf084\"\n    readonly property string fa_keybase: \"\\uf4f5\"\n    readonly property string fa_keyboard: \"\\uf11c\"\n    readonly property string fa_keycdn: \"\\uf3ba\"\n    readonly property string fa_khanda: \"\\uf66d\"\n    readonly property string fa_kickstarter: \"\\uf3bb\"\n    readonly property string fa_kickstarter_k: \"\\uf3bc\"\n    readonly property string fa_kiss: \"\\uf596\"\n    readonly property string fa_kiss_beam: \"\\uf597\"\n    readonly property string fa_kiss_wink_heart: \"\\uf598\"\n    readonly property string fa_kiwi_bird: \"\\uf535\"\n    readonly property string fa_korvue: \"\\uf42f\"\n    readonly property string fa_landmark: \"\\uf66f\"\n    readonly property string fa_language: \"\\uf1ab\"\n    readonly property string fa_laptop: \"\\uf109\"\n    readonly property string fa_laptop_code: \"\\uf5fc\"\n    readonly property string fa_laptop_medical: \"\\uf812\"\n    readonly property string fa_laravel: \"\\uf3bd\"\n    readonly property string fa_lastfm: \"\\uf202\"\n    readonly property string fa_lastfm_square: \"\\uf203\"\n    readonly property string fa_laugh: \"\\uf599\"\n    readonly property string fa_laugh_beam: \"\\uf59a\"\n    readonly property string fa_laugh_squint: \"\\uf59b\"\n    readonly property string fa_laugh_wink: \"\\uf59c\"\n    readonly property string fa_layer_group: \"\\uf5fd\"\n    readonly property string fa_leaf: \"\\uf06c\"\n    readonly property string fa_leanpub: \"\\uf212\"\n    readonly property string fa_lemon: \"\\uf094\"\n    readonly property string fa_less: \"\\uf41d\"\n    readonly property string fa_less_than: \"\\uf536\"\n    readonly property string fa_less_than_equal: \"\\uf537\"\n    readonly property string fa_level_down_alt: \"\\uf3be\"\n    readonly property string fa_level_up_alt: \"\\uf3bf\"\n    readonly property string fa_life_ring: \"\\uf1cd\"\n    readonly property string fa_lightbulb: \"\\uf0eb\"\n    readonly property string fa_line: \"\\uf3c0\"\n    readonly property string fa_link: \"\\uf0c1\"\n    readonly property string fa_linkedin: \"\\uf08c\"\n    readonly property string fa_linkedin_in: \"\\uf0e1\"\n    readonly property string fa_linode: \"\\uf2b8\"\n    readonly property string fa_linux: \"\\uf17c\"\n    readonly property string fa_lira_sign: \"\\uf195\"\n    readonly property string fa_list: \"\\uf03a\"\n    readonly property string fa_list_alt: \"\\uf022\"\n    readonly property string fa_list_ol: \"\\uf0cb\"\n    readonly property string fa_list_ul: \"\\uf0ca\"\n    readonly property string fa_location_arrow: \"\\uf124\"\n    readonly property string fa_lock: \"\\uf023\"\n    readonly property string fa_lock_open: \"\\uf3c1\"\n    readonly property string fa_long_arrow_alt_down: \"\\uf309\"\n    readonly property string fa_long_arrow_alt_left: \"\\uf30a\"\n    readonly property string fa_long_arrow_alt_right: \"\\uf30b\"\n    readonly property string fa_long_arrow_alt_up: \"\\uf30c\"\n    readonly property string fa_low_vision: \"\\uf2a8\"\n    readonly property string fa_luggage_cart: \"\\uf59d\"\n    readonly property string fa_lyft: \"\\uf3c3\"\n    readonly property string fa_magento: \"\\uf3c4\"\n    readonly property string fa_magic: \"\\uf0d0\"\n    readonly property string fa_magnet: \"\\uf076\"\n    readonly property string fa_mail_bulk: \"\\uf674\"\n    readonly property string fa_mailchimp: \"\\uf59e\"\n    readonly property string fa_male: \"\\uf183\"\n    readonly property string fa_mandalorian: \"\\uf50f\"\n    readonly property string fa_map: \"\\uf279\"\n    readonly property string fa_map_marked: \"\\uf59f\"\n    readonly property string fa_map_marked_alt: \"\\uf5a0\"\n    readonly property string fa_map_marker: \"\\uf041\"\n    readonly property string fa_map_marker_alt: \"\\uf3c5\"\n    readonly property string fa_map_pin: \"\\uf276\"\n    readonly property string fa_map_signs: \"\\uf277\"\n    readonly property string fa_markdown: \"\\uf60f\"\n    readonly property string fa_marker: \"\\uf5a1\"\n    readonly property string fa_mars: \"\\uf222\"\n    readonly property string fa_mars_double: \"\\uf227\"\n    readonly property string fa_mars_stroke: \"\\uf229\"\n    readonly property string fa_mars_stroke_h: \"\\uf22b\"\n    readonly property string fa_mars_stroke_v: \"\\uf22a\"\n    readonly property string fa_mask: \"\\uf6fa\"\n    readonly property string fa_mastodon: \"\\uf4f6\"\n    readonly property string fa_maxcdn: \"\\uf136\"\n    readonly property string fa_medal: \"\\uf5a2\"\n    readonly property string fa_medapps: \"\\uf3c6\"\n    readonly property string fa_medium: \"\\uf23a\"\n    readonly property string fa_medium_m: \"\\uf3c7\"\n    readonly property string fa_medkit: \"\\uf0fa\"\n    readonly property string fa_medrt: \"\\uf3c8\"\n    readonly property string fa_meetup: \"\\uf2e0\"\n    readonly property string fa_megaport: \"\\uf5a3\"\n    readonly property string fa_meh: \"\\uf11a\"\n    readonly property string fa_meh_blank: \"\\uf5a4\"\n    readonly property string fa_meh_rolling_eyes: \"\\uf5a5\"\n    readonly property string fa_memory: \"\\uf538\"\n    readonly property string fa_mendeley: \"\\uf7b3\"\n    readonly property string fa_menorah: \"\\uf676\"\n    readonly property string fa_mercury: \"\\uf223\"\n    readonly property string fa_meteor: \"\\uf753\"\n    readonly property string fa_microchip: \"\\uf2db\"\n    readonly property string fa_microphone: \"\\uf130\"\n    readonly property string fa_microphone_alt: \"\\uf3c9\"\n    readonly property string fa_microphone_alt_slash: \"\\uf539\"\n    readonly property string fa_microphone_slash: \"\\uf131\"\n    readonly property string fa_microscope: \"\\uf610\"\n    readonly property string fa_microsoft: \"\\uf3ca\"\n    readonly property string fa_minus: \"\\uf068\"\n    readonly property string fa_minus_circle: \"\\uf056\"\n    readonly property string fa_minus_square: \"\\uf146\"\n    readonly property string fa_mitten: \"\\uf7b5\"\n    readonly property string fa_mix: \"\\uf3cb\"\n    readonly property string fa_mixcloud: \"\\uf289\"\n    readonly property string fa_mizuni: \"\\uf3cc\"\n    readonly property string fa_mobile: \"\\uf10b\"\n    readonly property string fa_mobile_alt: \"\\uf3cd\"\n    readonly property string fa_modx: \"\\uf285\"\n    readonly property string fa_monero: \"\\uf3d0\"\n    readonly property string fa_money_bill: \"\\uf0d6\"\n    readonly property string fa_money_bill_alt: \"\\uf3d1\"\n    readonly property string fa_money_bill_wave: \"\\uf53a\"\n    readonly property string fa_money_bill_wave_alt: \"\\uf53b\"\n    readonly property string fa_money_check: \"\\uf53c\"\n    readonly property string fa_money_check_alt: \"\\uf53d\"\n    readonly property string fa_monument: \"\\uf5a6\"\n    readonly property string fa_moon: \"\\uf186\"\n    readonly property string fa_mortar_pestle: \"\\uf5a7\"\n    readonly property string fa_mosque: \"\\uf678\"\n    readonly property string fa_motorcycle: \"\\uf21c\"\n    readonly property string fa_mountain: \"\\uf6fc\"\n    readonly property string fa_mouse_pointer: \"\\uf245\"\n    readonly property string fa_mug_hot: \"\\uf7b6\"\n    readonly property string fa_music: \"\\uf001\"\n    readonly property string fa_napster: \"\\uf3d2\"\n    readonly property string fa_neos: \"\\uf612\"\n    readonly property string fa_network_wired: \"\\uf6ff\"\n    readonly property string fa_neuter: \"\\uf22c\"\n    readonly property string fa_newspaper: \"\\uf1ea\"\n    readonly property string fa_nimblr: \"\\uf5a8\"\n    readonly property string fa_nintendo_switch: \"\\uf418\"\n    readonly property string fa_node: \"\\uf419\"\n    readonly property string fa_node_js: \"\\uf3d3\"\n    readonly property string fa_not_equal: \"\\uf53e\"\n    readonly property string fa_notes_medical: \"\\uf481\"\n    readonly property string fa_npm: \"\\uf3d4\"\n    readonly property string fa_ns8: \"\\uf3d5\"\n    readonly property string fa_nutritionix: \"\\uf3d6\"\n    readonly property string fa_object_group: \"\\uf247\"\n    readonly property string fa_object_ungroup: \"\\uf248\"\n    readonly property string fa_odnoklassniki: \"\\uf263\"\n    readonly property string fa_odnoklassniki_square: \"\\uf264\"\n    readonly property string fa_oil_can: \"\\uf613\"\n    readonly property string fa_old_republic: \"\\uf510\"\n    readonly property string fa_om: \"\\uf679\"\n    readonly property string fa_opencart: \"\\uf23d\"\n    readonly property string fa_openid: \"\\uf19b\"\n    readonly property string fa_opera: \"\\uf26a\"\n    readonly property string fa_optin_monster: \"\\uf23c\"\n    readonly property string fa_osi: \"\\uf41a\"\n    readonly property string fa_otter: \"\\uf700\"\n    readonly property string fa_outdent: \"\\uf03b\"\n    readonly property string fa_page4: \"\\uf3d7\"\n    readonly property string fa_pagelines: \"\\uf18c\"\n    readonly property string fa_pager: \"\\uf815\"\n    readonly property string fa_paint_brush: \"\\uf1fc\"\n    readonly property string fa_paint_roller: \"\\uf5aa\"\n    readonly property string fa_palette: \"\\uf53f\"\n    readonly property string fa_palfed: \"\\uf3d8\"\n    readonly property string fa_pallet: \"\\uf482\"\n    readonly property string fa_paper_plane: \"\\uf1d8\"\n    readonly property string fa_paperclip: \"\\uf0c6\"\n    readonly property string fa_parachute_box: \"\\uf4cd\"\n    readonly property string fa_paragraph: \"\\uf1dd\"\n    readonly property string fa_parking: \"\\uf540\"\n    readonly property string fa_passport: \"\\uf5ab\"\n    readonly property string fa_pastafarianism: \"\\uf67b\"\n    readonly property string fa_paste: \"\\uf0ea\"\n    readonly property string fa_patreon: \"\\uf3d9\"\n    readonly property string fa_pause: \"\\uf04c\"\n    readonly property string fa_pause_circle: \"\\uf28b\"\n    readonly property string fa_paw: \"\\uf1b0\"\n    readonly property string fa_paypal: \"\\uf1ed\"\n    readonly property string fa_peace: \"\\uf67c\"\n    readonly property string fa_pen: \"\\uf304\"\n    readonly property string fa_pen_alt: \"\\uf305\"\n    readonly property string fa_pen_fancy: \"\\uf5ac\"\n    readonly property string fa_pen_nib: \"\\uf5ad\"\n    readonly property string fa_pen_square: \"\\uf14b\"\n    readonly property string fa_pencil_alt: \"\\uf303\"\n    readonly property string fa_pencil_ruler: \"\\uf5ae\"\n    readonly property string fa_penny_arcade: \"\\uf704\"\n    readonly property string fa_people_carry: \"\\uf4ce\"\n    readonly property string fa_pepper_hot: \"\\uf816\"\n    readonly property string fa_percent: \"\\uf295\"\n    readonly property string fa_percentage: \"\\uf541\"\n    readonly property string fa_periscope: \"\\uf3da\"\n    readonly property string fa_person_booth: \"\\uf756\"\n    readonly property string fa_phabricator: \"\\uf3db\"\n    readonly property string fa_phoenix_framework: \"\\uf3dc\"\n    readonly property string fa_phoenix_squadron: \"\\uf511\"\n    readonly property string fa_phone: \"\\uf095\"\n    readonly property string fa_phone_slash: \"\\uf3dd\"\n    readonly property string fa_phone_square: \"\\uf098\"\n    readonly property string fa_phone_volume: \"\\uf2a0\"\n    readonly property string fa_php: \"\\uf457\"\n    readonly property string fa_pied_piper: \"\\uf2ae\"\n    readonly property string fa_pied_piper_alt: \"\\uf1a8\"\n    readonly property string fa_pied_piper_hat: \"\\uf4e5\"\n    readonly property string fa_pied_piper_pp: \"\\uf1a7\"\n    readonly property string fa_piggy_bank: \"\\uf4d3\"\n    readonly property string fa_pills: \"\\uf484\"\n    readonly property string fa_pinterest: \"\\uf0d2\"\n    readonly property string fa_pinterest_p: \"\\uf231\"\n    readonly property string fa_pinterest_square: \"\\uf0d3\"\n    readonly property string fa_pizza_slice: \"\\uf818\"\n    readonly property string fa_place_of_worship: \"\\uf67f\"\n    readonly property string fa_plane: \"\\uf072\"\n    readonly property string fa_plane_arrival: \"\\uf5af\"\n    readonly property string fa_plane_departure: \"\\uf5b0\"\n    readonly property string fa_play: \"\\uf04b\"\n    readonly property string fa_play_circle: \"\\uf144\"\n    readonly property string fa_playstation: \"\\uf3df\"\n    readonly property string fa_plug: \"\\uf1e6\"\n    readonly property string fa_plus: \"\\uf067\"\n    readonly property string fa_plus_circle: \"\\uf055\"\n    readonly property string fa_plus_square: \"\\uf0fe\"\n    readonly property string fa_podcast: \"\\uf2ce\"\n    readonly property string fa_poll: \"\\uf681\"\n    readonly property string fa_poll_h: \"\\uf682\"\n    readonly property string fa_poo: \"\\uf2fe\"\n    readonly property string fa_poo_storm: \"\\uf75a\"\n    readonly property string fa_poop: \"\\uf619\"\n    readonly property string fa_portrait: \"\\uf3e0\"\n    readonly property string fa_pound_sign: \"\\uf154\"\n    readonly property string fa_power_off: \"\\uf011\"\n    readonly property string fa_pray: \"\\uf683\"\n    readonly property string fa_praying_hands: \"\\uf684\"\n    readonly property string fa_prescription: \"\\uf5b1\"\n    readonly property string fa_prescription_bottle: \"\\uf485\"\n    readonly property string fa_prescription_bottle_alt: \"\\uf486\"\n    readonly property string fa_print: \"\\uf02f\"\n    readonly property string fa_procedures: \"\\uf487\"\n    readonly property string fa_product_hunt: \"\\uf288\"\n    readonly property string fa_project_diagram: \"\\uf542\"\n    readonly property string fa_pushed: \"\\uf3e1\"\n    readonly property string fa_puzzle_piece: \"\\uf12e\"\n    readonly property string fa_python: \"\\uf3e2\"\n    readonly property string fa_qq: \"\\uf1d6\"\n    readonly property string fa_qrcode: \"\\uf029\"\n    readonly property string fa_question: \"\\uf128\"\n    readonly property string fa_question_circle: \"\\uf059\"\n    readonly property string fa_quidditch: \"\\uf458\"\n    readonly property string fa_quinscape: \"\\uf459\"\n    readonly property string fa_quora: \"\\uf2c4\"\n    readonly property string fa_quote_left: \"\\uf10d\"\n    readonly property string fa_quote_right: \"\\uf10e\"\n    readonly property string fa_quran: \"\\uf687\"\n    readonly property string fa_r_project: \"\\uf4f7\"\n    readonly property string fa_radiation: \"\\uf7b9\"\n    readonly property string fa_radiation_alt: \"\\uf7ba\"\n    readonly property string fa_rainbow: \"\\uf75b\"\n    readonly property string fa_random: \"\\uf074\"\n    readonly property string fa_raspberry_pi: \"\\uf7bb\"\n    readonly property string fa_ravelry: \"\\uf2d9\"\n    readonly property string fa_react: \"\\uf41b\"\n    readonly property string fa_reacteurope: \"\\uf75d\"\n    readonly property string fa_readme: \"\\uf4d5\"\n    readonly property string fa_rebel: \"\\uf1d0\"\n    readonly property string fa_receipt: \"\\uf543\"\n    readonly property string fa_recycle: \"\\uf1b8\"\n    readonly property string fa_red_river: \"\\uf3e3\"\n    readonly property string fa_reddit: \"\\uf1a1\"\n    readonly property string fa_reddit_alien: \"\\uf281\"\n    readonly property string fa_reddit_square: \"\\uf1a2\"\n    readonly property string fa_redhat: \"\\uf7bc\"\n    readonly property string fa_redo: \"\\uf01e\"\n    readonly property string fa_redo_alt: \"\\uf2f9\"\n    readonly property string fa_registered: \"\\uf25d\"\n    readonly property string fa_renren: \"\\uf18b\"\n    readonly property string fa_reply: \"\\uf3e5\"\n    readonly property string fa_reply_all: \"\\uf122\"\n    readonly property string fa_replyd: \"\\uf3e6\"\n    readonly property string fa_republican: \"\\uf75e\"\n    readonly property string fa_researchgate: \"\\uf4f8\"\n    readonly property string fa_resolving: \"\\uf3e7\"\n    readonly property string fa_restroom: \"\\uf7bd\"\n    readonly property string fa_retweet: \"\\uf079\"\n    readonly property string fa_rev: \"\\uf5b2\"\n    readonly property string fa_ribbon: \"\\uf4d6\"\n    readonly property string fa_ring: \"\\uf70b\"\n    readonly property string fa_road: \"\\uf018\"\n    readonly property string fa_robot: \"\\uf544\"\n    readonly property string fa_rocket: \"\\uf135\"\n    readonly property string fa_rocketchat: \"\\uf3e8\"\n    readonly property string fa_rockrms: \"\\uf3e9\"\n    readonly property string fa_route: \"\\uf4d7\"\n    readonly property string fa_rss: \"\\uf09e\"\n    readonly property string fa_rss_square: \"\\uf143\"\n    readonly property string fa_ruble_sign: \"\\uf158\"\n    readonly property string fa_ruler: \"\\uf545\"\n    readonly property string fa_ruler_combined: \"\\uf546\"\n    readonly property string fa_ruler_horizontal: \"\\uf547\"\n    readonly property string fa_ruler_vertical: \"\\uf548\"\n    readonly property string fa_running: \"\\uf70c\"\n    readonly property string fa_rupee_sign: \"\\uf156\"\n    readonly property string fa_sad_cry: \"\\uf5b3\"\n    readonly property string fa_sad_tear: \"\\uf5b4\"\n    readonly property string fa_safari: \"\\uf267\"\n    readonly property string fa_sass: \"\\uf41e\"\n    readonly property string fa_satellite: \"\\uf7bf\"\n    readonly property string fa_satellite_dish: \"\\uf7c0\"\n    readonly property string fa_save: \"\\uf0c7\"\n    readonly property string fa_schlix: \"\\uf3ea\"\n    readonly property string fa_school: \"\\uf549\"\n    readonly property string fa_screwdriver: \"\\uf54a\"\n    readonly property string fa_scribd: \"\\uf28a\"\n    readonly property string fa_scroll: \"\\uf70e\"\n    readonly property string fa_sd_card: \"\\uf7c2\"\n    readonly property string fa_search: \"\\uf002\"\n    readonly property string fa_search_dollar: \"\\uf688\"\n    readonly property string fa_search_location: \"\\uf689\"\n    readonly property string fa_search_minus: \"\\uf010\"\n    readonly property string fa_search_plus: \"\\uf00e\"\n    readonly property string fa_searchengin: \"\\uf3eb\"\n    readonly property string fa_seedling: \"\\uf4d8\"\n    readonly property string fa_sellcast: \"\\uf2da\"\n    readonly property string fa_sellsy: \"\\uf213\"\n    readonly property string fa_server: \"\\uf233\"\n    readonly property string fa_servicestack: \"\\uf3ec\"\n    readonly property string fa_shapes: \"\\uf61f\"\n    readonly property string fa_share: \"\\uf064\"\n    readonly property string fa_share_alt: \"\\uf1e0\"\n    readonly property string fa_share_alt_square: \"\\uf1e1\"\n    readonly property string fa_share_square: \"\\uf14d\"\n    readonly property string fa_shekel_sign: \"\\uf20b\"\n    readonly property string fa_shield_alt: \"\\uf3ed\"\n    readonly property string fa_ship: \"\\uf21a\"\n    readonly property string fa_shipping_fast: \"\\uf48b\"\n    readonly property string fa_shirtsinbulk: \"\\uf214\"\n    readonly property string fa_shoe_prints: \"\\uf54b\"\n    readonly property string fa_shopping_bag: \"\\uf290\"\n    readonly property string fa_shopping_basket: \"\\uf291\"\n    readonly property string fa_shopping_cart: \"\\uf07a\"\n    readonly property string fa_shopware: \"\\uf5b5\"\n    readonly property string fa_shower: \"\\uf2cc\"\n    readonly property string fa_shuttle_van: \"\\uf5b6\"\n    readonly property string fa_sign: \"\\uf4d9\"\n    readonly property string fa_sign_in_alt: \"\\uf2f6\"\n    readonly property string fa_sign_language: \"\\uf2a7\"\n    readonly property string fa_sign_out_alt: \"\\uf2f5\"\n    readonly property string fa_signal: \"\\uf012\"\n    readonly property string fa_signature: \"\\uf5b7\"\n    readonly property string fa_sim_card: \"\\uf7c4\"\n    readonly property string fa_simplybuilt: \"\\uf215\"\n    readonly property string fa_sistrix: \"\\uf3ee\"\n    readonly property string fa_sitemap: \"\\uf0e8\"\n    readonly property string fa_sith: \"\\uf512\"\n    readonly property string fa_skating: \"\\uf7c5\"\n    readonly property string fa_sketch: \"\\uf7c6\"\n    readonly property string fa_skiing: \"\\uf7c9\"\n    readonly property string fa_skiing_nordic: \"\\uf7ca\"\n    readonly property string fa_skull: \"\\uf54c\"\n    readonly property string fa_skull_crossbones: \"\\uf714\"\n    readonly property string fa_skyatlas: \"\\uf216\"\n    readonly property string fa_skype: \"\\uf17e\"\n    readonly property string fa_slack: \"\\uf198\"\n    readonly property string fa_slack_hash: \"\\uf3ef\"\n    readonly property string fa_slash: \"\\uf715\"\n    readonly property string fa_sleigh: \"\\uf7cc\"\n    readonly property string fa_sliders_h: \"\\uf1de\"\n    readonly property string fa_slideshare: \"\\uf1e7\"\n    readonly property string fa_smile: \"\\uf118\"\n    readonly property string fa_smile_beam: \"\\uf5b8\"\n    readonly property string fa_smile_wink: \"\\uf4da\"\n    readonly property string fa_smog: \"\\uf75f\"\n    readonly property string fa_smoking: \"\\uf48d\"\n    readonly property string fa_smoking_ban: \"\\uf54d\"\n    readonly property string fa_sms: \"\\uf7cd\"\n    readonly property string fa_snapchat: \"\\uf2ab\"\n    readonly property string fa_snapchat_ghost: \"\\uf2ac\"\n    readonly property string fa_snapchat_square: \"\\uf2ad\"\n    readonly property string fa_snowboarding: \"\\uf7ce\"\n    readonly property string fa_snowflake: \"\\uf2dc\"\n    readonly property string fa_snowman: \"\\uf7d0\"\n    readonly property string fa_snowplow: \"\\uf7d2\"\n    readonly property string fa_socks: \"\\uf696\"\n    readonly property string fa_solar_panel: \"\\uf5ba\"\n    readonly property string fa_sort: \"\\uf0dc\"\n    readonly property string fa_sort_alpha_down: \"\\uf15d\"\n    readonly property string fa_sort_alpha_up: \"\\uf15e\"\n    readonly property string fa_sort_amount_down: \"\\uf160\"\n    readonly property string fa_sort_amount_up: \"\\uf161\"\n    readonly property string fa_sort_down: \"\\uf0dd\"\n    readonly property string fa_sort_numeric_down: \"\\uf162\"\n    readonly property string fa_sort_numeric_up: \"\\uf163\"\n    readonly property string fa_sort_up: \"\\uf0de\"\n    readonly property string fa_soundcloud: \"\\uf1be\"\n    readonly property string fa_sourcetree: \"\\uf7d3\"\n    readonly property string fa_spa: \"\\uf5bb\"\n    readonly property string fa_space_shuttle: \"\\uf197\"\n    readonly property string fa_speakap: \"\\uf3f3\"\n    readonly property string fa_spider: \"\\uf717\"\n    readonly property string fa_spinner: \"\\uf110\"\n    readonly property string fa_splotch: \"\\uf5bc\"\n    readonly property string fa_spotify: \"\\uf1bc\"\n    readonly property string fa_spray_can: \"\\uf5bd\"\n    readonly property string fa_square: \"\\uf0c8\"\n    readonly property string fa_square_full: \"\\uf45c\"\n    readonly property string fa_square_root_alt: \"\\uf698\"\n    readonly property string fa_squarespace: \"\\uf5be\"\n    readonly property string fa_stack_exchange: \"\\uf18d\"\n    readonly property string fa_stack_overflow: \"\\uf16c\"\n    readonly property string fa_stamp: \"\\uf5bf\"\n    readonly property string fa_star: \"\\uf005\"\n    readonly property string fa_star_and_crescent: \"\\uf699\"\n    readonly property string fa_star_half: \"\\uf089\"\n    readonly property string fa_star_half_alt: \"\\uf5c0\"\n    readonly property string fa_star_of_david: \"\\uf69a\"\n    readonly property string fa_star_of_life: \"\\uf621\"\n    readonly property string fa_staylinked: \"\\uf3f5\"\n    readonly property string fa_steam: \"\\uf1b6\"\n    readonly property string fa_steam_square: \"\\uf1b7\"\n    readonly property string fa_steam_symbol: \"\\uf3f6\"\n    readonly property string fa_step_backward: \"\\uf048\"\n    readonly property string fa_step_forward: \"\\uf051\"\n    readonly property string fa_stethoscope: \"\\uf0f1\"\n    readonly property string fa_sticker_mule: \"\\uf3f7\"\n    readonly property string fa_sticky_note: \"\\uf249\"\n    readonly property string fa_stop: \"\\uf04d\"\n    readonly property string fa_stop_circle: \"\\uf28d\"\n    readonly property string fa_stopwatch: \"\\uf2f2\"\n    readonly property string fa_store: \"\\uf54e\"\n    readonly property string fa_store_alt: \"\\uf54f\"\n    readonly property string fa_strava: \"\\uf428\"\n    readonly property string fa_stream: \"\\uf550\"\n    readonly property string fa_street_view: \"\\uf21d\"\n    readonly property string fa_strikethrough: \"\\uf0cc\"\n    readonly property string fa_stripe: \"\\uf429\"\n    readonly property string fa_stripe_s: \"\\uf42a\"\n    readonly property string fa_stroopwafel: \"\\uf551\"\n    readonly property string fa_studiovinari: \"\\uf3f8\"\n    readonly property string fa_stumbleupon: \"\\uf1a4\"\n    readonly property string fa_stumbleupon_circle: \"\\uf1a3\"\n    readonly property string fa_subscript: \"\\uf12c\"\n    readonly property string fa_subway: \"\\uf239\"\n    readonly property string fa_suitcase: \"\\uf0f2\"\n    readonly property string fa_suitcase_rolling: \"\\uf5c1\"\n    readonly property string fa_sun: \"\\uf185\"\n    readonly property string fa_superpowers: \"\\uf2dd\"\n    readonly property string fa_superscript: \"\\uf12b\"\n    readonly property string fa_supple: \"\\uf3f9\"\n    readonly property string fa_surprise: \"\\uf5c2\"\n    readonly property string fa_suse: \"\\uf7d6\"\n    readonly property string fa_swatchbook: \"\\uf5c3\"\n    readonly property string fa_swimmer: \"\\uf5c4\"\n    readonly property string fa_swimming_pool: \"\\uf5c5\"\n    readonly property string fa_synagogue: \"\\uf69b\"\n    readonly property string fa_sync: \"\\uf021\"\n    readonly property string fa_sync_alt: \"\\uf2f1\"\n    readonly property string fa_syringe: \"\\uf48e\"\n    readonly property string fa_table: \"\\uf0ce\"\n    readonly property string fa_table_tennis: \"\\uf45d\"\n    readonly property string fa_tablet: \"\\uf10a\"\n    readonly property string fa_tablet_alt: \"\\uf3fa\"\n    readonly property string fa_tablets: \"\\uf490\"\n    readonly property string fa_tachometer_alt: \"\\uf3fd\"\n    readonly property string fa_tag: \"\\uf02b\"\n    readonly property string fa_tags: \"\\uf02c\"\n    readonly property string fa_tape: \"\\uf4db\"\n    readonly property string fa_tasks: \"\\uf0ae\"\n    readonly property string fa_taxi: \"\\uf1ba\"\n    readonly property string fa_teamspeak: \"\\uf4f9\"\n    readonly property string fa_teeth: \"\\uf62e\"\n    readonly property string fa_teeth_open: \"\\uf62f\"\n    readonly property string fa_telegram: \"\\uf2c6\"\n    readonly property string fa_telegram_plane: \"\\uf3fe\"\n    readonly property string fa_temperature_high: \"\\uf769\"\n    readonly property string fa_temperature_low: \"\\uf76b\"\n    readonly property string fa_tencent_weibo: \"\\uf1d5\"\n    readonly property string fa_tenge: \"\\uf7d7\"\n    readonly property string fa_terminal: \"\\uf120\"\n    readonly property string fa_text_height: \"\\uf034\"\n    readonly property string fa_text_width: \"\\uf035\"\n    readonly property string fa_th: \"\\uf00a\"\n    readonly property string fa_th_large: \"\\uf009\"\n    readonly property string fa_th_list: \"\\uf00b\"\n    readonly property string fa_the_red_yeti: \"\\uf69d\"\n    readonly property string fa_theater_masks: \"\\uf630\"\n    readonly property string fa_themeco: \"\\uf5c6\"\n    readonly property string fa_themeisle: \"\\uf2b2\"\n    readonly property string fa_thermometer: \"\\uf491\"\n    readonly property string fa_thermometer_empty: \"\\uf2cb\"\n    readonly property string fa_thermometer_full: \"\\uf2c7\"\n    readonly property string fa_thermometer_half: \"\\uf2c9\"\n    readonly property string fa_thermometer_quarter: \"\\uf2ca\"\n    readonly property string fa_thermometer_three_quarters: \"\\uf2c8\"\n    readonly property string fa_think_peaks: \"\\uf731\"\n    readonly property string fa_thumbs_down: \"\\uf165\"\n    readonly property string fa_thumbs_up: \"\\uf164\"\n    readonly property string fa_thumbtack: \"\\uf08d\"\n    readonly property string fa_ticket_alt: \"\\uf3ff\"\n    readonly property string fa_times: \"\\uf00d\"\n    readonly property string fa_times_circle: \"\\uf057\"\n    readonly property string fa_tint: \"\\uf043\"\n    readonly property string fa_tint_slash: \"\\uf5c7\"\n    readonly property string fa_tired: \"\\uf5c8\"\n    readonly property string fa_toggle_off: \"\\uf204\"\n    readonly property string fa_toggle_on: \"\\uf205\"\n    readonly property string fa_toilet: \"\\uf7d8\"\n    readonly property string fa_toilet_paper: \"\\uf71e\"\n    readonly property string fa_toolbox: \"\\uf552\"\n    readonly property string fa_tools: \"\\uf7d9\"\n    readonly property string fa_tooth: \"\\uf5c9\"\n    readonly property string fa_torah: \"\\uf6a0\"\n    readonly property string fa_torii_gate: \"\\uf6a1\"\n    readonly property string fa_tractor: \"\\uf722\"\n    readonly property string fa_trade_federation: \"\\uf513\"\n    readonly property string fa_trademark: \"\\uf25c\"\n    readonly property string fa_traffic_light: \"\\uf637\"\n    readonly property string fa_train: \"\\uf238\"\n    readonly property string fa_tram: \"\\uf7da\"\n    readonly property string fa_transgender: \"\\uf224\"\n    readonly property string fa_transgender_alt: \"\\uf225\"\n    readonly property string fa_trash: \"\\uf1f8\"\n    readonly property string fa_trash_alt: \"\\uf2ed\"\n    readonly property string fa_trash_restore: \"\\uf829\"\n    readonly property string fa_trash_restore_alt: \"\\uf82a\"\n    readonly property string fa_tree: \"\\uf1bb\"\n    readonly property string fa_trello: \"\\uf181\"\n    readonly property string fa_tripadvisor: \"\\uf262\"\n    readonly property string fa_trophy: \"\\uf091\"\n    readonly property string fa_truck: \"\\uf0d1\"\n    readonly property string fa_truck_loading: \"\\uf4de\"\n    readonly property string fa_truck_monster: \"\\uf63b\"\n    readonly property string fa_truck_moving: \"\\uf4df\"\n    readonly property string fa_truck_pickup: \"\\uf63c\"\n    readonly property string fa_tshirt: \"\\uf553\"\n    readonly property string fa_tty: \"\\uf1e4\"\n    readonly property string fa_tumblr: \"\\uf173\"\n    readonly property string fa_tumblr_square: \"\\uf174\"\n    readonly property string fa_tv: \"\\uf26c\"\n    readonly property string fa_twitch: \"\\uf1e8\"\n    readonly property string fa_twitter: \"\\uf099\"\n    readonly property string fa_twitter_square: \"\\uf081\"\n    readonly property string fa_typo3: \"\\uf42b\"\n    readonly property string fa_uber: \"\\uf402\"\n    readonly property string fa_ubuntu: \"\\uf7df\"\n    readonly property string fa_uikit: \"\\uf403\"\n    readonly property string fa_umbrella: \"\\uf0e9\"\n    readonly property string fa_umbrella_beach: \"\\uf5ca\"\n    readonly property string fa_underline: \"\\uf0cd\"\n    readonly property string fa_undo: \"\\uf0e2\"\n    readonly property string fa_undo_alt: \"\\uf2ea\"\n    readonly property string fa_uniregistry: \"\\uf404\"\n    readonly property string fa_universal_access: \"\\uf29a\"\n    readonly property string fa_university: \"\\uf19c\"\n    readonly property string fa_unlink: \"\\uf127\"\n    readonly property string fa_unlock: \"\\uf09c\"\n    readonly property string fa_unlock_alt: \"\\uf13e\"\n    readonly property string fa_untappd: \"\\uf405\"\n    readonly property string fa_upload: \"\\uf093\"\n    readonly property string fa_ups: \"\\uf7e0\"\n    readonly property string fa_usb: \"\\uf287\"\n    readonly property string fa_user: \"\\uf007\"\n    readonly property string fa_user_alt: \"\\uf406\"\n    readonly property string fa_user_alt_slash: \"\\uf4fa\"\n    readonly property string fa_user_astronaut: \"\\uf4fb\"\n    readonly property string fa_user_check: \"\\uf4fc\"\n    readonly property string fa_user_circle: \"\\uf2bd\"\n    readonly property string fa_user_clock: \"\\uf4fd\"\n    readonly property string fa_user_cog: \"\\uf4fe\"\n    readonly property string fa_user_edit: \"\\uf4ff\"\n    readonly property string fa_user_friends: \"\\uf500\"\n    readonly property string fa_user_graduate: \"\\uf501\"\n    readonly property string fa_user_injured: \"\\uf728\"\n    readonly property string fa_user_lock: \"\\uf502\"\n    readonly property string fa_user_md: \"\\uf0f0\"\n    readonly property string fa_user_minus: \"\\uf503\"\n    readonly property string fa_user_ninja: \"\\uf504\"\n    readonly property string fa_user_nurse: \"\\uf82f\"\n    readonly property string fa_user_plus: \"\\uf234\"\n    readonly property string fa_user_secret: \"\\uf21b\"\n    readonly property string fa_user_shield: \"\\uf505\"\n    readonly property string fa_user_slash: \"\\uf506\"\n    readonly property string fa_user_tag: \"\\uf507\"\n    readonly property string fa_user_tie: \"\\uf508\"\n    readonly property string fa_user_times: \"\\uf235\"\n    readonly property string fa_users: \"\\uf0c0\"\n    readonly property string fa_users_cog: \"\\uf509\"\n    readonly property string fa_usps: \"\\uf7e1\"\n    readonly property string fa_ussunnah: \"\\uf407\"\n    readonly property string fa_utensil_spoon: \"\\uf2e5\"\n    readonly property string fa_utensils: \"\\uf2e7\"\n    readonly property string fa_vaadin: \"\\uf408\"\n    readonly property string fa_vector_square: \"\\uf5cb\"\n    readonly property string fa_venus: \"\\uf221\"\n    readonly property string fa_venus_double: \"\\uf226\"\n    readonly property string fa_venus_mars: \"\\uf228\"\n    readonly property string fa_viacoin: \"\\uf237\"\n    readonly property string fa_viadeo: \"\\uf2a9\"\n    readonly property string fa_viadeo_square: \"\\uf2aa\"\n    readonly property string fa_vial: \"\\uf492\"\n    readonly property string fa_vials: \"\\uf493\"\n    readonly property string fa_viber: \"\\uf409\"\n    readonly property string fa_video: \"\\uf03d\"\n    readonly property string fa_video_slash: \"\\uf4e2\"\n    readonly property string fa_vihara: \"\\uf6a7\"\n    readonly property string fa_vimeo: \"\\uf40a\"\n    readonly property string fa_vimeo_square: \"\\uf194\"\n    readonly property string fa_vimeo_v: \"\\uf27d\"\n    readonly property string fa_vine: \"\\uf1ca\"\n    readonly property string fa_vk: \"\\uf189\"\n    readonly property string fa_vnv: \"\\uf40b\"\n    readonly property string fa_volleyball_ball: \"\\uf45f\"\n    readonly property string fa_volume_down: \"\\uf027\"\n    readonly property string fa_volume_mute: \"\\uf6a9\"\n    readonly property string fa_volume_off: \"\\uf026\"\n    readonly property string fa_volume_up: \"\\uf028\"\n    readonly property string fa_vote_yea: \"\\uf772\"\n    readonly property string fa_vr_cardboard: \"\\uf729\"\n    readonly property string fa_vuejs: \"\\uf41f\"\n    readonly property string fa_walking: \"\\uf554\"\n    readonly property string fa_wallet: \"\\uf555\"\n    readonly property string fa_warehouse: \"\\uf494\"\n    readonly property string fa_water: \"\\uf773\"\n    readonly property string fa_weebly: \"\\uf5cc\"\n    readonly property string fa_weibo: \"\\uf18a\"\n    readonly property string fa_weight: \"\\uf496\"\n    readonly property string fa_weight_hanging: \"\\uf5cd\"\n    readonly property string fa_weixin: \"\\uf1d7\"\n    readonly property string fa_whatsapp: \"\\uf232\"\n    readonly property string fa_whatsapp_square: \"\\uf40c\"\n    readonly property string fa_wheelchair: \"\\uf193\"\n    readonly property string fa_whmcs: \"\\uf40d\"\n    readonly property string fa_wifi: \"\\uf1eb\"\n    readonly property string fa_wikipedia_w: \"\\uf266\"\n    readonly property string fa_wind: \"\\uf72e\"\n    readonly property string fa_window_close: \"\\uf410\"\n    readonly property string fa_window_maximize: \"\\uf2d0\"\n    readonly property string fa_window_minimize: \"\\uf2d1\"\n    readonly property string fa_window_restore: \"\\uf2d2\"\n    readonly property string fa_windows: \"\\uf17a\"\n    readonly property string fa_wine_bottle: \"\\uf72f\"\n    readonly property string fa_wine_glass: \"\\uf4e3\"\n    readonly property string fa_wine_glass_alt: \"\\uf5ce\"\n    readonly property string fa_wix: \"\\uf5cf\"\n    readonly property string fa_wizards_of_the_coast: \"\\uf730\"\n    readonly property string fa_wolf_pack_battalion: \"\\uf514\"\n    readonly property string fa_won_sign: \"\\uf159\"\n    readonly property string fa_wordpress: \"\\uf19a\"\n    readonly property string fa_wordpress_simple: \"\\uf411\"\n    readonly property string fa_wpbeginner: \"\\uf297\"\n    readonly property string fa_wpexplorer: \"\\uf2de\"\n    readonly property string fa_wpforms: \"\\uf298\"\n    readonly property string fa_wpressr: \"\\uf3e4\"\n    readonly property string fa_wrench: \"\\uf0ad\"\n    readonly property string fa_x_ray: \"\\uf497\"\n    readonly property string fa_xbox: \"\\uf412\"\n    readonly property string fa_xing: \"\\uf168\"\n    readonly property string fa_xing_square: \"\\uf169\"\n    readonly property string fa_y_combinator: \"\\uf23b\"\n    readonly property string fa_yahoo: \"\\uf19e\"\n    readonly property string fa_yandex: \"\\uf413\"\n    readonly property string fa_yandex_international: \"\\uf414\"\n    readonly property string fa_yarn: \"\\uf7e3\"\n    readonly property string fa_yelp: \"\\uf1e9\"\n    readonly property string fa_yen_sign: \"\\uf157\"\n    readonly property string fa_yin_yang: \"\\uf6ad\"\n    readonly property string fa_yoast: \"\\uf2b1\"\n    readonly property string fa_youtube: \"\\uf167\"\n    readonly property string fa_youtube_square: \"\\uf431\"\n    readonly property string fa_zhihu: \"\\uf63f\"\n}\n"
  },
  {
    "path": "src/asemanqml/awesome/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/awesomeplugin.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/awesomeplugin.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/qmake_asemanawesome.qrc\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/asemanqml/awesome/awesome.pri",
    "content": "QT += qml\n\nHEADERS += \\\n    $$PWD/awesomeplugin.h\n\nSOURCES += \\\n    $$PWD/awesomeplugin.cpp\n\nstatic: !linux: !win32: DEFINES += ASEMAN_STATIC_BUILD\n\nASEMAN_QML_FILES = $$files($$PWD/Awesome/*.*)\n\nINCLUDED_RESOURCE_FILES = \\\n    $$ASEMAN_QML_FILES\n\nasemanawesome.files = $$INCLUDED_RESOURCE_FILES\nasemanawesome.prefix = /AsemanQml/\n\ncontains(DEFINES, QT_ASEMAN_EMBEDDED) {\n    RESOURCES += $$PWD/qmake_asemanawesome.qrc\n} else {\n    RESOURCES += asemanawesome\n}\n\n"
  },
  {
    "path": "src/asemanqml/awesome/awesome.pro",
    "content": "TARGET  = asemanqmlawesome\nTARGETPATH = AsemanQml/Awesome\nIMPORT_VERSION = 2.0\n\ninclude(awesome.pri)\n\nload(qml_plugin)\n"
  },
  {
    "path": "src/asemanqml/awesome/awesomeplugin.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"awesomeplugin.h\"\n\n#include <QDebug>\n#include <QDir>\n#include <QStringList>\n#include <QtQml>\n\n#ifdef QT_ASEMAN_EMBEDDED\nbool asemanqml_awesome_plugin_registered = AsemanAwesomePlugin::registerStaticTypes(\"AsemanQml.Awesome\");\n#endif\n\nbool AsemanAwesomePlugin::registerStaticTypes(const char *uri)\n{\n    Q_INIT_RESOURCE(qmake_asemanawesome);\n    qmlRegisterSingletonType(QUrl(\"qrc:/AsemanQml/Awesome/Awesome.qml\"), uri, 2, 0, \"Awesome\");\n    return true;\n}\n\nvoid AsemanAwesomePlugin::registerTypes(const char *uri)\n{\n    AsemanAwesomePlugin::registerStaticTypes(uri);\n}\n\nvoid AsemanAwesomePlugin::initializeEngine(QQmlEngine *engine, const char *uri)\n{\n    QQmlExtensionPlugin::initializeEngine(engine, uri);\n}\n"
  },
  {
    "path": "src/asemanqml/awesome/awesomeplugin.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANAWESOMEPLUGIN_H\n#define ASEMANAWESOMEPLUGIN_H\n\n#include <QQmlExtensionPlugin>\n\nclass AsemanAwesomePlugin : public QQmlExtensionPlugin\n{\n    Q_OBJECT\n\n#ifndef QT_ASEMAN_EMBEDDED\n    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)\n#endif\n\npublic:\n    static bool registerStaticTypes(const char *uri);\n    void registerTypes(const char *uri);\n    void initializeEngine(QQmlEngine *engine, const char *uri);\n};\n\n#endif // ASEMANAWESOMEPLUGIN_H\n"
  },
  {
    "path": "src/asemanqml/awesome/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Awesome 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.8\"]\n    Component {\n        prototype: \"QObject\"\n        name: \"AsemanQml.Awesome/Awesome 2.0\"\n        exports: [\"AsemanQml.Awesome/Awesome 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        isCreatable: false\n        isSingleton: true\n        defaultProperty: \"items\"\n        Property { name: \"family\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_500px\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_accessible_ico\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_accusoft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_acquisitions_incorporated\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_address_book\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_address_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_adjust\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_adn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_adobe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_adversal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_affiliatetheme\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_air_freshener\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_algolia\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_align_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_align_justify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_align_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_align_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_alipay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_allergies\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_amazon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_amazon_pay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ambulance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_american_sign_language_interpreting\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_amilia\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_anchor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_android\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angellist\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_double_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_double_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_double_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_double_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angrycreative\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angular\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ankh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_app_store\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_app_store_ios\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_apper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_apple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_apple_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_apple_pay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_archive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_archway\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_alt_circle_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_alt_circle_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_alt_circle_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_alt_circle_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_circle_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_circle_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_circle_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_circle_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrows_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrows_alt_h\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrows_alt_v\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_artstation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_assistive_listening_systems\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_asterisk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_asymmetrik\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_at\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_atlas\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_atlassian\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_atom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_audible\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_audio_description\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_autoprefixer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_avianex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_aviato\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_award\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_aws\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_baby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_baby_carriage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_backspace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_backward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bacon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_balance_scale\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ban\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_band_aid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bandcamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_barcode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bars\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_baseball_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_basketball_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_battery_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_battery_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_battery_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_battery_quarter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_battery_three_quarters\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_beer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_behance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_behance_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bell_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bezier_curve\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bible\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bicycle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bimobject\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_binoculars\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_biohazard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_birthday_cake\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bitbucket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bitcoin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_black_tie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_blackberry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_blender\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_blender_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_blind\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_blog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_blogger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_blogger_b\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bluetooth_b\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bolt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bomb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bong\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_book\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_book_dead\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_book_medical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_book_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_book_reader\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bookmark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bowling_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_box_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_boxes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_braille\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_brain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bread_slice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_briefcase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_briefcase_medical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_broadcast_tower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_broom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_brush\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_btc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bug\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_building\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bullhorn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bullseye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_burn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_buromobelexperte\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bus_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_business_time\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_buysellads\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calculator\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar_day\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar_times\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar_week\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_camera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_camera_retro\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_campground\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_canadian_maple_leaf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_candy_cane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cannabis\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_capsules\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_car\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_car_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_car_battery\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_car_crash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_car_side\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_square_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_square_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_square_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_square_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_carrot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cart_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cart_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cash_register\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_amazon_pay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_amex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_apple_pay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_diners_club\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_discover\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_jcb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_mastercard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_paypal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_stripe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_visa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_centercode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_centos\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_certificate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chair\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chalkboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chalkboard_teacher\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_charging_station\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chart_area\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chart_bar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chart_line\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chart_pie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_check_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_check_double\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_check_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cheese\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess_bishop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess_board\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess_king\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess_knight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess_pawn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess_queen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess_rook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_circle_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_circle_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_circle_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_circle_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_child\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chrome\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_church\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_circle_notch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_city\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_clinic_medical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_clipboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_clipboard_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_clipboard_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_clone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_closed_captioning\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_download_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_meatball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_moon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_moon_rain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_rain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_showers_heavy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_sun\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_sun_rain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_upload_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloudscale\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloudsmith\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloudversify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cocktail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_code\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_code_branch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_codepen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_codiepie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_coffee\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cogs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_coins\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_columns\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comment_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comment_dollar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comment_dots\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comment_medical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comment_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comments\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comments_dollar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_compact_disc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_compass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_compress\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_compress_arrows_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_concierge_bell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_confluence\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_connectdevelop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_contao\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cookie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cookie_bite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_copy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_copyright\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_couch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cpanel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_by\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_nc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_nc_eu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_nc_jp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_nd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_pd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_pd_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_remix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_sa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_sampling\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_sampling_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_share\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_zero\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_credit_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_critical_role\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_crop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_crop_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cross\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_crosshairs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_crow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_crown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_crutch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_css3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_css3_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cube\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cubes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cut\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cuttlefish\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_d_and_d\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_d_and_d_beyond\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dashcube\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_database\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_deaf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_delicious\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_democrat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_deploydog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_deskpro\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_desktop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dev\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_deviantart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dharmachakra\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dhl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_diagnoses\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_diaspora\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_d20\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_d6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_five\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_four\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_one\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_six\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_three\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_two\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_digg\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_digital_ocean\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_digital_tachograph\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_directions\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_discord\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_discourse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_divide\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dizzy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dna\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dochub\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_docker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dollar_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dolly\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dolly_flatbed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_donate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_door_closed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_door_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dot_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_draft2digital\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_drafting_compass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dragon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_draw_polygon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dribbble\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dribbble_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dropbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_drum\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_drum_steelpan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_drumstick_bite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_drupal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dumbbell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dumpster\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dumpster_fire\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dungeon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dyalog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_earlybirds\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ebay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_edge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_egg\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_eject\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_elementor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ellipsis_h\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ellipsis_v\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ello\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ember\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_empire\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_envelope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_envelope_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_envelope_open_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_envelope_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_envira\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_equals\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_eraser\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_erlang\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ethereum\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ethernet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_etsy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_euro_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_exchange_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_exclamation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_exclamation_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_exclamation_triangle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_expand\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_expand_arrows_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_expeditedssl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_external_link_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_external_link_square_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_eye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_eye_dropper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_eye_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_facebook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_facebook_f\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_facebook_messenger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_facebook_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fantasy_flight_games\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fast_backward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fast_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fax\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_feather\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_feather_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fedex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fedora\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_female\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fighter_jet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_figma\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_archive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_audio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_code\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_contract\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_csv\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_excel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_import\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_invoice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_invoice_dollar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_medical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_medical_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_pdf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_powerpoint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_prescription\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_signature\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_word\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fill_drip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_film\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_filter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fingerprint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fire\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fire_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fire_extinguisher\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_firefox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_first_aid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_first_order\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_first_order_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_firstdraft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fish\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fist_raised\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_flag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_flag_checkered\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_flag_usa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_flask\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_flickr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_flipboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_flushed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fly\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_folder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_folder_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_folder_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_folder_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_font\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_font_awesome\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_font_awesome_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_font_awesome_flag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_font_awesome_logo_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fonticons\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fonticons_fi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_football_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fort_awesome\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fort_awesome_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_forumbee\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_foursquare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_free_code_camp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_freebsd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_frog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_frown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_frown_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fulcrum\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_funnel_dollar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_futbol\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_galactic_republic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_galactic_senate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gamepad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gas_pump\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gavel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gem\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_genderless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_get_pocket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gg\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gg_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ghost\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gift\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gifts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_git\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_git_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_github\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_github_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_github_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gitkraken\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gitlab\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gitter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_glass_cheers\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_glass_martini\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_glass_martini_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_glass_whiskey\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_glasses\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_glide\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_glide_g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_globe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_globe_africa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_globe_americas\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_globe_asia\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_globe_europe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gofore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_golf_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_goodreads\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_goodreads_g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_google\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_google_drive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_google_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_google_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_google_plus_g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_google_plus_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_google_wallet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gopuram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_graduation_cap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gratipay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grav\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_greater_than\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_greater_than_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grimace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_beam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_beam_sweat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_hearts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_squint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_squint_tears\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_stars\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_tears\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_tongue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_tongue_squint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_tongue_wink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_wink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grip_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grip_lines\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grip_lines_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grip_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gripfire\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grunt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_guitar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gulp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_h_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hacker_news\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hacker_news_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hackerrank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hamburger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hammer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hamsa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_holding\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_holding_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_holding_usd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_lizard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_middle_finger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_paper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_peace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_point_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_point_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_point_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_point_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_pointer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_rock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_scissors\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_spock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hands\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hands_helping\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_handshake\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hanukiah\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hard_hat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hashtag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hat_wizard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_haykal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hdd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_heading\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_headphones\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_headphones_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_headset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_heart_broken\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_heartbeat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_helicopter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_highlighter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hiking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hippo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hips\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hire_a_helper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_history\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hockey_puck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_holly_berry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_home\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hooli\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hornbill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_horse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_horse_head\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hospital\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hospital_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hospital_symbol\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hot_tub\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hotdog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hotel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hotjar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hourglass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hourglass_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hourglass_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hourglass_start\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_house_damage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_houzz\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hryvnia\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_html5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hubspot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_i_cursor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ice_cream\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_icicles\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_id_badge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_id_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_id_card_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_igloo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_images\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_imdb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_inbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_indent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_industry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_infinity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_info\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_info_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_instagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_intercom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_internet_explorer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_invision\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ioxhost\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_italic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_itunes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_itunes_note\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_java\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_jedi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_jedi_order\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_jenkins\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_jira\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_joget\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_joint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_joomla\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_journal_whills\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_js\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_js_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_jsfiddle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kaaba\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kaggle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_keybase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_keyboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_keycdn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_khanda\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kickstarter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kickstarter_k\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kiss\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kiss_beam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kiss_wink_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kiwi_bird\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_korvue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_landmark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_language\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laptop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laptop_code\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laptop_medical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laravel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lastfm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lastfm_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laugh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laugh_beam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laugh_squint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laugh_wink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_layer_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_leaf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_leanpub\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lemon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_less\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_less_than\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_less_than_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_level_down_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_level_up_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_life_ring\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lightbulb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_line\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_link\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_linkedin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_linkedin_in\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_linode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_linux\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lira_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_list_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_list_ol\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_list_ul\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_location_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lock_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_long_arrow_alt_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_long_arrow_alt_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_long_arrow_alt_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_long_arrow_alt_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_low_vision\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_luggage_cart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lyft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_magento\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_magic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_magnet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mail_bulk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mailchimp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_male\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mandalorian\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_map\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_map_marked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_map_marked_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_map_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_map_marker_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_map_pin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_map_signs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_markdown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mars\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mars_double\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mars_stroke\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mars_stroke_h\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mars_stroke_v\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mask\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mastodon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_maxcdn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_medal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_medapps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_medium_m\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_medkit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_medrt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_meetup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_megaport\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_meh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_meh_blank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_meh_rolling_eyes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_memory\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mendeley\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_menorah\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mercury\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_meteor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_microchip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_microphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_microphone_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_microphone_alt_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_microphone_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_microscope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_microsoft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_minus_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_minus_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mitten\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mixcloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mizuni\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mobile\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mobile_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_modx\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_monero\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_money_bill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_money_bill_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_money_bill_wave\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_money_bill_wave_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_money_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_money_check_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_monument\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_moon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mortar_pestle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mosque\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_motorcycle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mountain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mouse_pointer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mug_hot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_napster\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_neos\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_network_wired\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_neuter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_newspaper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_nimblr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_nintendo_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_node\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_node_js\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_not_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_notes_medical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_npm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ns8\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_nutritionix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_object_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_object_ungroup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_odnoklassniki\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_odnoklassniki_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_oil_can\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_old_republic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_om\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_opencart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_openid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_opera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_optin_monster\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_osi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_otter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_outdent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_page4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pagelines\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pager\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paint_brush\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paint_roller\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_palette\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_palfed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pallet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paper_plane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paperclip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_parachute_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paragraph\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_parking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_passport\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pastafarianism\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paste\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_patreon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pause\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pause_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paw\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paypal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_peace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pen_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pen_fancy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pen_nib\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pen_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pencil_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pencil_ruler\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_penny_arcade\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_people_carry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pepper_hot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_percent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_percentage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_periscope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_person_booth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_phabricator\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_phoenix_framework\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_phoenix_squadron\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_phone_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_phone_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_phone_volume\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_php\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pied_piper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pied_piper_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pied_piper_hat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pied_piper_pp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_piggy_bank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pills\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pinterest\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pinterest_p\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pinterest_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pizza_slice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_place_of_worship\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_plane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_plane_arrival\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_plane_departure\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_play_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_playstation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_plug\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_plus_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_plus_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_podcast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_poll\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_poll_h\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_poo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_poo_storm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_poop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pound_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_power_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pray\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_praying_hands\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_prescription\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_prescription_bottle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_prescription_bottle_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_print\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_procedures\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_product_hunt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_project_diagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pushed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_puzzle_piece\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_python\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_qq\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_qrcode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_question\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_question_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_quidditch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_quinscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_quora\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_quote_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_quote_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_quran\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_r_project\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_radiation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_radiation_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rainbow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_random\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_raspberry_pi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ravelry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_react\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_reacteurope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_readme\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rebel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_receipt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_recycle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_red_river\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_reddit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_reddit_alien\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_reddit_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_redhat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_redo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_redo_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_registered\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_renren\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_reply\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_reply_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_replyd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_republican\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_researchgate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_resolving\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_restroom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_retweet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rev\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ribbon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ring\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_road\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_robot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rocket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rocketchat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rockrms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_route\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rss\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rss_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ruble_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ruler\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ruler_combined\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ruler_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ruler_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_running\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rupee_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sad_cry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sad_tear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_safari\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_satellite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_satellite_dish\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_save\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_schlix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_school\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_screwdriver\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_scribd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_scroll\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sd_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_search_dollar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_search_location\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_search_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_search_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_searchengin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_seedling\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sellcast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sellsy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_server\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_servicestack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shapes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_share\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_share_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_share_alt_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_share_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shekel_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shield_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ship\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shipping_fast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shirtsinbulk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shoe_prints\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shopping_bag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shopping_basket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shopping_cart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shopware\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shuttle_van\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sign_in_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sign_language\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sign_out_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_signal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_signature\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sim_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_simplybuilt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sistrix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sitemap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sith\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_skating\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sketch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_skiing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_skiing_nordic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_skull\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_skull_crossbones\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_skyatlas\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_skype\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_slack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_slack_hash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sleigh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sliders_h\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_slideshare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_smile\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_smile_beam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_smile_wink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_smog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_smoking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_smoking_ban\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_snapchat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_snapchat_ghost\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_snapchat_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_snowboarding\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_snowflake\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_snowman\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_snowplow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_socks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_solar_panel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_alpha_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_alpha_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_amount_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_amount_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_numeric_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_numeric_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_soundcloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sourcetree\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_spa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_space_shuttle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_speakap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_spider\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_spinner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_splotch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_spotify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_spray_can\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_square_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_square_root_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_squarespace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stack_exchange\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stack_overflow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_star_and_crescent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_star_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_star_half_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_star_of_david\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_star_of_life\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_staylinked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_steam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_steam_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_steam_symbol\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_step_backward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_step_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stethoscope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sticker_mule\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sticky_note\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stop_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stopwatch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_store\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_store_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_strava\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stream\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_street_view\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_strikethrough\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stripe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stripe_s\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stroopwafel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_studiovinari\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stumbleupon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stumbleupon_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_subscript\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_subway\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_suitcase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_suitcase_rolling\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sun\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_superpowers\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_superscript\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_supple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_surprise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_suse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_swatchbook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_swimmer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_swimming_pool\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_synagogue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sync\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sync_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_syringe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_table\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_table_tennis\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tablet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tablet_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tablets\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tachometer_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tags\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tasks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_taxi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_teamspeak\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_teeth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_teeth_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_telegram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_telegram_plane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_temperature_high\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_temperature_low\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tencent_weibo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tenge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_terminal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_text_height\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_text_width\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_th\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_th_large\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_th_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_the_red_yeti\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_theater_masks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_themeco\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_themeisle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thermometer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thermometer_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thermometer_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thermometer_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thermometer_quarter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thermometer_three_quarters\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_think_peaks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thumbs_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thumbs_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thumbtack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ticket_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_times\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_times_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tint_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tired\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_toggle_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_toggle_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_toilet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_toilet_paper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_toolbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tools\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_torah\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_torii_gate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tractor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trade_federation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trademark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_traffic_light\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_train\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_transgender\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_transgender_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trash_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trash_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trash_restore_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tree\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trello\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tripadvisor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trophy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_truck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_truck_loading\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_truck_monster\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_truck_moving\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_truck_pickup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tshirt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tumblr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tumblr_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tv\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_twitch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_twitter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_twitter_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_typo3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_uber\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ubuntu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_uikit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_umbrella\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_umbrella_beach\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_underline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_undo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_undo_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_uniregistry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_universal_access\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_university\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_unlink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_unlock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_unlock_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_untappd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ups\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_usb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_alt_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_astronaut\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_cog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_friends\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_graduate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_injured\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_md\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_ninja\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_nurse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_secret\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_shield\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_tag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_tie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_times\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_users\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_users_cog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_usps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ussunnah\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_utensil_spoon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_utensils\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vaadin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vector_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_venus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_venus_double\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_venus_mars\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_viacoin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_viadeo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_viadeo_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vial\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vials\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_viber\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_video_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vihara\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vimeo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vimeo_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vimeo_v\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vnv\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_volleyball_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_volume_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_volume_mute\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_volume_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_volume_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vote_yea\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vr_cardboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vuejs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_walking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wallet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_warehouse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_water\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_weebly\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_weibo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_weight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_weight_hanging\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_weixin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_whatsapp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_whatsapp_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wheelchair\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_whmcs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wifi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wikipedia_w\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wind\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_window_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_window_maximize\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_window_minimize\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_window_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_windows\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wine_bottle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wine_glass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wine_glass_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wizards_of_the_coast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wolf_pack_battalion\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_won_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wordpress\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wordpress_simple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wpbeginner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wpexplorer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wpforms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wpressr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wrench\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_x_ray\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_xbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_xing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_xing_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_y_combinator\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yahoo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yandex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yandex_international\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yarn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yelp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yen_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yin_yang\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yoast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_youtube\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_youtube_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_zhihu\"; type: \"string\"; isReadonly: true }\n        Method { name: \"init\"; type: \"QVariant\" }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/awesome/qmake_asemanawesome.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/AsemanQml\">\n        <file>Awesome/Awesome.qml</file>\n        <file>Awesome/fa-brands-400.ttf</file>\n        <file>Awesome/fa-regular-400.ttf</file>\n        <file>Awesome/fa-solid-900.ttf</file>\n        <file>Awesome/fontawesome-webfont.ttf</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "src/asemanqml/awesome/qmldir",
    "content": "module AsemanQml.Awesome\nclassname AsemanAwesomePlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlawesome\n\n"
  },
  {
    "path": "src/asemanqml/base/Base/AsemanFlickable.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nFlickable {\n    id: flick\n    maximumFlickVelocity: View.flickVelocity\n    boundsBehavior: !Devices.isAndroid? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds\n\n    property bool allTimeMode: true\n    readonly property real tabBarRatio: prv.tabBarExtra/tabBarHeight\n    property real tabBarHeight: 50*Devices.density\n\n    onTabBarHeightChanged: prv.tabBarExtra = tabBarHeight\n    onContentYChanged: prv.optimizeTabBar()\n    onContentHeightChanged: if(contentHeight<height) anim.start()\n\n    NumberAnimation {\n        id: anim\n        target: prv\n        property: \"tabBarExtra\"\n        from: prv.tabBarExtra\n        to: tabBarHeight\n        easing.type: !Devices.isAndroid? Easing.OutBack : Easing.OutCubic\n        duration: !Devices.isAndroid? 350 : 250\n    }\n\n    Transition {\n        id: android_transition\n        NumberAnimation {\n            properties: \"x,y\"\n            duration: 0\n        }\n    }\n\n    QtObject {\n        id: prv\n\n        property real lastContentY: flick.contentY+1\n        property real tabBarExtra: flick.tabBarHeight\n\n        function optimizeTabBar() {\n            var minFlick = -tabBarHeight\n            var maxFlick = flick.contentHeight - flick.height + minFlick\n            if(flick.contentY > maxFlick || flick.contentY<=0) {\n                tabBarExtra = tabBarHeight\n                return\n            }\n            if(flick.contentY > tabBarHeight && !allTimeMode) {\n                tabBarExtra = 0\n                return\n            }\n\n            var newExtra = tabBarExtra - (flick.contentY-prv.lastContentY)\n            if(newExtra<0)\n                newExtra = 0\n            if(flick.contentY < minFlick)\n                newExtra = -flick.contentY\n            else\n            if(newExtra>tabBarHeight)\n                newExtra = tabBarHeight\n\n            tabBarExtra = newExtra\n            prv.lastContentY = flick.contentY\n        }\n    }\n\n    Component.onCompleted: if(Devices.isAndroid) rebound = android_transition\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/AsemanGridView.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nGridView {\n    id: gridv\n\n    readonly property real tabBarRatio: prv.tabBarExtra/tabBarHeight\n    property real tabBarHeight: 50*Devices.density\n\n    onTabBarHeightChanged: prv.tabBarExtra = tabBarHeight\n    onContentYChanged: prv.optimizeTabBar()\n\n    maximumFlickVelocity: View.flickVelocity\n    boundsBehavior: !Devices.isAndroid? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds\n    onContentHeightChanged: if(contentHeight<height) anim.start()\n\n    NumberAnimation {\n        id: anim\n        target: prv\n        property: \"tabBarExtra\"\n        from: prv.tabBarExtra\n        to: tabBarHeight\n        easing.type: !Devices.isAndroid? Easing.OutBack : Easing.OutCubic\n        duration: !Devices.isAndroid? 350 : 250\n    }\n\n    Transition {\n        id: android_transition\n        NumberAnimation {\n            properties: \"x,y\"\n            duration: 0\n        }\n    }\n\n    QtObject {\n        id: prv\n\n        property real lastContentY: gridv.contentY+1\n        property real tabBarExtra: gridv.tabBarHeight\n\n        function optimizeTabBar() {\n            var minFlick = -tabBarHeight\n            var maxFlick = gridv.contentHeight - gridv.height + minFlick\n            if(gridv.contentY > maxFlick || gridv.contentY < 0)\n                return\n\n            var newExtra = tabBarExtra - (gridv.contentY-prv.lastContentY)\n            if(newExtra<0)\n                newExtra = 0\n            if(gridv.contentY < minFlick)\n                newExtra = -gridv.contentY\n            else\n            if(newExtra>tabBarHeight)\n                newExtra = tabBarHeight\n\n            tabBarExtra = newExtra\n            prv.lastContentY = gridv.contentY\n        }\n    }\n\n    Component.onCompleted: if(Devices.isAndroid) rebound = android_transition\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/AsemanListView.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nListView {\n    id: listv\n\n    maximumFlickVelocity: View.flickVelocity\n    boundsBehavior: !Devices.isAndroid? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds\n\n    property bool allTimeMode: true\n    readonly property real tabBarRatio: {\n        if( prv.tabBarExtra < tabBarMargin )\n            return 0\n        if( prv.tabBarExtra > tabBarMargin + tabBarHeight )\n            return 1\n        else\n            return (prv.tabBarExtra - tabBarMargin)/tabBarHeight\n    }\n    property real tabBarHeight: 50*Devices.density\n    property real tabBarMargin: tabBarHeight\n\n    onTabBarHeightChanged: prv.tabBarExtra = tabBarHeight + tabBarMargin*2\n    onContentHeightChanged: if(contentHeight<height) anim.start()\n\n    NumberAnimation {\n        id: anim\n        target: prv\n        property: \"tabBarExtra\"\n        from: prv.tabBarExtra\n        to: tabBarHeight + listv.tabBarMargin*2\n        easing.type: !Devices.isAndroid? Easing.OutBack : Easing.OutCubic\n        duration: !Devices.isAndroid? 350 : 250\n    }\n\n    Transition {\n        id: android_transition\n        NumberAnimation {\n            properties: \"x,y\"\n            duration: 0\n        }\n    }\n\n    QtObject {\n        id: prv\n\n        property real contentY: heightRatio? yPosition*listv.height/heightRatio - tabBarHeight - tabBarMargin*2 : 0\n        property real lastContentY: contentY+1\n        property real tabBarExtra: listv.tabBarHeight + listv.tabBarMargin*2\n\n        property real yPosition: listv.visibleArea.yPosition\n        property real heightRatio: listv.visibleArea.heightRatio\n\n        onContentYChanged: prv.optimizeTabBar()\n\n        function optimizeTabBar() {\n            var minFlick = -tabBarHeight - tabBarMargin*2\n            var maxFlick = listv.contentHeight - listv.height + minFlick\n            if(contentY > maxFlick || contentY<0)\n                return\n            if(contentY > tabBarHeight + tabBarMargin*2 && !allTimeMode) {\n                tabBarExtra = 0\n                return\n            }\n\n            var newExtra = tabBarExtra - (contentY-prv.lastContentY)\n            if(newExtra<0)\n                newExtra = 0\n            if(contentY < minFlick)\n                newExtra = -contentY\n            else\n            if(newExtra>tabBarHeight + tabBarMargin*2)\n                newExtra = tabBarHeight + tabBarMargin*2\n            if(newExtra == NaN)\n                return\n\n            tabBarExtra = newExtra\n            prv.lastContentY = contentY\n        }\n    }\n\n    Component.onCompleted: if(Devices.isAndroid) rebound = android_transition\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/BackAction.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nAsemanObject {\n    id: backAction\n    property bool active: false\n    property var callback\n    property bool disableBack: false\n\n    onActiveChanged: {\n        if(active)\n            BackHandler.pushHandler(backAction, function(){\n                if(callback)\n                    callback()\n                else\n                    active = false\n            })\n        else\n            BackHandler.removeHandler(backAction)\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/CachedImage.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport AsemanQml.Network 2.0\nimport AsemanQml.GraphicalEffects 2.0\n\nItem {\n    id: cimage\n    width: image.width\n    height: image.height\n\n    onWidthChanged: image.width = width\n    onHeightChanged: image.height = height\n\n    property alias radius: mask.radius\n    property alias source: queueItem.source\n    property alias header: queueItem.header\n    property alias percent: queueItem.percent\n    property alias ignoreSslErrors: queueItem.ignoreSslErrors\n    readonly property string cachedSource: image.source\n\n    property alias fillMode: image.fillMode\n    property alias asynchronous: image.asynchronous\n    property alias cache: image.cache\n    property alias horizontalAlignment: image.horizontalAlignment\n    property alias mirror: image.mirror\n    property alias paintedHeight: image.paintedHeight\n    property alias paintedWidth: image.paintedWidth\n    property alias progress: image.progress\n    property alias sourceSize: image.sourceSize\n    property alias status: image.status\n    property alias verticalAlignment: image.verticalAlignment\n\n    property string fileName: {\n        if (source.length == 0)\n            return \"\";\n        var name = Tools.md5(source) + \".\" + Tools.fileSuffix(source)\n        var dir = AsemanApp.homePath + \"/cache/\"\n        Tools.mkDir(dir)\n        return dir + name\n    }\n\n\n    Rectangle {\n        id: mask\n        anchors.fill: parent\n        visible: false\n    }\n\n    Image {\n        id: image\n        source: queueItem.result\n        visible: radius == 0\n    }\n\n    OpacityMask {\n        anchors.fill: parent\n        source: radius != 0? image : null\n        maskSource: mask\n        cached: true\n        visible: radius != 0\n    }\n\n    FileDownloaderQueueItem {\n        id: queueItem\n        downloaderQueue: DownloaderQueue\n        fileName: {\n            if(source.length == 0)\n                return \"\"\n\n            return cimage.fileName\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/CoverList.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nItem {\n    id: coverList\n\n    property alias model: listv.model\n    property alias currentIndex: listv.currentIndex\n\n    property real itemsWidth: 500*Devices.density\n    property real itemsPadding: 8*Devices.density\n    property real originY: height\n\n    property Component delegate\n    property Component internalDelegate\n\n    ListView {\n        id: listv\n        anchors.fill: parent\n        orientation: Qt.Horizontal\n        displayMarginBeginning: 200000\n        displayMarginEnd: 200000\n\n        leftMargin: listv.width/2 - itemsWidth/2\n        rightMargin: listv.width - leftMargin - listv.width/3\n        snapMode: ListView.SnapToItem\n        preferredHighlightBegin: width/2 - itemsWidth/2\n        preferredHighlightEnd: width/2 + itemsWidth/2\n\n        highlightRangeMode: ListView.StrictlyEnforceRange\n\n        delegate: Item {\n            id: item\n            height: listv.height\n            width: listv.width/3\n            z: {\n                if(item.itemMiddle < lisvAvWidth/2 - width/2)\n                    return index\n                else\n                if(item.itemMiddle > lisvAvWidth/2 + width/2)\n                    return listv.count - index\n                else\n                    return listv.count\n            }\n            readonly property real padX: {\n                if(item.itemMiddle < lisvAvWidth/2) {\n                    var leftSide = listenter.result.x - itemsPadding*index + padding\n                    if(leftSide < padding)\n                        return - listenter.result.x + itemsPadding*index\n                    else\n                        return 0\n                } else {\n                    var rightSide = listenter.result.x + item.width + itemsPadding * (listv.count - index - 1) + padding*2\n                    if(rightSide > listv.width)\n                        return listv.width - item.width - listenter.result.x - itemsPadding * (listv.count - index - 1) - padding*2\n                    else\n                        return 0\n                }\n            }\n\n            readonly property real lisvAvWidth: listv.width - listv.count*itemsPadding\n            readonly property real padding: itemsWidth/2 - width/2\n            readonly property real globalX: listenter.result.x + padX\n            readonly property real ratio: (globalX) / (listv.width - itemsWidth)\n            readonly property real ratio2: (globalX - index*itemsPadding) / (lisvAvWidth - itemsWidth)\n\n            readonly property real itemMiddle: listenter.result.x + item.width/2\n\n            PointMapListener {\n                id: listenter\n                source: item\n                dest: listv\n            }\n\n            Item {\n                width: parent.width\n                height: parent.height\n                x: itemsWidth/2 - parent.width/2\n                z: internalProxy.object? internalProxy.object.z : 0\n\n                ProxyComponent { id: internalProxy; source: coverList.internalDelegate }\n            }\n\n            Item {\n                width: itemsWidth\n                height: parent.height\n                x: item.padX\n                z: delegateProxy.object? delegateProxy.object.z : 0\n                transform: Rotation {\n                    origin.x: item.ratio<0.5? 0 : itemsWidth\n                    origin.y: originY\n                    axis { x: 0; y: 1; z: 0 }\n                    angle: 120 * (0.5 - item.ratio)\n                }\n\n                ProxyComponent { id: delegateProxy; source: coverList.delegate }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/CrashController.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nAsemanObject {\n    signal crashed()\n    signal safe()\n\n    property string logLockFile: AsemanApp.homePath + \"/app.lock\"\n\n    function stopMonitoring() {\n        unlock()\n    }\n\n    function startMonitoring() {\n        unlock()\n        Tools.writeText(logLockFile, \"lock\")\n    }\n\n    function unlock() {\n        Tools.deleteFile(logLockFile)\n    }\n\n    function checkCrash() {\n        var res = Tools.fileExists(logLockFile)\n        if(res)\n            crashed()\n        else\n            safe()\n    }\n\n    Connections {\n        target: Devices\n        onActivityPaused: stopMonitoring()\n        onActivityResumed: startMonitoring()\n    }\n\n    Component.onDestruction: stopMonitoring()\n    Component.onCompleted: {\n        checkCrash()\n        unlock()\n        startMonitoring()\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/DelayPropertySwitch.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nAsemanObject {\n    property variant switchProperty\n    property variant targetProperty\n    property int delay: 500\n\n    onSwitchPropertyChanged: timer.restart()\n\n    Timer {\n        id: timer\n        interval: delay\n        repeat: false\n        onTriggered: targetProperty = switchProperty\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/FileSystemView.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport AsemanQml.Models 2.0\n\nAsemanGridView {\n    id: grid\n    model: fsmodel\n    clip: true\n\n    property alias root: fsmodel.folder\n    property alias filters: fsmodel.nameFilters\n    property alias showDotAndDotDot: fsmodel.showDotAndDotDot\n    property color itemsLabelColor: \"#333333\"\n    \n    signal clickedOnFile(variant fileUrl)\n\n    FileSystemModel {\n        id: fsmodel\n    }\n\n    SystemPalette {\n        id: palette\n    }\n\n    ListObject {\n        id: paths_list\n    }\n\n    onRootChanged: {\n        if(paths_list.last() != root)\n            paths_list.append(root)\n    }\n\n    property real gridWidth: 92*Devices.density\n\n    cellWidth: width/Math.floor(width/gridWidth)\n    cellHeight: gridWidth\n\n    delegate: Item {\n        width: grid.cellWidth\n        height: grid.cellHeight\n\n        Rectangle {\n            anchors.fill: parent\n            anchors.margins: 1*Devices.density\n            radius: 3*Devices.density\n            color: palette.highlight\n            opacity: marea.pressed? 0.2 : 0\n        }\n\n        Column {\n            height: parent.height - 10*Devices.density\n            anchors.centerIn: parent\n            spacing: 4*Devices.density\n\n            Image {\n                anchors.horizontalCenter: parent.horizontalCenter\n                width: height\n                height: parent.height - txt.height - 10*Devices.density\n                asynchronous: true\n                sourceSize: Qt.size(width*2, height*2)\n                fillMode: Image.PreserveAspectCrop\n                clip: true\n                source: {\n                    if(model.fileIsDir)\n                        return \"files/folder.png\"\n                    else\n                    if(model.fileMime.indexOf(\"image\") >= 0)\n                        return model.fileUrl\n                    else\n                        return \"files/unknown.png\"\n                }\n            }\n\n            Text {\n                id: txt\n                width: parent.width\n                anchors.horizontalCenter: parent.horizontalCenter\n                text: model.fileName\n                color: itemsLabelColor\n                wrapMode: Text.WrapAnywhere\n                elide: Text.ElideRight\n                maximumLineCount: 1\n                font.pixelSize: 9*Devices.fontDensity\n                horizontalAlignment: Text.AlignHCenter\n            }\n        }\n\n        MouseArea {\n            id: marea\n            anchors.fill: parent\n            onClicked: {\n                if(model.fileIsDir)\n                    fsmodel.folder = model.filePath\n                else\n                    clickedOnFile(model.fileUrl)\n            }\n        }\n    }\n\n    function back() {\n        paths_list.takeLast()\n        if(paths_list.count != 0)\n            root = paths_list.last()\n\n        if(paths_list.count <= 0)\n            return false\n        else\n            return true\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/MaterialFrame.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport AsemanQml.Base 2.0\nimport QtQuick 2.9\nimport AsemanQml.GraphicalEffects 2.0\n\nItem {\n\n    property alias color: backFrame.color\n    property alias radius: backFrame.radius\n    property alias shadowColor: shadow.color\n\n    DropShadow {\n        id: shadow\n        anchors.fill: source\n        cached: true\n        horizontalOffset: 1*Devices.density\n        verticalOffset: 1*Devices.density\n        radius: 6*Devices.density\n        samples: 16\n        color: \"#000000\"\n        source: scene\n        opacity: 0.3\n        visible: !Devices.isIOS\n    }\n\n    Item {\n        id: scene\n        anchors.fill: parent\n        anchors.margins: -5*Devices.density\n\n        Rectangle {\n            id: backFrame\n            anchors.fill: parent\n            anchors.margins: 5*Devices.density\n            radius: 3*Devices.density\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/NullMouseArea.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\n\nMouseArea {\n    hoverEnabled: true\n    onWheel: wheel.accepted = true\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/PointMapListener.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nAsemanObject {\n    property Item source\n    property Item dest\n    property real x: 0\n    property real y: 0\n\n    readonly property point result: {\n        var prnt = source\n        var rX=0, rY=0;\n        while(prnt != dest) {\n            if(!prnt) return Qt.point(-1, -1)\n            rX += prnt.x\n            rY += prnt.y\n            prnt = prnt.parent\n        }\n\n        return Qt.point(rX+x, rY+y)\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/RoundedImage.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.GraphicalEffects 2.0\n\nItem {\n    width: sourceSize.width\n    height: sourceSize.height\n\n    property alias radius: mask.radius\n    property alias asynchronous: img.asynchronous\n    property alias cache: img.cache\n    property alias fillMode: img.fillMode\n    property alias horizontalAlignment: img.horizontalAlignment\n    property alias mirror: img.mirror\n    property alias paintedHeight: img.paintedHeight\n    property alias paintedWidth: img.paintedWidth\n    property alias progress: img.progress\n    property alias smooth: img.smooth\n    property alias source: img.source\n    property alias sourceSize: img.sourceSize\n    property alias status: img.status\n    property alias verticalAlignment: img.verticalAlignment\n\n    Rectangle {\n        id: mask\n        anchors.fill: parent\n        visible: false\n    }\n\n    Image {\n        id: img\n        anchors.fill: parent\n        visible: false\n    }\n\n    OpacityMask {\n        anchors.fill: parent\n        source: img\n        maskSource: mask\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/RoundedItem.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.GraphicalEffects 2.0\n\nItem {\n    id: dis\n    data: [maskItem, clippedArea, opacityMaskTop, opacityMaskBottom]\n\n    property alias radius: maskItem.radius\n    default property alias sceneData: sourceItem.data\n\n    Rectangle {\n        id: maskItem\n        visible: false\n        anchors.fill: parent\n    }\n\n    Item {\n        id: opacityMaskTop\n        anchors.left: parent.left\n        anchors.right: parent.right\n        anchors.top: parent.top\n        height: radius\n        clip: true\n\n        OpacityMask {\n            source: sourceItem\n            maskSource: maskItem\n            width: maskItem.width\n            height: maskItem.height\n            anchors.top: parent.top\n            cached: true\n            visible: maskItem.radius != 0\n        }\n    }\n\n    Item {\n        id: opacityMaskBottom\n        anchors.left: parent.left\n        anchors.right: parent.right\n        anchors.bottom: parent.bottom\n        height: radius\n        clip: true\n\n        OpacityMask {\n            source: sourceItem\n            maskSource: maskItem\n            width: maskItem.width\n            height: maskItem.height\n            anchors.bottom: parent.bottom\n            cached: true\n            visible: maskItem.radius != 0\n        }\n    }\n\n    Item {\n        id: clippedArea\n        height: dis.height - radius*2\n        width: dis.width\n        y: radius\n        clip: true\n\n        Item {\n            id: sourceItem\n            width: dis.width\n            height: dis.height\n            y: -dis.radius\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/SelectableList.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.GraphicalEffects 2.0\nimport AsemanQml.Base 2.0\n\nItem {\n    id: seletable_list\n    width: 100\n    height: 62\n    clip: true\n\n    property color color: \"transparent\"\n    property alias currentIndex: list.currentIndex\n    property variant items: new Array\n    property color textsColor\n    property color splitersColor: \"#66bbbbbb\"\n    property real itemsHeight: 40*Devices.density\n\n    property variant nameMethodObject: seletable_list\n    property string nameMethodFunction: \"itemName\"\n\n    property bool debugMode: false\n\n    onItemsChanged: {\n        list.refresh()\n    }\n\n    Item {\n        id: background\n        width: parent.width\n        height: parent.height*2\n        anchors.centerIn: parent\n        opacity: 0\n\n        AsemanListView {\n            id: list\n            anchors.fill: parent\n            clip: true\n            preferredHighlightBegin: height/2 - itemsHeight/2\n            preferredHighlightEnd: height/2 + itemsHeight/2\n            highlightRangeMode: ListView.StrictlyEnforceRange\n            highlightMoveDuration: 300\n            highlightMoveVelocity: -1\n            snapMode: ListView.SnapToItem\n            model: listModel\n\n            ListModel { id: listModel }\n\n            delegate: Item {\n                width: list.width\n                height: itemsHeight\n\n                Text {\n                    id: txt\n                    anchors.centerIn: parent\n                    font.family: AsemanApp.globalFont.family\n                    font.pixelSize: Math.floor(11*Devices.fontDensity)\n                    text: Tools.call(nameMethodObject,nameMethodFunction,Qt.DirectConnection,model.name)\n                    color: textsColor\n                }\n            }\n\n            function refresh() {\n                if(debugMode)\n                    console.debug(items.length)\n                for(var i=0; i<items.length; i++) {\n                    if(listModel.count <= i)\n                        listModel.append({\"name\": items[i]})\n                    else\n                        listModel.setProperty(i, \"name\", items[i])\n                }\n                if(items.length < listModel.count)\n                    listModel.remove(items.length, listModel.count - items.length)\n            }\n        }\n    }\n\n    Item {\n        id: scene\n        anchors.fill: parent\n        visible: false\n\n        Item {\n            id: top_part\n            anchors.left: parent.left\n            anchors.right: parent.right\n            anchors.top: parent.top\n            height: parent.height/2 - 1.3*itemsHeight/2\n            clip: true\n\n            Desaturate {\n                source: background\n                width: background.width\n                height: background.height\n                y: -0.25*height\n                transformOrigin: Item.Center\n                scale: 0.8\n                opacity: 0.7\n            }\n        }\n\n        Rectangle {\n            id: center_part\n            anchors.left: parent.left\n            anchors.right: parent.right\n            anchors.top: top_part.bottom\n            anchors.bottom: bottom_part.top\n            clip: true\n            color: seletable_list.color\n\n            Desaturate {\n                source: background\n                width: background.width\n                height: background.height\n                anchors.centerIn: parent\n                transformOrigin: Item.Center\n            }\n        }\n\n        Item {\n            id: bottom_part\n            anchors.left: parent.left\n            anchors.right: parent.right\n            anchors.bottom: parent.bottom\n            height: parent.height/2 - 1.3*itemsHeight/2\n            clip: true\n\n            Desaturate {\n                source: background\n                width: background.width\n                height: background.height\n                y: parent.height - 0.75*height\n                transformOrigin: Item.Center\n                scale: 0.8\n                opacity: 0.7\n            }\n        }\n\n        Rectangle {\n            height: 1*Devices.density\n            width: parent.width\n            anchors.top: top_part.bottom\n            color: splitersColor\n        }\n\n        Rectangle {\n            height: 1*Devices.density\n            width: parent.width\n            anchors.bottom: bottom_part.top\n            color: splitersColor\n        }\n    }\n\n    Rectangle {\n        id: mask\n        anchors.fill: parent\n        visible: false\n        gradient: Gradient{\n            GradientStop { position: 0.00; color: \"#00000000\" }\n            GradientStop { position: 0.22; color: \"#fff\" }\n            GradientStop { position: 0.77; color: \"#fff\" }\n            GradientStop { position: 1.00; color: \"#00000000\" }\n        }\n    }\n\n    OpacityMask {\n        maskSource: mask\n        source: scene\n        anchors.fill: parent\n    }\n\n    function positionViewAtIndex( index, force ) {\n        currentIndex = index\n        if(force)\n            list.positionViewAtIndex(index, ListView.Center)\n    }\n\n    function itemName( index ) {\n        return index\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/ShadowRectangle.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.GraphicalEffects 2.0\nimport AsemanQml.Base 2.0\n\nItem {\n    property alias color : back.color\n    property alias radius: back.radius\n    property alias border: back.border\n    property alias shadowOpacity: blur.opacity\n    property real shadowSize: shadowRadius\n    property alias shadowRadius: blur.radius\n    property alias visibleShadow: blur.visible\n\n    Item {\n        id: shadow\n        anchors.fill: parent\n        visible: false\n\n        Rectangle {\n            anchors.centerIn: parent\n            width: back.width\n            height: back.height\n            radius: back.radius\n            color: \"#333333\"\n        }\n    }\n\n    FastBlur {\n        id: blur\n        anchors.fill: shadow\n        source: shadow\n        radius: 16*Devices.density\n        opacity: 0.8\n    }\n\n    Rectangle {\n        id: back\n        anchors.fill: parent\n        anchors.margins: shadowSize\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/base/Base/qmldir",
    "content": "module AsemanQml.Base\nRoundedImage 2.0 RoundedImage.qml\nShadowRectangle 2.0 ShadowRectangle.qml\nAsemanListView 2.0 AsemanListView.qml\nAsemanGridView 2.0 AsemanGridView.qml\nAsemanFlickable 2.0 AsemanFlickable.qml\nFileSystemView 2.0 FileSystemView.qml\nSelectableList 2.0 SelectableList.qml\nNullMouseArea 2.0 NullMouseArea.qml\nCachedImage 2.0 CachedImage.qml\nMaterialFrame 2.0 MaterialFrame.qml\nPointMapListener 2.0 PointMapListener.qml\nBackAction 2.0 BackAction.qml\nCrashController 2.0 CrashController.qml\nRoundedItem 2.0 RoundedItem.qml\nCoverList 2.0 CoverList.qml\nDelayPropertySwitch 2.0 DelayPropertySwitch.qml\n"
  },
  {
    "path": "src/asemanqml/base/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqmlplugin.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitembase.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandelegateswitch.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqmlplugin.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitembase.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandelegateswitch.cpp\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/qmake_asemanqml.qrc\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/asemanqml/base/asemandelegateswitch.cpp",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemandelegateswitch.h\"\n\n#include <QPointer>\n\nclass AsemanDelegateSwitch::Private\n{\npublic:\n    QList<QQmlComponent*> components;\n    qint32 current = -1;\n    QPointer<QQuickItem> item;\n};\n\nAsemanDelegateSwitch::AsemanDelegateSwitch(QQuickItem *parent) :\n    QQuickItem(parent)\n{\n    p = new Private;\n    connect(this, &AsemanDelegateSwitch::componentsChanged, this, &AsemanDelegateSwitch::refresh);\n}\n\nQQmlListProperty<QQmlComponent> AsemanDelegateSwitch::components()\n{\n    return QQmlListProperty<QQmlComponent>(this, &p->components, QQmlListProperty<QQmlComponent>::AppendFunction(append),\n                                                QQmlListProperty<QQmlComponent>::CountFunction(count),\n                                                QQmlListProperty<QQmlComponent>::AtFunction(at),\n                                                QQmlListProperty<QQmlComponent>::ClearFunction(clear) );\n}\n\nQList<QQmlComponent *> AsemanDelegateSwitch::componentsList() const\n{\n    return p->components;\n}\n\nvoid AsemanDelegateSwitch::setCurrent(qint32 current)\n{\n    if (p->current == current)\n        return;\n\n    p->current = current;\n    refresh();\n    Q_EMIT currentChanged();\n}\n\nqint32 AsemanDelegateSwitch::current() const\n{\n    return p->current;\n}\n\nQQuickItem *AsemanDelegateSwitch::item() const\n{\n    return p->item;\n}\n\nvoid AsemanDelegateSwitch::append(QQmlListProperty<QQmlComponent> *p, QQmlComponent *v)\n{\n    AsemanDelegateSwitch *aobj = static_cast<AsemanDelegateSwitch*>(p->object);\n    aobj->p->components.append(v);\n    Q_EMIT aobj->componentsChanged();\n}\n\nint AsemanDelegateSwitch::count(QQmlListProperty<QQmlComponent> *p)\n{\n    AsemanDelegateSwitch *aobj = static_cast<AsemanDelegateSwitch*>(p->object);\n    return aobj->p->components.count();\n}\n\nQQmlComponent *AsemanDelegateSwitch::at(QQmlListProperty<QQmlComponent> *p, int idx)\n{\n    AsemanDelegateSwitch *aobj = static_cast<AsemanDelegateSwitch*>(p->object);\n    return aobj->p->components.at(idx);\n}\n\nvoid AsemanDelegateSwitch::clear(QQmlListProperty<QQmlComponent> *p)\n{\n    AsemanDelegateSwitch *aobj = static_cast<AsemanDelegateSwitch*>(p->object);\n    aobj->p->components.clear();\n    Q_EMIT aobj->componentsChanged();\n}\n\nvoid AsemanDelegateSwitch::refresh()\n{\n    if (p->item)\n    {\n        p->item->deleteLater();\n        p->item = Q_NULLPTR;\n    }\n    if (p->current < 0 || p->components.isEmpty() || p->current >= p->components.count())\n    {\n        Q_EMIT itemChanged();\n        return;\n    }\n\n    QQmlComponent *component = p->components.at(p->current);\n    QQmlContext *context = qmlContext(this);\n    QObject *object = component->create(context);\n    if(!object)\n        return;\n\n    QQuickItem *objectItem = qobject_cast<QQuickItem*>(object);\n    if (!objectItem)\n    {\n        object->deleteLater();\n        return;\n    }\n\n    object->setParent(this);\n    objectItem->setParentItem(this);\n    p->item = objectItem;\n\n    connect(p->item, &QQuickItem::widthChanged, this, &AsemanDelegateSwitch::refreshWidth);\n    connect(p->item, &QQuickItem::heightChanged, this, &AsemanDelegateSwitch::refreshHeight);\n\n    refreshWidth();\n    refreshHeight();\n\n    Q_EMIT itemChanged();\n}\n\nvoid AsemanDelegateSwitch::refreshWidth()\n{\n    if (!p->item)\n        resetWidth();\n    else\n        setWidth(p->item->width());\n}\n\nvoid AsemanDelegateSwitch::refreshHeight()\n{\n    if (!p->item)\n        resetHeight();\n    else\n        setHeight(p->item->height());\n}\n\nAsemanDelegateSwitch::~AsemanDelegateSwitch()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/asemanqml/base/asemandelegateswitch.h",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANDELEGATESWITCH_H\n#define ASEMANDELEGATESWITCH_H\n\n#include <QObject>\n#include <QQuickItem>\n#include <QQmlComponent>\n\nclass AsemanDelegateSwitch : public QQuickItem\n{\n    Q_OBJECT\n    Q_PROPERTY(QQmlListProperty<QQmlComponent> components READ components NOTIFY componentsChanged)\n    Q_PROPERTY(qint32 current READ current WRITE setCurrent NOTIFY currentChanged)\n    Q_PROPERTY(QQuickItem* item READ item NOTIFY itemChanged)\n    Q_CLASSINFO(\"DefaultProperty\", \"components\")\n\n    class Private;\n\npublic:\n    AsemanDelegateSwitch(QQuickItem *parent = Q_NULLPTR);\n    virtual ~AsemanDelegateSwitch();\n\n    QQmlListProperty<QQmlComponent> components();\n    QList<QQmlComponent*> componentsList() const;\n\n    void setCurrent(qint32 current);\n    qint32 current() const;\n\n    QQuickItem *item() const;\n\nQ_SIGNALS:\n    void componentsChanged();\n    void currentChanged();\n    void itemChanged();\n\nprivate:\n    static void append(QQmlListProperty<QQmlComponent> *p, QQmlComponent *v);\n    static int count(QQmlListProperty<QQmlComponent> *p);\n    static QQmlComponent *at(QQmlListProperty<QQmlComponent> *p, int idx);\n    static void clear(QQmlListProperty<QQmlComponent> *p);\n\n    void refresh();\n    void refreshWidth();\n    void refreshHeight();\n\nprivate:\n    Private *p;\n};\n\n#endif // ASEMANDELEGATESWITCH_H\n"
  },
  {
    "path": "src/asemanqml/base/asemanqmlplugin.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanqmlplugin.h\"\n\n#include \"asemanqttoolsitembase.h\"\n\n#include <QDebug>\n#include <QDir>\n#include <QStringList>\n#include <QtQml>\n\n#ifdef QT_ASEMAN_EMBEDDED\nbool asemanqml_base_plugin_registered = AsemanQmlPlugin::registerStaticTypes(\"AsemanQml.Base\");\n#endif\n\nbool AsemanQmlPlugin::registerStaticTypes(const char *uri)\n{\n    Q_INIT_RESOURCE(qmake_asemanqml);\n    AsemanQtToolsItemBase::registerTypes(uri);\n    AsemanQtToolsItemBase::registerFiles(QStringLiteral(\":/AsemanQml/Base\"), uri);\n    return true;\n}\n\nvoid AsemanQmlPlugin::registerTypes(const char *uri)\n{\n    AsemanQmlPlugin::registerStaticTypes(uri);\n}\n\nvoid AsemanQmlPlugin::initializeEngine(QQmlEngine *engine, const char *uri)\n{\n    QQmlExtensionPlugin::initializeEngine(engine, uri);\n    AsemanQtTools::initializeEngine(engine, uri);\n}\n"
  },
  {
    "path": "src/asemanqml/base/asemanqmlplugin.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQMLPLUGIN_H\n#define ASEMANQMLPLUGIN_H\n\n#include <QQmlExtensionPlugin>\n\nclass AsemanQmlPlugin : public QQmlExtensionPlugin\n{\n    Q_OBJECT\n\n#ifndef QT_ASEMAN_EMBEDDED\n    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)\n#endif\n\npublic:\n    static bool registerStaticTypes(const char *uri);\n\n    void registerTypes(const char *uri);\n    void initializeEngine(QQmlEngine *engine, const char *uri);\n};\n\n#endif // ASEMANQMLPLUGIN_H\n"
  },
  {
    "path": "src/asemanqml/base/asemanqttoolsitembase.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtToolsItemBase is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtToolsItemBase is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanqttoolsitembase.h\"\n\n#include \"asemanquickview.h\"\n#include \"asemanqtlogger.h\"\n#include \"asemandevicesitem.h\"\n#include \"asemantoolsitem.h\"\n#include \"asemanapplicationitem.h\"\n#include \"asemanhashobject.h\"\n#include \"asemandownloader.h\"\n#include \"asemanlistobject.h\"\n#include \"asemancalendarconverter.h\"\n#include \"asemanimagecoloranalizor.h\"\n#include \"asemandesktoptools.h\"\n#include \"asemanapplicationsingleton.h\"\n#include \"asemansettings.h\"\n#include \"asemanmimedata.h\"\n#include \"asemanfileresourcemanager.h\"\n#include \"asemanmapobject.h\"\n#include \"asemandragobject.h\"\n#include \"asemanbackhandler.h\"\n#include \"aseman_macros.h\"\n#include \"asemanwindowdetails.h\"\n#include \"asemanautostartmanager.h\"\n#include \"asemanhostchecker.h\"\n#include \"asemannetworkproxy.h\"\n#include \"asemanquickobject.h\"\n#include \"asemankeyhandler.h\"\n#include \"asemantexttools.h\"\n#include \"asemanfiledownloaderqueueitem.h\"\n#include \"asemantitlebarcolorgrabber.h\"\n#include \"asemanproxycomponent.h\"\n#include \"asemanfiledownloaderqueue.h\"\n#include \"asemandragarea.h\"\n#include \"asemanapplicationitem.h\"\n#include \"asemanglobaltranslations.h\"\n#include \"asemandelegateswitch.h\"\n#include \"asemanencrypter.h\"\n#include \"asemanquickviewwrapper.h\"\n#include \"asemanmouseeventlistener.h\"\n#include \"asemanqmlimage.h\"\n#include \"asemantranslationmanager.h\"\n#include \"asemanrefresherobject.h\"\n#include \"asemanitemgrabber.h\"\n#if !defined(Q_OS_IOS) && !defined(Q_OS_WASM)\n#include \"asemanprocess.h\"\n#endif\n#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS)\n#include \"asemansystemtray.h\"\n#endif\n#ifdef Q_OS_ANDROID\n#include \"asemanjavalayer.h\"\n#endif\n#ifdef DESKTOP_LINUX\n#include \"asemanmimeapps.h\"\n#endif\n#ifdef ASEMAN_SENSORS\n#include \"asemansensors.h\"\n#endif\n#ifdef QZXING_SUPPORTED\n#include \"QZXing.h\"\n#ifdef QZXING_MULTIMEDIA\n#include \"QZXingFilter.h\"\n#endif\n#endif\n#ifdef ASEMAN_NOTIFICATION\n#include \"asemannotification.h\"\n#endif\n#if defined(Q_OS_LINUX) && defined(QT_DBUS_LIB)\n#include \"asemankdewallet.h\"\n#endif\n\n#ifndef Q_OS_WASM\n#include \"asemannetworkmanager.h\"\n#include \"asemannetworkmanageritem.h\"\n#include \"asemannetworksleepmanager.h\"\n#endif\n\n#include <qqml.h>\n#include <QHash>\n#include <QPointer>\n\n#define SINGLETON_PROVIDER(TYPE, FNC_NAME, NEW_CREATOR) \\\n    static QObject *FNC_NAME(QQmlEngine *engine, QJSEngine *scriptEngine) { \\\n        Q_UNUSED(engine) \\\n        Q_UNUSED(scriptEngine) \\\n        TYPE *singleton = NEW_CREATOR; \\\n        return singleton; \\\n    }\n\nSINGLETON_PROVIDER(AsemanDevicesItem         , aseman_devices_singleton           , AsemanQtToolsItemBase::devices())\nSINGLETON_PROVIDER(AsemanToolsItem           , aseman_tools_singleton             , AsemanQtToolsItemBase::tools())\nSINGLETON_PROVIDER(AsemanTextTools           , aseman_text_tools_singleton        , AsemanQtToolsItemBase::textTools())\nSINGLETON_PROVIDER(AsemanDesktopTools        , aseman_desktoptools_singleton      , AsemanQtToolsItemBase::desktopTools())\nSINGLETON_PROVIDER(AsemanCalendarConverter   , aseman_calendarconv_singleton      , AsemanQtToolsItemBase::calendar(engine))\nSINGLETON_PROVIDER(AsemanBackHandler         , aseman_backhandler_singleton       , AsemanQtToolsItemBase::backHandler(engine))\nSINGLETON_PROVIDER(AsemanApplicationSingleton, aseman_app_singleton               , AsemanQtToolsItemBase::application(engine))\nSINGLETON_PROVIDER(AsemanQuickViewWrapper    , aseman_qview_singleton             , AsemanQtToolsItemBase::quickView(engine))\nSINGLETON_PROVIDER(AsemanQtLogger            , aseman_logger_singleton            , AsemanQtToolsItemBase::qtLogger())\nSINGLETON_PROVIDER(AsemanGlobalTranslations  , aseman_globaltranslations_singleton, AsemanQtToolsItemBase::globalTranslations(engine))\n#ifdef Q_OS_ANDROID\nSINGLETON_PROVIDER(AsemanJavaLayer          , aseman_javalayer_singleton       , AsemanQtToolsItemBase::javaLayer())\n#endif\n\nstatic QStringList aseman_qt_tools_indexCache;\nstatic QString aseman_qt_tools_destination;\n\nvoid AsemanQtToolsItemBase::registerTypes(const char *uri, bool exportMode)\n{\n    static QSet<QByteArray> register_list;\n    if(register_list.contains(uri) && !exportMode)\n        return;\n    qRegisterMetaType<AsemanMimeData*>(\"AsemanMimeData*\");\n\n    registerType<AsemanMimeData>(uri, 2, 0, \"MimeData\", exportMode);\n    registerType<AsemanDragObject>(uri, 2, 0, \"DragObject\", exportMode);\n    registerType<AsemanHashObject>(uri, 2, 0, \"HashObject\", exportMode);\n    registerType<AsemanMapObject>(uri, 2, 0, \"MapObject\", exportMode);\n    registerType<AsemanListObject>(uri, 2, 0, \"ListObject\", exportMode);\n    registerType<AsemanDownloader>(uri, 2, 0, \"Downloader\", exportMode);\n    registerType<AsemanEncrypter>(uri, 2, 0, \"Encrypter\", exportMode);\n#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS)\n    registerType<AsemanSystemTray>(uri, 2, 0, \"SystemTray\", exportMode);\n#endif\n    registerType<AsemanWindowDetails>(uri, 2, 0, \"WindowDetails\", exportMode);\n    registerType<AsemanQuickObject>(uri, 2, 0, \"AsemanObject\", exportMode);\n    registerType<AsemanImageColorAnalizor>(uri, 2, 0, \"ImageColorAnalizor\", exportMode);\n    registerType<AsemanAutoStartManager>(uri, 2, 0, \"AutoStartManager\", exportMode);\n    registerType<AsemanSettings>(uri, 2, 0, \"Settings\", exportMode);\n    registerType<AsemanFileDownloaderQueueItem>(uri, 2, 0, \"FileDownloaderQueueItem\", exportMode);\n    registerType<AsemanFileDownloaderQueue>(uri, 2, 0, \"FileDownloaderQueue\", exportMode);\n    registerType<AsemanMouseEventListener>(uri, 2, 0, \"MouseEventListener\", exportMode);\n    registerType<AsemanItemGrabber>(uri, 2, 0, \"ItemGrabber\", exportMode);\n    registerType<AsemanApplicationItem>(uri, 2,0, \"AsemanApplicationBase\", exportMode);\n    registerType<AsemanKeyHandler>(uri, 2, 0, \"KeyHandler\", exportMode);\n    registerType<AsemanQmlImage>(uri, 2, 0, \"AsemanImage\", exportMode);\n#if !defined(Q_OS_IOS) && !defined(Q_OS_WASM)\n    registerType<AsemanProcess>(uri, 2, 0, \"Process\", exportMode);\n#endif\n    registerType<AsemanTranslationManager>(uri, 2, 0, \"TranslationManager\", exportMode);\n#ifdef DESKTOP_LINUX\n    registerType<AsemanMimeApps>(uri, 2, 0, \"MimeApps\", exportMode);\n#endif\n    registerType<AsemanHostChecker>(uri, 2, 0, \"HostChecker\", exportMode);\n    registerType<AsemanNetworkProxy>(uri, 2, 0, \"NetworkProxy\", exportMode);\n    registerType<AsemanTitleBarColorGrabber>(uri, 2, 0, \"TitleBarColorGrabber\", exportMode);\n    registerType<AsemanDragArea>(uri, 2, 0, \"MouseDragArea\", exportMode);\n    registerType<AsemanFileResourceManager>(uri, 2, 0, \"FileResourceManager\", exportMode);\n    registerType<AsemanProxyComponent>(uri, 2, 0, \"ProxyComponent\", exportMode);\n    registerType<AsemanDelegateSwitch>(uri, 2, 0, \"DelegateSwitch\", exportMode);\n    registerType<AsemanRefresherObject>(uri, 2, 0, \"RefresherObject\", exportMode);\n\n#ifndef Q_OS_WASM\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n    registerType<AsemanNetworkSleepManager>(uri, 2, 0, \"NetworkSleepManager\", exportMode);\n    registerType<AsemanNetworkManager>(uri, 2, 0, \"NetworkManager\", exportMode);\n    registerUncreatableType<AsemanNetworkManagerItem>(uri, 2, 0, \"NetworkManagerItem\", QStringLiteral(\"It must create using NetworkManager component.\"), exportMode);\n#endif\n#endif\n\n\n    registerSingletonType<AsemanDevicesItem>(uri, 2, 0, \"Devices\", aseman_devices_singleton, exportMode);\n    registerSingletonType<AsemanTextTools>(uri, 2, 0, \"TextTools\", aseman_text_tools_singleton, exportMode);\n    registerSingletonType<AsemanToolsItem>(uri, 2, 0, \"Tools\", aseman_tools_singleton, exportMode);\n    registerSingletonType<AsemanDesktopTools>(uri, 2, 0, \"Desktop\", aseman_desktoptools_singleton, exportMode);\n    registerSingletonType<AsemanCalendarConverter>(uri, 2, 0, \"CalendarConv\", aseman_calendarconv_singleton, exportMode);\n    registerSingletonType<AsemanBackHandler>(uri, 2, 0, \"BackHandler\", aseman_backhandler_singleton, exportMode);\n    registerSingletonType<AsemanApplicationSingleton>(uri, 2, 0, \"AsemanApp\", aseman_app_singleton, exportMode);\n    registerSingletonType<AsemanQtLogger>(uri, 2, 0, \"Logger\", aseman_logger_singleton, exportMode);\n    registerSingletonType<AsemanQuickViewWrapper>(uri, 2, 0, \"View\", aseman_qview_singleton, exportMode);\n    registerSingletonType<AsemanGlobalTranslations>(uri, 2, 0, \"Translations\", aseman_globaltranslations_singleton, exportMode);\n#ifdef Q_OS_ANDROID\n    registerSingletonType<AsemanJavaLayer>(uri, 2, 0, \"JavaLayer\", aseman_javalayer_singleton, exportMode);\n#endif\n\n    registerUncreatableType<QScreen>(uri, 2, 0, \"Screen\", QStringLiteral(\"\"), exportMode);\n    registerUncreatableType<AsemanDesktopTools>(uri, 2, 0, \"AsemanDesktopTools\", QStringLiteral(\"It's a singleton class\"), exportMode);\n\n#ifdef QZXING_SUPPORTED\n    registerType<QZXing>(uri, 2, 0, \"QZXing\", exportMode);\n#ifdef QZXING_MULTIMEDIA\n    registerType<QZXingFilter>(uri, 2, 0, \"QZXingFilter\", exportMode);\n#endif //QZXING_MULTIMEDIA\n#endif\n\n    register_list.insert(uri);\n}\n\nvoid AsemanQtToolsItemBase::registerFiles(const QString &filesLocation, const char *uri)\n{\n    QFile file(filesLocation + QStringLiteral(\"/qmldir\"));\n    if(file.open(QFile::ReadOnly))\n    {\n        QStringList lines = QString::fromUtf8(file.readAll()).split(QStringLiteral(\"\\n\"), Qt::SkipEmptyParts);\n        file.close();\n\n        for(const QString &l: lines)\n        {\n            QStringList parts = l.trimmed().split(QStringLiteral(\" \"), Qt::SkipEmptyParts);\n            bool singleton = false;\n            if(parts.count() && parts.first() == \"singleton\")\n                singleton = parts.takeFirst().count();\n            if(parts.length() != 3)\n                continue;\n\n            QStringList version = parts.at(1).split(QStringLiteral(\".\"), Qt::SkipEmptyParts);\n            if(version.count() != 2)\n                continue;\n\n            if(singleton)\n                qmlRegisterSingletonType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                         uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n            else\n                qmlRegisterType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n        }\n    }\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemBase::registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemBase::registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportModel<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemBase::registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterSingletonType<T>(uri, versionMajor, versionMinor, typeName, callback);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemBase::registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(qmlName));\n    else\n        return qmlRegisterUncreatableType<T>(uri, versionMajor, versionMinor, qmlName, reason);\n    return 0;\n}\n\n\nvoid AsemanQtToolsItemBase::exportDocuments(const QString &destination)\n{\n    aseman_qt_tools_destination = destination;\n\n    QDir().mkpath(aseman_qt_tools_destination);\n    aseman_qt_tools_indexCache.clear();\n\n    AsemanQtToolsItemBase::registerTypes(\"AsemanToolsItem\", true);\n\n    QString index = QStringLiteral(\"# AsemanToolsItem Documents\\n\\n\");\n    index += QStringLiteral(\"### [Getting Started](gettingstarted.md)\\n\\n\");\n    index += QStringLiteral(\"### How to import:\\n\\n\");\n    index += QStringLiteral(\"```c++\\nimport AsemanQml.Base 2.0\\n```\\n\\nor\\n\\n\"\n             \"```c++\\nimport AsemanQml.Base 2.0 as Aseman\\n```\\n\\n\");\n    index += QStringLiteral(\"### Types\\n\\nHere are all components of the AsemanToolsItem:\\n\\n\");\n    for(const QString cmpnt: aseman_qt_tools_indexCache)\n    {\n        if(cmpnt == QStringLiteral(\"MimeData\"))\n            index += QStringLiteral(\"\\n##### Normal types\\n\\n\");\n        if(cmpnt == QStringLiteral(\"MixedListModel\"))\n            index += QStringLiteral(\"\\n##### Models\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Devices\"))\n            index += QStringLiteral(\"\\n##### Singletons\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Screen\"))\n            index += QStringLiteral(\"\\n##### Uncreatable types\\n\\n\");\n        index += QStringLiteral(\" * [%1](%2.md)\\n\").arg(cmpnt).arg(cmpnt.toLower());\n    }\n\n    QString path = aseman_qt_tools_destination + \"/start.md\";\n    aseman_qt_tools_destination.clear();\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return;\n\n    file.write(index.toUtf8());\n    file.close();\n}\n\nQString AsemanQtToolsItemBase::fixType(const QString &type)\n{\n    if(type == QStringLiteral(\"QSizeF\") || type == QStringLiteral(\"QSize\"))\n        return QStringLiteral(\"size\");\n    if(type == QStringLiteral(\"QPoint\") || type == QStringLiteral(\"QPointF\"))\n        return QStringLiteral(\"point\");\n    if(type == QStringLiteral(\"QUrl\"))\n        return QStringLiteral(\"url\");\n    if(type == QStringLiteral(\"QString\"))\n        return QStringLiteral(\"string\");\n    if(type == QStringLiteral(\"QByteArray\"))\n        return QStringLiteral(\"byte\");\n    if(type == QStringLiteral(\"bool\"))\n        return QStringLiteral(\"boolean\");\n    if(type == QStringLiteral(\"double\") || type == QStringLiteral(\"qreal\"))\n        return QStringLiteral(\"real\");\n    if(type == QStringLiteral(\"QVariant\"))\n        return QStringLiteral(\"variant\");\n    if(type == QStringLiteral(\"QJSValue\"))\n        return QStringLiteral(\"function(){[code]}\");\n    if(type == QStringLiteral(\"QVariantMap\"))\n        return QStringLiteral(\"map\");\n    if(type == QStringLiteral(\"QVariantList\"))\n        return QStringLiteral(\"list&lt;variant&gt;\");\n    if(type == QStringLiteral(\"QStringList\"))\n        return QStringLiteral(\"list&lt;string&gt;\");\n    if(type == QStringLiteral(\"QList<qint32>\"))\n        return QStringLiteral(\"list&lt;int&gt;\");\n    if(type.contains(QStringLiteral(\"*\")))\n    {\n        if(type == QStringLiteral(\"QObject*\"))\n            return QStringLiteral(\"object\");\n        if(type.contains(QStringLiteral(\"Telegram\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Telegram\"));\n            return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n        }\n        if(type.contains(QStringLiteral(\"Object\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Object\"));\n            return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                    .arg(name).arg(name.toLower());\n        }\n        if(type == QStringLiteral(\"QQmlComponent*\"))\n            return QStringLiteral(\"Component\");\n        if(type == QStringLiteral(\"QQuickItem\"))\n            return QStringLiteral(\"Item\");\n    }\n    if(type.contains(QStringLiteral(\"Telegram\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Telegram\"));\n        return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n    }\n    if(type == QStringLiteral(\"QQuickItem\"))\n        return QStringLiteral(\"Item\");\n    if(type == QStringLiteral(\"QObject\"))\n        return QStringLiteral(\"object\");\n    if(type.contains(QStringLiteral(\"Object\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Object\"));\n        return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                .arg(name).arg(name.toLower());\n    }\n    return type;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemBase::exportItem(const QString &module, int major, int minor, const QString &component, bool store)\n{\n    QString result;\n    aseman_qt_tools_indexCache << component;\n\n    QMetaObject meta = T::staticMetaObject;\n    QString inherits = fixType(QString::fromUtf8(meta.superClass()? meta.superClass()->className() : \"\"));\n    bool isModel = component.toLower().contains(QStringLiteral(\"model\"));\n\n    result += QStringLiteral(\"# %1\\n\\n\").arg(component);\n\n    QString headers;\n    headers += QStringLiteral(\" * [Component details](#component-details)\\n\");\n\n    QString details = QStringLiteral(\"\\n### Component details:\\n\\n\");\n    details += QStringLiteral(\"|Detail|Value|\\n\"\n                       \"|------|-----|\\n\");\n    details += QStringLiteral(\"|%1|%2 %3.%4|\\n\").arg(QStringLiteral(\"Import\")).arg(module).arg(major).arg(minor);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Component\")).arg(component);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"C++ class\")).arg(QString::fromUtf8(meta.className()));\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Inherits\")).arg(inherits);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Model\")).arg(QString::fromUtf8(isModel?\"Yes\":\"No\"));\n\n    QString resultProperties;\n    QStringList propertiesSignals;\n    for(int i=0; i<meta.propertyCount(); i++)\n    {\n        QMetaProperty property = meta.property(i);\n        const QString &propertyName = QString::fromUtf8(property.name());\n        const QString &propertyType = fixType(QString::fromUtf8(property.typeName()));\n        propertiesSignals << QString::fromUtf8(property.notifySignal().name());\n\n        QString text = QStringLiteral(\"* <font color='#074885'><b>%1</b></font>: %2\").arg(propertyName).arg(propertyType);\n        if(!property.isWritable())\n            text += QStringLiteral(\" (readOnly)\");\n\n        text += QStringLiteral(\"\\n\");\n        if(meta.propertyOffset()<=i)\n            resultProperties += text;\n    }\n\n    QString enumResults;\n    for(int i=meta.enumeratorOffset(); i<meta.enumeratorCount(); i++)\n    {\n        QMetaEnum enumerator = meta.enumerator(i);\n        const QString &enumName = QString::fromUtf8(enumerator.name());\n\n        enumResults += QStringLiteral(\"\\n##### %1\\n\\n\").arg(enumName);\n        enumResults += QStringLiteral(\"|Key|Value|\\n\"\n                               \"|---|-----|\\n\");\n\n        for(int j=0; j<enumerator.keyCount(); j++)\n            enumResults += QStringLiteral(\"|%1|%2|\\n\").arg(QString::fromUtf8(enumerator.key(j))).arg(enumerator.value(j));\n    }\n\n    QString resultSlots;\n    QString resultSignals;\n    for(int i=meta.methodOffset(); i<meta.methodCount(); i++)\n    {\n        QMetaMethod method = meta.method(i);\n        if(method.access() != QMetaMethod::Public)\n            continue;\n\n        const QString &methodName = QString::fromUtf8(method.name());\n        if(propertiesSignals.contains(methodName))\n            continue;\n\n        const QString &methodType = fixType(QString::fromUtf8(method.typeName()));\n\n        QString args;\n        const QList<QByteArray> &paramNames = method.parameterNames();\n        const QList<QByteArray> &paramTypes = method.parameterTypes();\n        for(int j=0; j<paramNames.count(); j++)\n        {\n            if(j != 0)\n                args += QStringLiteral(\", \");\n\n            args += fixType(QString::fromUtf8(paramTypes[j])) + QStringLiteral(\" \") + paramNames[j];\n        }\n\n        QString text = QStringLiteral(\" * %1 <font color='#074885'><b>%2</b></font>(%3)\\n\").arg(methodType).arg(methodName).arg(args);\n        switch(static_cast<int>(method.methodType()))\n        {\n        case QMetaMethod::Slot:\n            resultSlots += text;\n            break;\n        case QMetaMethod::Signal:\n            resultSignals += text;\n            break;\n        }\n    }\n\n    if(!resultProperties.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Normal Properties](#normal-properties)\\n\");\n        resultProperties = QStringLiteral(\"\\n### Normal Properties\\n\\n\") + resultProperties;\n    }\n    if(!enumResults.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Enumerator](#enumerator)\\n\");\n        enumResults = QStringLiteral(\"\\n### Enumerator\\n\\n\") + enumResults;\n    }\n    if(!resultSlots.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Methods](#methods)\\n\");\n        resultSlots = QStringLiteral(\"\\n### Methods\\n\\n\") + resultSlots;\n    }\n    if(!resultSignals.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Signals](#Q_SIGNALS)\\n\");\n        resultSignals = QStringLiteral(\"\\n### Signals\\n\\n\") + resultSignals;\n    }\n    if(isModel)\n        headers += QStringLiteral(\" * [Roles](#roles)\\n\");\n\n    result += headers + QStringLiteral(\"\\n\");\n    result += details + QStringLiteral(\"\\n\");\n    result += resultProperties + QStringLiteral(\"\\n\");\n    result += resultSlots + QStringLiteral(\"\\n\");\n    result += resultSignals + QStringLiteral(\"\\n\");\n    result += enumResults + QStringLiteral(\"\\n\");\n\n    if(!store)\n        return result;\n\n    QString path = aseman_qt_tools_destination + QStringLiteral(\"/\") + component.toLower() + QStringLiteral(\".md\");\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemBase::exportModel(const QString &module, int major, int minor, const QString &component)\n{\n    QString result = exportItem<T>(module, major, minor, component, false);\n    T *model = new T();\n\n    QHash<qint32,QByteArray> roleNames = model->roleNames();\n    QMap<qint32,QByteArray> rolesMap;\n    QHashIterator<qint32,QByteArray> i(roleNames);\n    while(i.hasNext())\n    {\n        i.next();\n        rolesMap[i.key()] = i.value();\n    }\n\n    result += QStringLiteral(\"\\n### Roles\\n\\n\");\n    Q_FOREACH(const QByteArray &name, rolesMap)\n        result += QStringLiteral(\" * model.<font color='#074885'>%1</font>\\n\").arg(QString::fromUtf8(name));\n\n    delete model;\n\n    QString path = aseman_qt_tools_destination + \"/\" + component.toLower() + \".md\";\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n"
  },
  {
    "path": "src/asemanqml/base/asemanqttoolsitembase.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQTTOOLSITEMBASE_H\n#define ASEMANQTTOOLSITEMBASE_H\n\n#include <QtGlobal>\n#include <QString>\n\n#include <asemanqttools.h>\n\nclass QObject;\nclass QQmlEngine;\nclass QJSEngine;\nclass AsemanQtToolsItemBase: public AsemanQtTools\n{\npublic:\n    static void registerTypes(const char *uri, bool exportMode = false);\n    static void registerFiles(const QString &filesLocation, const char *uri);\n\n    template<typename T>\n    static int registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template<typename T>\n    static int registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template <typename T>\n    static int registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName,\n                                 QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode);\n\n    template<typename T>\n    static int registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason, bool exportMode);\n\n    static void exportDocuments(const QString &destination);\n\nprotected:\n    template<typename T>\n    static QString exportItem(const QString &module, int major, int minor, const QString &component, bool store = true);\n    template<typename T>\n    static QString exportModel(const QString &module, int major, int minor, const QString &component);\n\n    static QString fixType(const QString &type);\n};\n\n#endif // ASEMANQTTOOLSITEMBASE_H\n"
  },
  {
    "path": "src/asemanqml/base/base.pri",
    "content": "INCLUDEPATH += $$PWD\nQT += core gui network quick widgets\n\nHEADERS += \\\n    $$PWD/asemanqmlplugin.h \\\n    $$PWD/asemanqttoolsitembase.h \\\n    $$PWD/asemandelegateswitch.h\n\nSOURCES += \\\n    $$PWD/asemanqmlplugin.cpp \\\n    $$PWD/asemanqttoolsitembase.cpp \\\n    $$PWD/asemandelegateswitch.cpp\n\nstatic: !linux: !win32: DEFINES += ASEMAN_STATIC_BUILD\n\nASEMAN_QML_FILES = $$files($$PWD/Base/*.*) $$PWD/Base/qmldir\nASEMAN_QML_PRIVATES = $$files($$PWD/Base/private/*)\nASEMAN_QML_RESOURCES = $$files($$PWD/Base/files/*)\n\nINCLUDED_RESOURCE_FILES = \\\n    $$ASEMAN_QML_FILES \\\n    $$ASEMAN_QML_PRIVATES \\\n    $$ASEMAN_QML_RESOURCES\n\nasemanqml.files = $$INCLUDED_RESOURCE_FILES\nasemanqml.prefix = /AsemanQml/\n\ncontains(DEFINES, QT_ASEMAN_EMBEDDED) {\n    RESOURCES += $$PWD/qmake_asemanqml.qrc\n} else {\n    RESOURCES += asemanqml\n}\n"
  },
  {
    "path": "src/asemanqml/base/base.pro",
    "content": "TARGET  = asemanqmlbase\nTARGETPATH = AsemanQml/Base\nIMPORT_VERSION = 2.0\nVERSION_REVISION = 2\n\nQT += asemanqml asemangui asemancore asemannetwork asemanwidgets\ninclude(base.pri)\n\nload(qml_plugin)\n"
  },
  {
    "path": "src/asemanqml/base/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Base 2.0'\n\nModule {\n    dependencies: [\n        \"QtGraphicalEffects 1.12\",\n        \"QtQml 2.7\",\n        \"QtQml.Models 2.2\",\n        \"QtQml.WorkerScript 2.15\",\n        \"QtQuick 2.9\",\n        \"QtQuick.Controls 2.5\",\n        \"QtQuick.Controls.Fusion 2.15\",\n        \"QtQuick.Controls.Fusion.impl 2.15\",\n        \"QtQuick.Controls.IOSStyle 2.12\",\n        \"QtQuick.Controls.IOSStyle.impl 2.12\",\n        \"QtQuick.Controls.Imagine 2.15\",\n        \"QtQuick.Controls.Imagine.impl 2.15\",\n        \"QtQuick.Controls.Material 2.15\",\n        \"QtQuick.Controls.Material.impl 2.15\",\n        \"QtQuick.Controls.Styles 1.4\",\n        \"QtQuick.Controls.Styles.Plasma 2.0\",\n        \"QtQuick.Controls.Universal 2.15\",\n        \"QtQuick.Controls.Universal.impl 2.15\",\n        \"QtQuick.Controls.impl 2.15\",\n        \"QtQuick.Extras 1.4\",\n        \"QtQuick.Layouts 1.4\",\n        \"QtQuick.Templates 2.5\",\n        \"QtQuick.Window 2.6\",\n        \"org.kde.kconfig 1.0\",\n        \"org.kde.kirigami 2.9\",\n        \"org.kde.kquickcontrolsaddons 2.0\",\n        \"org.kde.plasma.components 3.0\",\n        \"org.kde.plasma.core 2.0\",\n        \"org.kde.plasma.extras 2.0\"\n    ]\n    Component {\n        name: \"AsemanApplication\"\n        prototype: \"QObject\"\n        Enum {\n            name: \"ApplicationType\"\n            values: {\n                \"NoneApplication\": 0,\n                \"GuiApplication\": 1,\n                \"CoreApplication\": 2\n            }\n        }\n        Enum {\n            name: \"ApplicationState\"\n            values: {\n                \"ApplicationSuspended\": 0,\n                \"ApplicationHidden\": 1,\n                \"ApplicationInactive\": 2,\n                \"ApplicationActive\": 4\n            }\n        }\n        Property { name: \"homePath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"startPath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"appPath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"appFilePath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"logPath\"; type: \"string\" }\n        Property { name: \"confsPath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"tempPath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"backupsPath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"cameraPath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"appType\"; type: \"int\"; isReadonly: true }\n        Property { name: \"isDebug\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"globalFont\"; type: \"QFont\" }\n        Property { name: \"applicationName\"; type: \"string\" }\n        Property { name: \"applicationVersion\"; type: \"string\" }\n        Property { name: \"organizationName\"; type: \"string\" }\n        Property { name: \"organizationDomain\"; type: \"string\" }\n        Property { name: \"applicationAbout\"; type: \"string\" }\n        Property { name: \"qpaNoTextHandles\"; type: \"bool\" }\n        Property { name: \"windowIcon\"; type: \"QUrl\" }\n        Property { name: \"applicationState\"; type: \"int\"; isReadonly: true }\n        Property { name: \"applicationDisplayName\"; type: \"string\" }\n        Property { name: \"platformName\"; type: \"string\"; isReadonly: true }\n        Property { name: \"quitOnLastWindowClosed\"; type: \"bool\" }\n        Signal { name: \"fakeSignal\" }\n        Signal { name: \"globalFontFamilyChanged\" }\n        Signal { name: \"globalMonoFontFamilyChanged\" }\n        Signal { name: \"languageUpdated\" }\n        Signal { name: \"backRequest\" }\n        Signal { name: \"clickedOnDock\" }\n        Signal { name: \"lastWindowClosed\" }\n        Method { name: \"refreshTranslations\" }\n        Method { name: \"back\" }\n        Method { name: \"exec\"; type: \"int\" }\n        Method {\n            name: \"exit\"\n            Parameter { name: \"retcode\"; type: \"int\" }\n        }\n        Method { name: \"exit\" }\n        Method {\n            name: \"sleep\"\n            Parameter { name: \"ms\"; type: \"qulonglong\" }\n        }\n        Method {\n            name: \"setSetting\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"readSetting\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"defaultValue\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"readSetting\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanApplicationItem\"\n        defaultProperty: \"items\"\n        prototype: \"AsemanApplication\"\n        exports: [\"AsemanQml.Base/AsemanApplicationBase 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"StatusBarStyles\"\n            values: {\n                \"StatusBarStyleLight\": 0,\n                \"StatusBarStyleDark\": 1,\n                \"StatusBarStyleAuto\": 2\n            }\n        }\n        Property { name: \"proxy\"; type: \"AsemanNetworkProxy\"; isPointer: true }\n        Property { name: \"applicationId\"; type: \"string\" }\n        Property { name: \"isRunning\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"statusBarStyle.qml\"; type: \"int\" }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Signal {\n            name: \"messageReceived\"\n            Parameter { name: \"msg\"; type: \"string\" }\n        }\n        Method {\n            name: \"sendMessage\"\n            Parameter { name: \"msg\"; type: \"string\" }\n        }\n        Method {\n            name: \"checkPermissions\"\n            type: \"bool\"\n            Parameter { name: \"persmission\"; type: \"string\" }\n        }\n        Method {\n            name: \"requestPermissions\"\n            type: \"QVariantMap\"\n            Parameter { name: \"persmissions\"; type: \"QStringList\" }\n            Parameter { name: \"callback\"; type: \"QJSValue\" }\n        }\n    }\n    Component {\n        name: \"AsemanApplicationSingleton\"\n        defaultProperty: \"items\"\n        prototype: \"AsemanApplicationItem\"\n        exports: [\"AsemanQml.Base/AsemanApp 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n    }\n    Component {\n        name: \"AsemanAutoStartManager\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/AutoStartManager 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"command\"; type: \"string\" }\n        Property { name: \"comment\"; type: \"string\" }\n        Property { name: \"source\"; type: \"string\" }\n        Property { name: \"name\"; type: \"string\" }\n        Property { name: \"type\"; type: \"string\" }\n        Property { name: \"active\"; type: \"bool\" }\n        Method { name: \"refresh\" }\n        Method { name: \"save\" }\n    }\n    Component {\n        name: \"AsemanBackHandler\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/BackHandler 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Property { name: \"topHandlerObject\"; type: \"QObject\"; isReadonly: true; isPointer: true }\n        Property { name: \"topHandlerMethod\"; type: \"QJSValue\"; isReadonly: true }\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Signal { name: \"topHandlerChanged\" }\n        Signal { name: \"backFinished\" }\n        Method {\n            name: \"pushHandler\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"jsv\"; type: \"QJSValue\" }\n        }\n        Method {\n            name: \"pushDownHandler\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"jsv\"; type: \"QJSValue\" }\n        }\n        Method {\n            name: \"removeHandler\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n        }\n        Method { name: \"tryPopHandler\"; type: \"QObject*\" }\n        Method { name: \"forcePopHandler\"; type: \"QObject*\" }\n        Method { name: \"clear\" }\n        Method { name: \"back\"; type: \"bool\" }\n    }\n    Component {\n        name: \"AsemanCalendarConverter\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/CalendarConv 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Property { name: \"calendar\"; type: \"int\" }\n        Property { name: \"calendarIDs\"; type: \"QStringList\"; isReadonly: true }\n        Property { name: \"currentDays\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentYear\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentMonth\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentDay\"; type: \"int\"; isReadonly: true }\n        Signal { name: \"fakeSignal\" }\n        Method {\n            name: \"calendarName\"\n            type: \"string\"\n            Parameter { name: \"t\"; type: \"int\" }\n        }\n        Method {\n            name: \"convertIntToStringDate\"\n            type: \"string\"\n            Parameter { name: \"d\"; type: \"qlonglong\" }\n        }\n        Method {\n            name: \"convertIntToFullStringDate\"\n            type: \"string\"\n            Parameter { name: \"d\"; type: \"qlonglong\" }\n        }\n        Method {\n            name: \"convertIntToNumStringDate\"\n            type: \"string\"\n            Parameter { name: \"d\"; type: \"qlonglong\" }\n        }\n        Method {\n            name: \"translateInt\"\n            type: \"string\"\n            Parameter { name: \"d\"; type: \"qlonglong\" }\n        }\n        Method {\n            name: \"convertIntToStringDate\"\n            type: \"string\"\n            Parameter { name: \"d\"; type: \"qlonglong\" }\n            Parameter { name: \"format\"; type: \"string\" }\n        }\n        Method {\n            name: \"convertDateToGragorian\"\n            type: \"QDate\"\n            Parameter { name: \"year\"; type: \"qlonglong\" }\n            Parameter { name: \"month\"; type: \"int\" }\n            Parameter { name: \"day\"; type: \"int\" }\n        }\n        Method {\n            name: \"fromMSecSinceEpoch\"\n            type: \"string\"\n            Parameter { name: \"t\"; type: \"qlonglong\" }\n        }\n        Method {\n            name: \"convertDateTimeToString\"\n            type: \"string\"\n            Parameter { name: \"dt\"; type: \"QDateTime\" }\n        }\n        Method {\n            name: \"convertDateTimeToString\"\n            type: \"string\"\n            Parameter { name: \"dt\"; type: \"QDateTime\" }\n            Parameter { name: \"format\"; type: \"string\" }\n        }\n        Method {\n            name: \"convertDateTimeToLittleString\"\n            type: \"string\"\n            Parameter { name: \"dt\"; type: \"QDate\" }\n        }\n        Method {\n            name: \"daysOfMonth\"\n            type: \"int\"\n            Parameter { name: \"year\"; type: \"qlonglong\" }\n            Parameter { name: \"month\"; type: \"int\" }\n        }\n        Method {\n            name: \"monthName\"\n            type: \"string\"\n            Parameter { name: \"month\"; type: \"int\" }\n        }\n        Method {\n            name: \"combineDateAndTime\"\n            type: \"QDateTime\"\n            Parameter { name: \"date\"; type: \"QDate\" }\n            Parameter { name: \"time\"; type: \"QTime\" }\n        }\n        Method {\n            name: \"dateMonth\"\n            type: \"int\"\n            Parameter { name: \"date\"; type: \"QDate\" }\n        }\n        Method {\n            name: \"dateDay\"\n            type: \"int\"\n            Parameter { name: \"date\"; type: \"QDate\" }\n        }\n        Method {\n            name: \"dateYear\"\n            type: \"qlonglong\"\n            Parameter { name: \"date\"; type: \"QDate\" }\n        }\n        Method {\n            name: \"convertDaysToDate\"\n            type: \"QDate\"\n            Parameter { name: \"days\"; type: \"int\" }\n        }\n        Method {\n            name: \"convertDateToDays\"\n            type: \"int\"\n            Parameter { name: \"date\"; type: \"QDate\" }\n        }\n        Method {\n            name: \"fromTime_t\"\n            type: \"QDateTime\"\n            Parameter { name: \"sec\"; type: \"uint\" }\n        }\n    }\n    Component {\n        name: \"AsemanDelegateSwitch\"\n        defaultProperty: \"components\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Base/DelegateSwitch 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"components\"; type: \"QQmlComponent\"; isList: true; isReadonly: true }\n        Property { name: \"current\"; type: \"int\" }\n        Property { name: \"item\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n    }\n    Component {\n        name: \"AsemanDesktopTools\"\n        prototype: \"QObject\"\n        exports: [\n            \"AsemanQml.Base/AsemanDesktopTools 2.0\",\n            \"AsemanQml.Base/Desktop 2.0\"\n        ]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0, 0]\n        Enum {\n            name: \"DesktopSession\"\n            values: {\n                \"Unknown\": 0,\n                \"Gnome\": 1,\n                \"GnomeFallBack\": 2,\n                \"Unity\": 3,\n                \"Kde\": 4,\n                \"Plasma\": 5,\n                \"Windows\": 6,\n                \"Mac\": 7\n            }\n        }\n        Enum {\n            name: \"YesOrNoType\"\n            values: {\n                \"Warning\": 0,\n                \"Question\": 1,\n                \"Information\": 2,\n                \"Critical\": 3\n            }\n        }\n        Property { name: \"titleBarColor\"; type: \"QColor\"; isReadonly: true }\n        Property { name: \"titleBarTransparentColor\"; type: \"QColor\"; isReadonly: true }\n        Property { name: \"titleBarTextColor\"; type: \"QColor\"; isReadonly: true }\n        Property { name: \"titleBarIsDark\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"desktopSession\"; type: \"int\"; isReadonly: true }\n        Property { name: \"fontFamilies\"; type: \"QStringList\"; isReadonly: true }\n        Property { name: \"menuStyle.qml\"; type: \"string\" }\n        Property { name: \"currentMenuObject\"; type: \"QObject\"; isReadonly: true; isPointer: true }\n        Property { name: \"tooltip\"; type: \"string\" }\n        Signal { name: \"fakeSignal\" }\n        Method {\n            name: \"getOpenFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"filter\"; type: \"string\" }\n            Parameter { name: \"startPath\"; type: \"string\" }\n        }\n        Method {\n            name: \"getOpenFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"filter\"; type: \"string\" }\n        }\n        Method {\n            name: \"getOpenFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n        }\n        Method {\n            name: \"getOpenFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        }\n        Method { name: \"getOpenFileName\"; type: \"string\" }\n        Method {\n            name: \"getOpenFileNames\"\n            type: \"QStringList\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"filter\"; type: \"string\" }\n            Parameter { name: \"startPath\"; type: \"string\" }\n        }\n        Method {\n            name: \"getOpenFileNames\"\n            type: \"QStringList\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"filter\"; type: \"string\" }\n        }\n        Method {\n            name: \"getOpenFileNames\"\n            type: \"QStringList\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n        }\n        Method {\n            name: \"getOpenFileNames\"\n            type: \"QStringList\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        }\n        Method { name: \"getOpenFileNames\"; type: \"QStringList\" }\n        Method {\n            name: \"getSaveFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"filter\"; type: \"string\" }\n            Parameter { name: \"startPath\"; type: \"string\" }\n        }\n        Method {\n            name: \"getSaveFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"filter\"; type: \"string\" }\n        }\n        Method {\n            name: \"getSaveFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n        }\n        Method {\n            name: \"getSaveFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        }\n        Method { name: \"getSaveFileName\"; type: \"string\" }\n        Method {\n            name: \"getExistingDirectory\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"startPath\"; type: \"string\" }\n        }\n        Method {\n            name: \"getExistingDirectory\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n        }\n        Method {\n            name: \"getExistingDirectory\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        }\n        Method { name: \"getExistingDirectory\"; type: \"string\" }\n        Method {\n            name: \"getFont\"\n            type: \"QFont\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"font\"; type: \"QFont\" }\n        }\n        Method {\n            name: \"getFont\"\n            type: \"QFont\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n        }\n        Method {\n            name: \"getFont\"\n            type: \"QFont\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        }\n        Method { name: \"getFont\"; type: \"QFont\" }\n        Method {\n            name: \"getColor\"\n            type: \"QColor\"\n            Parameter { name: \"color\"; type: \"QColor\" }\n        }\n        Method { name: \"getColor\"; type: \"QColor\" }\n        Method {\n            name: \"getText\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n            Parameter { name: \"defaultText\"; type: \"string\" }\n        }\n        Method {\n            name: \"getText\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n        }\n        Method {\n            name: \"getText\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n        }\n        Method {\n            name: \"getText\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        }\n        Method { name: \"getText\"; type: \"string\" }\n        Method {\n            name: \"showMenu\"\n            type: \"int\"\n            Parameter { name: \"actions\"; type: \"QVariantList\" }\n            Parameter { name: \"point\"; type: \"QPoint\" }\n        }\n        Method {\n            name: \"showMenu\"\n            type: \"int\"\n            Parameter { name: \"actions\"; type: \"QVariantList\" }\n        }\n        Method {\n            name: \"yesOrNo\"\n            type: \"bool\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"int\" }\n        }\n        Method {\n            name: \"yesOrNo\"\n            type: \"bool\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n        }\n        Method {\n            name: \"showMessage\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"int\" }\n        }\n        Method {\n            name: \"showMessage\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanDevices\"\n        prototype: \"QObject\"\n        Property { name: \"isMobile\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isTablet\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isLargeTablet\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isTouchDevice\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isDesktop\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isMacX\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isWindows\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isWindows8\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isLinux\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isAndroid\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isIOS\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isUbuntuTouch\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isWindowsPhone\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"screen\"; type: \"QObject\"; isReadonly: true; isPointer: true }\n        Property { name: \"cameraIsAvailable\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"lcdPhysicalSize\"; type: \"double\"; isReadonly: true }\n        Property { name: \"lcdPhysicalWidth\"; type: \"double\"; isReadonly: true }\n        Property { name: \"lcdPhysicalHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"lcdDpiX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"lcdDpiY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"platformVersion\"; type: \"string\"; isReadonly: true }\n        Property { name: \"platformType\"; type: \"string\"; isReadonly: true }\n        Property { name: \"platformName\"; type: \"string\"; isReadonly: true }\n        Property { name: \"platformKernel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"platformKernelVersion\"; type: \"string\"; isReadonly: true }\n        Property { name: \"platformCpuArchitecture\"; type: \"string\"; isReadonly: true }\n        Property { name: \"screenSize\"; type: \"QSize\"; isReadonly: true }\n        Property { name: \"keyboardHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"localFilesPrePath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"densityDpi\"; type: \"int\"; isReadonly: true }\n        Property { name: \"density\"; type: \"double\"; isReadonly: true }\n        Property { name: \"deviceDensity\"; type: \"double\"; isReadonly: true }\n        Property { name: \"fontDensity\"; type: \"double\"; isReadonly: true }\n        Property { name: \"transparentStatusBar\"; type: \"bool\" }\n        Property { name: \"transparentNavigationBar\"; type: \"bool\" }\n        Property { name: \"standardTitleBarHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"statusBarHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"navigationBarHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"clipboard\"; type: \"string\" }\n        Property { name: \"clipboardUrl\"; type: \"QList<QUrl>\" }\n        Property { name: \"keyboard\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"cameraLocation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"picturesLocation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"musicsLocation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"documentsLocation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"downloadsLocation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"resourcePath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"libsPath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"deviceName\"; type: \"string\"; isReadonly: true }\n        Property { name: \"deviceId\"; type: \"string\"; isReadonly: true }\n        Property { name: \"deviceShortId\"; type: \"string\"; isReadonly: true }\n        Property { name: \"qtVersion\"; type: \"string\"; isReadonly: true }\n        Property { name: \"qtMajorVersion\"; type: \"double\"; isReadonly: true }\n        Property { name: \"fontScale\"; type: \"double\" }\n        Property { name: \"deviceDetails\"; type: \"QVariantMap\"; isReadonly: true }\n        Signal {\n            name: \"incomingShare\"\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"msg\"; type: \"string\" }\n        }\n        Signal {\n            name: \"incomingImage\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Signal {\n            name: \"selectImageResult\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Signal { name: \"activityPaused\" }\n        Signal { name: \"activityResumed\" }\n        Signal { name: \"platformChanged\" }\n        Signal { name: \"geometryChanged\" }\n        Method { name: \"hideKeyboard\" }\n        Method { name: \"showKeyboard\" }\n        Method { name: \"triggerVibrateFeedback\" }\n        Method {\n            name: \"share\"\n            Parameter { name: \"subject\"; type: \"string\" }\n            Parameter { name: \"message\"; type: \"string\" }\n        }\n        Method {\n            name: \"openFile\"\n            type: \"bool\"\n            Parameter { name: \"address\"; type: \"string\" }\n        }\n        Method {\n            name: \"shareFile\"\n            type: \"bool\"\n            Parameter { name: \"address\"; type: \"string\" }\n        }\n        Method {\n            name: \"callNumber\"\n            Parameter { name: \"number\"; type: \"string\" }\n        }\n        Method {\n            name: \"setClipboard\"\n            Parameter { name: \"text\"; type: \"string\" }\n        }\n        Method {\n            name: \"setClipboardData\"\n            Parameter { name: \"mime\"; type: \"AsemanMimeData\"; isPointer: true }\n        }\n        Method {\n            name: \"getLastImages\"\n            type: \"QStringList\"\n            Parameter { name: \"offset\"; type: \"int\" }\n            Parameter { name: \"count\"; type: \"int\" }\n        }\n        Method {\n            name: \"setupImEventFilter\"\n            Parameter { name: \"object\"; type: \"QObject\"; isPointer: true }\n        }\n        Method {\n            name: \"setupWindowColor\"\n            Parameter { name: \"color\"; type: \"QColor\" }\n        }\n        Method { name: \"startCameraPicture\"; type: \"string\" }\n        Method { name: \"getOpenPictures\"; type: \"bool\" }\n        Method {\n            name: \"setFlag\"\n            Parameter { name: \"flag\"; type: \"int\" }\n            Parameter { name: \"state\"; type: \"bool\" }\n        }\n        Method {\n            name: \"setFlag\"\n            Parameter { name: \"flag\"; type: \"int\" }\n        }\n        Method {\n            name: \"flag\"\n            type: \"bool\"\n            Parameter { name: \"flag\"; type: \"int\" }\n        }\n    }\n    Component {\n        name: \"AsemanDevicesItem\"\n        prototype: \"AsemanDevices\"\n        exports: [\"AsemanQml.Base/Devices 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Signal {\n            name: \"incomingImage\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Signal {\n            name: \"selectImageResult\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method { name: \"getOpenPictures\"; type: \"bool\" }\n        Method {\n            name: \"getContactList\"\n            type: \"QVariantList\"\n            Parameter { name: \"asyncCallback\"; type: \"QJSValue\" }\n        }\n        Method {\n            name: \"saveToGallery\"\n            type: \"bool\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanDownloader\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/Downloader 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"recievedBytes\"; type: \"qlonglong\"; isReadonly: true }\n        Property { name: \"totalBytes\"; type: \"qlonglong\"; isReadonly: true }\n        Property { name: \"destination\"; type: \"string\" }\n        Property { name: \"path\"; type: \"string\" }\n        Property { name: \"downloaderId\"; type: \"int\" }\n        Property { name: \"ignoreSslErrors\"; type: \"bool\" }\n        Property { name: \"downloading\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"header\"; type: \"QVariantMap\" }\n        Signal {\n            name: \"error\"\n            Parameter { name: \"error\"; type: \"QStringList\" }\n        }\n        Signal {\n            name: \"finished\"\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n        Signal {\n            name: \"finishedWithId\"\n            Parameter { name: \"id\"; type: \"int\" }\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n        Signal { name: \"failed\" }\n        Method { name: \"start\" }\n        Method { name: \"stop\" }\n    }\n    Component {\n        name: \"AsemanDragArea\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Base/MouseDragArea 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"orientation\"; type: \"int\" }\n        Property { name: \"minimum\"; type: \"int\" }\n        Property { name: \"mouseX\"; type: \"int\"; isReadonly: true }\n        Property { name: \"mouseY\"; type: \"int\"; isReadonly: true }\n        Signal { name: \"positionChanged\" }\n        Signal { name: \"pressed\" }\n        Signal { name: \"released\" }\n    }\n    Component {\n        name: \"AsemanDragObject\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/DragObject 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"mimeData\"; type: \"AsemanMimeData\"; isPointer: true }\n        Property { name: \"dropAction\"; type: \"int\" }\n        Property { name: \"source\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"image\"; type: \"QUrl\" }\n        Property { name: \"hotSpot\"; type: \"QPoint\" }\n        Property { name: \"imageData\"; type: \"QImage\" }\n        Property { name: \"dragging\"; type: \"bool\"; isReadonly: true }\n        Method { name: \"start\"; type: \"int\" }\n    }\n    Component {\n        name: \"AsemanEncrypter\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/Encrypter 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"key\"; type: \"string\" }\n        Method {\n            name: \"encrypt\"\n            type: \"QByteArray\"\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n        Method {\n            name: \"decrypt\"\n            type: \"QByteArray\"\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n    }\n    Component {\n        name: \"AsemanFileDownloaderQueue\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/FileDownloaderQueue 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"capacity\"; type: \"int\" }\n        Property { name: \"destination\"; type: \"string\" }\n        Signal {\n            name: \"finished\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n        }\n        Signal {\n            name: \"progressChanged\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n            Parameter { name: \"percent\"; type: \"double\" }\n        }\n        Method {\n            name: \"download\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n            Parameter { name: \"header\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"download\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanFileDownloaderQueueItem\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/FileDownloaderQueueItem 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"source\"; type: \"string\" }\n        Property { name: \"fileName\"; type: \"string\" }\n        Property { name: \"header\"; type: \"QVariantMap\" }\n        Property { name: \"ignoreSslErrors\"; type: \"bool\" }\n        Property { name: \"percent\"; type: \"double\"; isReadonly: true }\n        Property { name: \"downloaderQueue\"; type: \"AsemanFileDownloaderQueue\"; isPointer: true }\n        Property { name: \"result\"; type: \"string\"; isReadonly: true }\n    }\n    Component {\n        name: \"AsemanFileResourceManager\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/FileResourceManager 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"root\"; type: \"string\" }\n        Method {\n            name: \"insert\"\n            Parameter { name: \"file\"; type: \"string\" }\n            Parameter { name: \"callback\"; type: \"QJSValue\" }\n        }\n        Method {\n            name: \"remove\"\n            type: \"bool\"\n            Parameter { name: \"id\"; type: \"string\" }\n        }\n        Method {\n            name: \"get\"\n            type: \"string\"\n            Parameter { name: \"id\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanGlobalTranslations\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/Translations 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Property { name: \"refresher\"; type: \"string\"; isReadonly: true }\n        Signal { name: \"refreshed\" }\n    }\n    Component {\n        name: \"AsemanHashObject\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/HashObject 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"values\"; type: \"QVariantList\"; isReadonly: true }\n        Property { name: \"keys\"; type: \"QStringList\"; isReadonly: true }\n        Method {\n            name: \"insert\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"insertMulti\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"remove\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"remove\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"key\"\n            type: \"QVariant\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"keys\"\n            type: \"QStringList\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method { name: \"uniqueKeys\"; type: \"QStringList\" }\n        Method { name: \"keys\"; type: \"QStringList\" }\n        Method {\n            name: \"value\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"values\"\n            type: \"QVariantList\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"contains\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"contains\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method { name: \"clear\" }\n        Method { name: \"count\"; type: \"int\" }\n        Method { name: \"toMap\"; type: \"QVariantMap\" }\n    }\n    Component {\n        name: \"AsemanHostChecker\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/HostChecker 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"host\"; type: \"string\" }\n        Property { name: \"port\"; type: \"int\" }\n        Property { name: \"interval\"; type: \"int\" }\n        Property { name: \"available\"; type: \"bool\"; isReadonly: true }\n    }\n    Component {\n        name: \"AsemanImageColorAnalizor\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/ImageColorAnalizor 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"Method\"\n            values: {\n                \"Normal\": 0,\n                \"MoreSaturation\": 1\n            }\n        }\n        Property { name: \"source\"; type: \"QUrl\" }\n        Property { name: \"color\"; type: \"QColor\"; isReadonly: true }\n        Property { name: \"method\"; type: \"int\" }\n    }\n    Component {\n        name: \"AsemanItemGrabber\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/ItemGrabber 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"item\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"suffix\"; type: \"string\" }\n        Property { name: \"fileName\"; type: \"string\" }\n        Signal {\n            name: \"saved\"\n            Parameter { name: \"dest\"; type: \"string\" }\n        }\n        Signal { name: \"failed\" }\n        Method {\n            name: \"save\"\n            Parameter { name: \"dest\"; type: \"string\" }\n            Parameter { name: \"size\"; type: \"QSize\" }\n        }\n    }\n    Component {\n        name: \"AsemanKeyHandler\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/KeyHandler 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"window\"; type: \"QObject\"; isPointer: true }\n        Property { name: \"modifiers\"; type: \"int\"; isReadonly: true }\n        Property { name: \"scanCode\"; type: \"int\" }\n        Property { name: \"key\"; type: \"int\" }\n        Signal {\n            name: \"pressed\"\n            Parameter { name: \"modifiers\"; type: \"int\" }\n            Parameter { name: \"key\"; type: \"int\" }\n            Parameter { name: \"scanCode\"; type: \"int\" }\n        }\n        Signal {\n            name: \"released\"\n            Parameter { name: \"modifiers\"; type: \"int\" }\n            Parameter { name: \"key\"; type: \"int\" }\n            Parameter { name: \"scanCode\"; type: \"int\" }\n        }\n    }\n    Component {\n        name: \"AsemanListObject\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/ListObject 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"list\"; type: \"QVariantList\" }\n        Method {\n            name: \"removeAll\"\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"removeOne\"\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"removeAt\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n        Method { name: \"takeLast\"; type: \"QVariant\" }\n        Method { name: \"takeFirst\"; type: \"QVariant\" }\n        Method {\n            name: \"takeAt\"\n            type: \"QVariant\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n        Method { name: \"clear\" }\n        Method { name: \"last\"; type: \"QVariant\" }\n        Method { name: \"first\"; type: \"QVariant\" }\n        Method {\n            name: \"insert\"\n            Parameter { name: \"index\"; type: \"int\" }\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"append\"\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"prepend\"\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"replace\"\n            Parameter { name: \"index\"; type: \"int\" }\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"swap\"\n            Parameter { name: \"idx0\"; type: \"int\" }\n            Parameter { name: \"idx1\"; type: \"int\" }\n        }\n        Method { name: \"count\"; type: \"int\" }\n        Method { name: \"isEmpty\"; type: \"bool\" }\n        Method {\n            name: \"at\"\n            type: \"QVariant\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n        Method {\n            name: \"indexOf\"\n            type: \"int\"\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"fromList\"\n            Parameter { name: \"list\"; type: \"QVariantList\" }\n        }\n        Method { name: \"toList\"; type: \"QVariantList\" }\n        Method {\n            name: \"contains\"\n            type: \"bool\"\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method { name: \"sort\" }\n    }\n    Component {\n        name: \"AsemanMapObject\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/MapObject 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"values\"; type: \"QVariantList\"; isReadonly: true }\n        Property { name: \"keys\"; type: \"QStringList\"; isReadonly: true }\n        Method {\n            name: \"insert\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"insertMulti\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"remove\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"remove\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"key\"\n            type: \"QVariant\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"keys\"\n            type: \"QStringList\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method { name: \"uniqueKeys\"; type: \"QStringList\" }\n        Method { name: \"keys\"; type: \"QStringList\" }\n        Method {\n            name: \"value\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"values\"\n            type: \"QVariantList\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"containt\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"containt\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"contains\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"contains\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method { name: \"clear\" }\n        Method { name: \"count\"; type: \"int\" }\n        Method { name: \"toMap\"; type: \"QVariantMap\" }\n    }\n    Component {\n        name: \"AsemanMimeApps\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/MimeApps 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Method {\n            name: \"openFiles\"\n            Parameter { name: \"app\"; type: \"string\" }\n            Parameter { name: \"files\"; type: \"QStringList\" }\n        }\n        Method {\n            name: \"appsOfMime\"\n            type: \"QStringList\"\n            Parameter { name: \"mime\"; type: \"string\" }\n        }\n        Method {\n            name: \"appsOfFile\"\n            type: \"QStringList\"\n            Parameter { name: \"file\"; type: \"string\" }\n        }\n        Method {\n            name: \"appName\"\n            type: \"string\"\n            Parameter { name: \"app\"; type: \"string\" }\n        }\n        Method {\n            name: \"appIcon\"\n            type: \"string\"\n            Parameter { name: \"app\"; type: \"string\" }\n        }\n        Method {\n            name: \"appGenericName\"\n            type: \"string\"\n            Parameter { name: \"app\"; type: \"string\" }\n        }\n        Method {\n            name: \"appComment\"\n            type: \"string\"\n            Parameter { name: \"app\"; type: \"string\" }\n        }\n        Method {\n            name: \"appPath\"\n            type: \"string\"\n            Parameter { name: \"app\"; type: \"string\" }\n        }\n        Method {\n            name: \"appCommand\"\n            type: \"string\"\n            Parameter { name: \"app\"; type: \"string\" }\n        }\n        Method {\n            name: \"appMimes\"\n            type: \"QStringList\"\n            Parameter { name: \"app\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanMimeData\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/MimeData 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"html\"; type: \"string\" }\n        Property { name: \"urls\"; type: \"QList<QUrl>\" }\n        Property { name: \"dataMap\"; type: \"QVariantMap\" }\n        Property { name: \"formats\"; type: \"QStringList\"; isReadonly: true }\n        Method { name: \"fetchClipboard\" }\n        Method {\n            name: \"getDataAsString\"\n            type: \"string\"\n            Parameter { name: \"type\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanMouseEventListener\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Base/MouseEventListener 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"mouseX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"mouseY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"mousePosition\"; type: \"QPointF\"; isReadonly: true }\n        Signal { name: \"mousePressed\" }\n        Signal { name: \"mouseReleased\" }\n        Method { name: \"ignoreEvent\" }\n        Method { name: \"acceptEvent\" }\n    }\n    Component {\n        name: \"AsemanNetworkManager\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/NetworkManager 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"defaultNetworkIdentifier\"; type: \"string\"; isReadonly: true }\n        Property { name: \"configurations\"; type: \"QVariantMap\"; isReadonly: true }\n        Property {\n            name: \"defaultNetwork\"\n            type: \"AsemanNetworkManagerItem\"\n            isReadonly: true\n            isPointer: true\n        }\n        Property { name: \"interval\"; type: \"int\" }\n    }\n    Component {\n        name: \"AsemanNetworkManagerItem\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/NetworkManagerItem 2.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        Property { name: \"bearerType\"; type: \"int\"; isReadonly: true }\n        Property { name: \"bearerTypeFamily\"; type: \"int\"; isReadonly: true }\n        Property { name: \"bearerTypeName\"; type: \"string\"; isReadonly: true }\n        Property { name: \"children\"; type: \"QList<AsemanNetworkManagerItem*>\"; isReadonly: true }\n        Property { name: \"identifier\"; type: \"string\"; isReadonly: true }\n        Property { name: \"isRoamingAvailable\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isValid\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"name\"; type: \"string\"; isReadonly: true }\n        Property { name: \"purpose\"; type: \"int\"; isReadonly: true }\n        Property { name: \"state\"; type: \"int\"; isReadonly: true }\n        Property { name: \"type\"; type: \"int\"; isReadonly: true }\n    }\n    Component {\n        name: \"AsemanNetworkProxy\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/NetworkProxy 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"ProxyType\"\n            values: {\n                \"DefaultProxy\": 0,\n                \"Socks5Proxy\": 1,\n                \"NoProxy\": 2,\n                \"HttpProxy\": 3,\n                \"HttpCachingProxy\": 4,\n                \"FtpCachingProxy\": 5\n            }\n        }\n        Property { name: \"type\"; type: \"int\" }\n        Property { name: \"hostName\"; type: \"string\" }\n        Property { name: \"port\"; type: \"int\" }\n        Property { name: \"user\"; type: \"string\" }\n        Property { name: \"password\"; type: \"string\" }\n    }\n    Component {\n        name: \"AsemanNetworkSleepManager\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/NetworkSleepManager 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"host\"; type: \"string\" }\n        Property { name: \"port\"; type: \"int\" }\n        Property { name: \"interval\"; type: \"int\" }\n        Property { name: \"networkManager\"; type: \"bool\" }\n        Property { name: \"available\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"wake\" }\n        Signal { name: \"sleep\" }\n    }\n    Component {\n        name: \"AsemanProcess\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/Process 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"arguments\"; type: \"QStringList\" }\n        Property { name: \"command\"; type: \"string\" }\n        Property { name: \"running\"; type: \"bool\"; isReadonly: true }\n        Signal {\n            name: \"standardOutput\"\n            Parameter { name: \"output\"; type: \"string\" }\n        }\n        Signal {\n            name: \"errorOutput\"\n            Parameter { name: \"output\"; type: \"string\" }\n        }\n        Method { name: \"start\" }\n        Method { name: \"terminate\" }\n    }\n    Component {\n        name: \"AsemanProxyComponent\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/ProxyComponent 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"source\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"object\"; type: \"QObject\"; isReadonly: true; isPointer: true }\n    }\n    Component {\n        name: \"AsemanQmlImage\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickPaintedItem\"\n        exports: [\"AsemanQml.Base/AsemanImage 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"FillMode\"\n            values: {\n                \"Stretch\": 0,\n                \"PreserveAspectFit\": 1,\n                \"PreserveAspectCrop\": 2,\n                \"Tile\": 3\n            }\n        }\n        Property { name: \"source\"; type: \"QUrl\" }\n        Property { name: \"fillMode\"; type: \"int\" }\n        Property { name: \"asynchronous\"; type: \"bool\" }\n        Property { name: \"autoTransform\"; type: \"bool\" }\n        Property { name: \"cache\"; type: \"bool\" }\n        Property { name: \"horizontalAlignment\"; type: \"int\" }\n        Property { name: \"verticalAlignment\"; type: \"int\" }\n        Property { name: \"mipmap\"; type: \"bool\" }\n        Property { name: \"mirror\"; type: \"bool\" }\n        Property { name: \"paintedWidth\"; type: \"double\"; isReadonly: true }\n        Property { name: \"paintedHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"progress\"; type: \"double\"; isReadonly: true }\n        Property { name: \"smooth\"; type: \"bool\" }\n        Property { name: \"sourceSize\"; type: \"QSize\"; isReadonly: true }\n        Signal { name: \"paintedSizeChanged\" }\n        Method { name: \"refresh\" }\n    }\n    Component {\n        name: \"AsemanQtLogger\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/Logger 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Property { name: \"path\"; type: \"string\"; isReadonly: true }\n        Method {\n            name: \"debug\"\n            Parameter { name: \"var\"; type: \"QVariant\" }\n        }\n        Method { name: \"start\" }\n    }\n    Component {\n        name: \"AsemanQuickObject\"\n        defaultProperty: \"items\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/AsemanObject 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        name: \"AsemanQuickViewWrapper\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/View 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Property { name: \"reverseScroll\"; type: \"bool\" }\n        Property { name: \"statusBarHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"navigationBarHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"root\"; type: \"QObject\"; isPointer: true }\n        Property { name: \"focusedText\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"offlineStoragePath\"; type: \"string\" }\n        Property { name: \"flickVelocity\"; type: \"double\"; isReadonly: true }\n        Property { name: \"window\"; type: \"QWindow\"; isReadonly: true; isPointer: true }\n        Signal { name: \"fullscreenChanged\" }\n        Signal { name: \"backControllerChanged\" }\n        Signal { name: \"fakeSignal\" }\n        Signal { name: \"closeRequest\" }\n        Method { name: \"discardFocusedText\" }\n        Method {\n            name: \"registerWindow\"\n            Parameter { name: \"window\"; type: \"QQuickWindow\"; isPointer: true }\n        }\n    }\n    Component {\n        name: \"AsemanSettings\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/Settings 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"category\"; type: \"string\" }\n        Property { name: \"source\"; type: \"string\" }\n        Signal { name: \"valueChanged\" }\n        Method {\n            name: \"setValue\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"value\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"defaultValue\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"value\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"remove\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method { name: \"keys\"; type: \"QStringList\" }\n    }\n    Component {\n        name: \"AsemanSystemTray\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/SystemTray 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"ActivateReason\"\n            values: {\n                \"ActivateUnknown\": 0,\n                \"ActivateContext\": 1,\n                \"ActivateDoubleClick\": 2,\n                \"ActivateTrigger\": 3,\n                \"ActivateMiddleClick\": 4\n            }\n        }\n        Property { name: \"visible\"; type: \"bool\" }\n        Property { name: \"icon\"; type: \"QUrl\" }\n        Property { name: \"badgeCount\"; type: \"int\" }\n        Property { name: \"badgeFillColor\"; type: \"QColor\" }\n        Property { name: \"badgeStrokeColor\"; type: \"QColor\" }\n        Property { name: \"badgeTextColor\"; type: \"QColor\" }\n        Property { name: \"menu\"; type: \"QStringList\" }\n        Signal {\n            name: \"activated\"\n            Parameter { name: \"reason\"; type: \"int\" }\n        }\n        Signal {\n            name: \"menuTriggered\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n    }\n    Component {\n        name: \"AsemanTextTools\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/TextTools 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Method {\n            name: \"htmlWidth\"\n            type: \"double\"\n            Parameter { name: \"html\"; type: \"string\" }\n        }\n        Method {\n            name: \"directionOf\"\n            type: \"Qt::LayoutDirection\"\n            Parameter { name: \"str\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanTitleBarColorGrabber\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/TitleBarColorGrabber 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        Property { name: \"autoRefresh\"; type: \"bool\" }\n        Property { name: \"defaultColor\"; type: \"QColor\" }\n        Property { name: \"color\"; type: \"QColor\"; isReadonly: true }\n        Method { name: \"refresh\" }\n    }\n    Component {\n        name: \"AsemanTools\"\n        prototype: \"QObject\"\n        Enum {\n            name: \"HashMethod\"\n            values: {\n                \"Md5\": 0,\n                \"Sha224\": 1,\n                \"Sha256\": 2,\n                \"Sha384\": 3,\n                \"Sha512\": 4,\n                \"Sha3_224\": 5,\n                \"Sha3_256\": 6,\n                \"Sha3_384\": 7,\n                \"Sha3_512\": 8\n            }\n        }\n        Method {\n            name: \"debug\"\n            Parameter { name: \"var\"; type: \"QVariant\" }\n        }\n        Method { name: \"currentDate\"; type: \"QDateTime\" }\n        Method {\n            name: \"dateToMSec\"\n            type: \"string\"\n            Parameter { name: \"dt\"; type: \"QDateTime\" }\n        }\n        Method {\n            name: \"mSecToDate\"\n            type: \"QDateTime\"\n            Parameter { name: \"ms\"; type: \"string\" }\n        }\n        Method {\n            name: \"dateToSec\"\n            type: \"qlonglong\"\n            Parameter { name: \"dt\"; type: \"QDateTime\" }\n        }\n        Method {\n            name: \"dateFromSec\"\n            type: \"QDateTime\"\n            Parameter { name: \"date\"; type: \"qlonglong\" }\n        }\n        Method {\n            name: \"daysToDate\"\n            type: \"QDateTime\"\n            Parameter { name: \"date\"; type: \"int\" }\n        }\n        Method {\n            name: \"dateToString\"\n            type: \"string\"\n            Parameter { name: \"dt\"; type: \"QDateTime\" }\n            Parameter { name: \"format\"; type: \"string\" }\n        }\n        Method {\n            name: \"dateToString\"\n            type: \"string\"\n            Parameter { name: \"dt\"; type: \"QDateTime\" }\n        }\n        Method {\n            name: \"datefromString\"\n            type: \"QDateTime\"\n            Parameter { name: \"dt\"; type: \"string\" }\n            Parameter { name: \"format\"; type: \"string\" }\n        }\n        Method {\n            name: \"datefromString\"\n            type: \"QDateTime\"\n            Parameter { name: \"dt\"; type: \"string\" }\n        }\n        Method {\n            name: \"msecToTimeString\"\n            type: \"string\"\n            Parameter { name: \"msec\"; type: \"int\" }\n            Parameter { name: \"format\"; type: \"string\" }\n        }\n        Method {\n            name: \"msecToTimeString\"\n            type: \"string\"\n            Parameter { name: \"msec\"; type: \"int\" }\n        }\n        Method {\n            name: \"dateAddDays\"\n            type: \"QDate\"\n            Parameter { name: \"date\"; type: \"QDate\" }\n            Parameter { name: \"days\"; type: \"int\" }\n        }\n        Method {\n            name: \"toStringList\"\n            type: \"QStringList\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"toVariantMap\"\n            type: \"QVariantMap\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"toVariantList\"\n            type: \"QVariantList\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"byteArrayToString\"\n            type: \"string\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"compress\"\n            type: \"QByteArray\"\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n            Parameter { name: \"level\"; type: \"int\" }\n        }\n        Method {\n            name: \"compress\"\n            type: \"QByteArray\"\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n        Method {\n            name: \"uncompress\"\n            type: \"QByteArray\"\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n        Method {\n            name: \"bytesToVariant\"\n            type: \"QVariant\"\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n        Method {\n            name: \"variantToBytes\"\n            type: \"QByteArray\"\n            Parameter { name: \"var\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"fileName\"\n            type: \"string\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"fileSuffix\"\n            type: \"string\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"fileMime\"\n            type: \"string\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"fileParent\"\n            type: \"string\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"fileSize\"\n            type: \"string\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"readText\"\n            type: \"string\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"writeText\"\n            type: \"bool\"\n            Parameter { name: \"path\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n        }\n        Method {\n            name: \"fileExists\"\n            type: \"bool\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"filesOf\"\n            type: \"QStringList\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"imageSize\"\n            type: \"QSize\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"writeFile\"\n            type: \"bool\"\n            Parameter { name: \"path\"; type: \"string\" }\n            Parameter { name: \"data\"; type: \"QVariant\" }\n            Parameter { name: \"compress\"; type: \"bool\" }\n        }\n        Method {\n            name: \"writeFile\"\n            type: \"bool\"\n            Parameter { name: \"path\"; type: \"string\" }\n            Parameter { name: \"data\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"readFile\"\n            type: \"QByteArray\"\n            Parameter { name: \"path\"; type: \"string\" }\n            Parameter { name: \"uncompress\"; type: \"bool\" }\n        }\n        Method {\n            name: \"readFile\"\n            type: \"QByteArray\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"className\"\n            type: \"string\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n        }\n        Method {\n            name: \"stringLinks\"\n            type: \"QStringList\"\n            Parameter { name: \"str\"; type: \"string\" }\n        }\n        Method {\n            name: \"stringRemove\"\n            type: \"string\"\n            Parameter { name: \"str\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n            Parameter { name: \"regExp\"; type: \"bool\" }\n        }\n        Method {\n            name: \"stringRemove\"\n            type: \"string\"\n            Parameter { name: \"str\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n        }\n        Method {\n            name: \"stringReplace\"\n            type: \"string\"\n            Parameter { name: \"str\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n            Parameter { name: \"replace\"; type: \"string\" }\n            Parameter { name: \"regExp\"; type: \"bool\" }\n        }\n        Method {\n            name: \"stringReplace\"\n            type: \"string\"\n            Parameter { name: \"str\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n            Parameter { name: \"replace\"; type: \"string\" }\n        }\n        Method {\n            name: \"stringRegExp\"\n            type: \"QVariantList\"\n            Parameter { name: \"str\"; type: \"string\" }\n            Parameter { name: \"regExp\"; type: \"string\" }\n            Parameter { name: \"minimal\"; type: \"bool\" }\n        }\n        Method {\n            name: \"stringRegExp\"\n            type: \"QVariantList\"\n            Parameter { name: \"str\"; type: \"string\" }\n            Parameter { name: \"regExp\"; type: \"string\" }\n        }\n        Method {\n            name: \"stringToUrl\"\n            type: \"QUrl\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"urlToLocalPath\"\n            type: \"string\"\n            Parameter { name: \"url\"; type: \"QUrl\" }\n        }\n        Method { name: \"qtVersion\"; type: \"string\" }\n        Method { name: \"aboutAseman\"; type: \"string\" }\n        Method {\n            name: \"deleteItemDelay\"\n            Parameter { name: \"o\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"ms\"; type: \"int\" }\n        }\n        Method {\n            name: \"colorHue\"\n            type: \"double\"\n            Parameter { name: \"clr\"; type: \"QColor\" }\n        }\n        Method {\n            name: \"colorLightness\"\n            type: \"double\"\n            Parameter { name: \"clr\"; type: \"QColor\" }\n        }\n        Method {\n            name: \"colorSaturation\"\n            type: \"double\"\n            Parameter { name: \"clr\"; type: \"QColor\" }\n        }\n        Method {\n            name: \"mkDir\"\n            Parameter { name: \"dir\"; type: \"string\" }\n        }\n        Method {\n            name: \"colorHsl\"\n            type: \"QVariantMap\"\n            Parameter { name: \"clr\"; type: \"QColor\" }\n        }\n        Method {\n            name: \"createVideoThumbnail\"\n            type: \"bool\"\n            Parameter { name: \"video\"; type: \"string\" }\n            Parameter { name: \"output\"; type: \"string\" }\n            Parameter { name: \"ffmpegPath\"; type: \"string\" }\n        }\n        Method {\n            name: \"createVideoThumbnail\"\n            type: \"bool\"\n            Parameter { name: \"video\"; type: \"string\" }\n            Parameter { name: \"output\"; type: \"string\" }\n        }\n        Method {\n            name: \"translateNumbers\"\n            type: \"string\"\n            Parameter { name: \"input\"; type: \"string\" }\n        }\n        Method {\n            name: \"trNums\"\n            type: \"string\"\n            Parameter { name: \"input\"; type: \"string\" }\n        }\n        Method {\n            name: \"passToMd5\"\n            type: \"string\"\n            Parameter { name: \"pass\"; type: \"string\" }\n        }\n        Method {\n            name: \"md5\"\n            type: \"string\"\n            Parameter { name: \"str\"; type: \"string\" }\n        }\n        Method {\n            name: \"passToHash\"\n            type: \"string\"\n            Parameter { name: \"pass\"; type: \"string\" }\n            Parameter { name: \"method\"; type: \"int\" }\n        }\n        Method {\n            name: \"hash\"\n            type: \"string\"\n            Parameter { name: \"str\"; type: \"string\" }\n            Parameter { name: \"method\"; type: \"int\" }\n        }\n        Method { name: \"createUuid\"; type: \"string\" }\n        Method {\n            name: \"htmlToPlaintText\"\n            type: \"string\"\n            Parameter { name: \"html\"; type: \"string\" }\n        }\n        Method {\n            name: \"copyDirectory\"\n            Parameter { name: \"src\"; type: \"string\" }\n            Parameter { name: \"dst\"; type: \"string\" }\n        }\n        Method {\n            name: \"copy\"\n            type: \"bool\"\n            Parameter { name: \"src\"; type: \"string\" }\n            Parameter { name: \"dst\"; type: \"string\" }\n        }\n        Method {\n            name: \"rename\"\n            type: \"bool\"\n            Parameter { name: \"src\"; type: \"string\" }\n            Parameter { name: \"dst\"; type: \"string\" }\n        }\n        Method {\n            name: \"deleteFile\"\n            Parameter { name: \"file\"; type: \"string\" }\n        }\n        Method {\n            name: \"clearDirectory\"\n            Parameter { name: \"dir\"; type: \"string\" }\n        }\n        Method {\n            name: \"decodeJwt\"\n            type: \"QVariantMap\"\n            Parameter { name: \"token\"; type: \"string\" }\n        }\n        Method {\n            name: \"setProperty\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"property\"; type: \"string\" }\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"property\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"property\"; type: \"string\" }\n        }\n        Method {\n            name: \"directionOf\"\n            type: \"Qt::LayoutDirection\"\n            Parameter { name: \"str\"; type: \"string\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n            Parameter { name: \"v3\"; type: \"QVariant\" }\n            Parameter { name: \"v4\"; type: \"QVariant\" }\n            Parameter { name: \"v5\"; type: \"QVariant\" }\n            Parameter { name: \"v6\"; type: \"QVariant\" }\n            Parameter { name: \"v7\"; type: \"QVariant\" }\n            Parameter { name: \"v8\"; type: \"QVariant\" }\n            Parameter { name: \"v9\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n            Parameter { name: \"v3\"; type: \"QVariant\" }\n            Parameter { name: \"v4\"; type: \"QVariant\" }\n            Parameter { name: \"v5\"; type: \"QVariant\" }\n            Parameter { name: \"v6\"; type: \"QVariant\" }\n            Parameter { name: \"v7\"; type: \"QVariant\" }\n            Parameter { name: \"v8\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n            Parameter { name: \"v3\"; type: \"QVariant\" }\n            Parameter { name: \"v4\"; type: \"QVariant\" }\n            Parameter { name: \"v5\"; type: \"QVariant\" }\n            Parameter { name: \"v6\"; type: \"QVariant\" }\n            Parameter { name: \"v7\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n            Parameter { name: \"v3\"; type: \"QVariant\" }\n            Parameter { name: \"v4\"; type: \"QVariant\" }\n            Parameter { name: \"v5\"; type: \"QVariant\" }\n            Parameter { name: \"v6\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n            Parameter { name: \"v3\"; type: \"QVariant\" }\n            Parameter { name: \"v4\"; type: \"QVariant\" }\n            Parameter { name: \"v5\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n            Parameter { name: \"v3\"; type: \"QVariant\" }\n            Parameter { name: \"v4\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n            Parameter { name: \"v3\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n        }\n    }\n    Component {\n        name: \"AsemanToolsItem\"\n        prototype: \"AsemanTools\"\n        exports: [\"AsemanQml.Base/Tools 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Method {\n            name: \"variantToJson\"\n            type: \"string\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n            Parameter { name: \"compact\"; type: \"bool\" }\n        }\n        Method {\n            name: \"variantToJson\"\n            type: \"string\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"jsonToVariant\"\n            type: \"QVariant\"\n            Parameter { name: \"json\"; type: \"string\" }\n        }\n        Method {\n            name: \"jsDelayCall\"\n            Parameter { name: \"ms\"; type: \"int\" }\n            Parameter { name: \"value\"; type: \"QJSValue\" }\n        }\n        Method {\n            name: \"imageResize\"\n            Parameter { name: \"path\"; type: \"string\" }\n            Parameter { name: \"size\"; type: \"QSize\" }\n            Parameter { name: \"dest\"; type: \"string\" }\n            Parameter { name: \"callback\"; type: \"QJSValue\" }\n        }\n        Method {\n            name: \"setInAppStoreProperty\"\n            Parameter { name: \"store\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"propertyName\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanTranslationManager\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/TranslationManager 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"sourceDirectory\"; type: \"QUrl\" }\n        Property { name: \"localeName\"; type: \"string\" }\n        Property { name: \"fileName\"; type: \"string\" }\n        Property { name: \"delimiters\"; type: \"string\" }\n        Property { name: \"refresher\"; type: \"string\"; isReadonly: true }\n        Property { name: \"textDirection\"; type: \"int\"; isReadonly: true }\n        Property { name: \"translations\"; type: \"QVariantMap\"; isReadonly: true }\n        Signal { name: \"refreshed\" }\n    }\n    Component {\n        name: \"AsemanWindowDetails\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/WindowDetails 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        Property { name: \"screen\"; type: \"QScreen\"; isReadonly: true; isPointer: true }\n    }\n    Component {\n        name: \"QScreen\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/Screen 2.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        Property { name: \"name\"; type: \"string\"; isReadonly: true }\n        Property { name: \"manufacturer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"model\"; type: \"string\"; isReadonly: true }\n        Property { name: \"serialNumber\"; type: \"string\"; isReadonly: true }\n        Property { name: \"depth\"; type: \"int\"; isReadonly: true }\n        Property { name: \"size\"; type: \"QSize\"; isReadonly: true }\n        Property { name: \"availableSize\"; type: \"QSize\"; isReadonly: true }\n        Property { name: \"virtualSize\"; type: \"QSize\"; isReadonly: true }\n        Property { name: \"availableVirtualSize\"; type: \"QSize\"; isReadonly: true }\n        Property { name: \"geometry\"; type: \"QRect\"; isReadonly: true }\n        Property { name: \"availableGeometry\"; type: \"QRect\"; isReadonly: true }\n        Property { name: \"virtualGeometry\"; type: \"QRect\"; isReadonly: true }\n        Property { name: \"availableVirtualGeometry\"; type: \"QRect\"; isReadonly: true }\n        Property { name: \"physicalSize\"; type: \"QSizeF\"; isReadonly: true }\n        Property { name: \"physicalDotsPerInchX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"physicalDotsPerInchY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"physicalDotsPerInch\"; type: \"double\"; isReadonly: true }\n        Property { name: \"logicalDotsPerInchX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"logicalDotsPerInchY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"logicalDotsPerInch\"; type: \"double\"; isReadonly: true }\n        Property { name: \"devicePixelRatio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"primaryOrientation\"; type: \"Qt::ScreenOrientation\"; isReadonly: true }\n        Property { name: \"orientation\"; type: \"Qt::ScreenOrientation\"; isReadonly: true }\n        Property { name: \"nativeOrientation\"; type: \"Qt::ScreenOrientation\"; isReadonly: true }\n        Property { name: \"refreshRate\"; type: \"double\"; isReadonly: true }\n        Signal {\n            name: \"geometryChanged\"\n            Parameter { name: \"geometry\"; type: \"QRect\" }\n        }\n        Signal {\n            name: \"availableGeometryChanged\"\n            Parameter { name: \"geometry\"; type: \"QRect\" }\n        }\n        Signal {\n            name: \"physicalSizeChanged\"\n            Parameter { name: \"size\"; type: \"QSizeF\" }\n        }\n        Signal {\n            name: \"physicalDotsPerInchChanged\"\n            Parameter { name: \"dpi\"; type: \"double\" }\n        }\n        Signal {\n            name: \"logicalDotsPerInchChanged\"\n            Parameter { name: \"dpi\"; type: \"double\" }\n        }\n        Signal {\n            name: \"virtualGeometryChanged\"\n            Parameter { name: \"rect\"; type: \"QRect\" }\n        }\n        Signal {\n            name: \"primaryOrientationChanged\"\n            Parameter { name: \"orientation\"; type: \"Qt::ScreenOrientation\" }\n        }\n        Signal {\n            name: \"orientationChanged\"\n            Parameter { name: \"orientation\"; type: \"Qt::ScreenOrientation\" }\n        }\n        Signal {\n            name: \"refreshRateChanged\"\n            Parameter { name: \"refreshRate\"; type: \"double\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickFlickable\"\n        name: \"AsemanQml.Base/AsemanFlickable 2.0\"\n        exports: [\"AsemanQml.Base/AsemanFlickable 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"flickableData\"\n        Property { name: \"allTimeMode\"; type: \"bool\" }\n        Property { name: \"tabBarRatio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"tabBarHeight\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"QQuickGridView\"\n        name: \"AsemanQml.Base/AsemanGridView 2.0\"\n        exports: [\"AsemanQml.Base/AsemanGridView 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"tabBarRatio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"tabBarHeight\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"QQuickListView\"\n        name: \"AsemanQml.Base/AsemanListView 2.0\"\n        exports: [\"AsemanQml.Base/AsemanListView 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"allTimeMode\"; type: \"bool\" }\n        Property { name: \"tabBarRatio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"tabBarHeight\"; type: \"double\" }\n        Property { name: \"tabBarMargin\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"AsemanQuickObject\"\n        name: \"AsemanQml.Base/BackAction 2.0\"\n        exports: [\"AsemanQml.Base/BackAction 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"active\"; type: \"bool\" }\n        Property { name: \"callback\"; type: \"QVariant\" }\n        Property { name: \"disableBack\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Base/CachedImage 2.0\"\n        exports: [\"AsemanQml.Base/CachedImage 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"cachedSource\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fileName\"; type: \"string\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"source\"; type: \"string\" }\n        Property { name: \"header\"; type: \"QVariantMap\" }\n        Property { name: \"percent\"; type: \"double\"; isReadonly: true }\n        Property { name: \"fillMode\"; type: \"int\" }\n        Property { name: \"asynchronous\"; type: \"bool\" }\n        Property { name: \"ignoreSslErrors\"; type: \"bool\" }\n        Property { name: \"cache\"; type: \"bool\" }\n        Property { name: \"horizontalAlignment\"; type: \"int\" }\n        Property { name: \"mirror\"; type: \"bool\" }\n        Property { name: \"paintedHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"paintedWidth\"; type: \"double\"; isReadonly: true }\n        Property { name: \"progress\"; type: \"double\"; isReadonly: true }\n        Property { name: \"smooth\"; type: \"bool\" }\n        Property { name: \"sourceSize\"; type: \"QSize\" }\n        Property { name: \"status\"; type: \"int\"; isReadonly: true }\n        Property { name: \"verticalAlignment\"; type: \"int\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Base/CoverList 2.0\"\n        exports: [\"AsemanQml.Base/CoverList 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"itemsWidth\"; type: \"double\" }\n        Property { name: \"itemsPadding\"; type: \"double\" }\n        Property { name: \"originY\"; type: \"double\" }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"internalDelegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"model\"; type: \"QVariant\" }\n        Property { name: \"currentIndex\"; type: \"int\" }\n    }\n    Component {\n        prototype: \"AsemanQuickObject\"\n        name: \"AsemanQml.Base/CrashController 2.0\"\n        exports: [\"AsemanQml.Base/CrashController 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"logLockFile\"; type: \"string\" }\n        Signal { name: \"crashed\" }\n        Signal { name: \"safe\" }\n        Method { name: \"stopMonitoring\"; type: \"QVariant\" }\n        Method { name: \"startMonitoring\"; type: \"QVariant\" }\n        Method { name: \"unlock\"; type: \"QVariant\" }\n        Method { name: \"checkCrash\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickObject\"\n        name: \"AsemanQml.Base/DelayPropertySwitch 2.0\"\n        exports: [\"AsemanQml.Base/DelayPropertySwitch 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"switchProperty\"; type: \"QVariant\" }\n        Property { name: \"targetProperty\"; type: \"QVariant\" }\n        Property { name: \"delay\"; type: \"int\" }\n    }\n    Component {\n        prototype: \"QQuickGridView\"\n        name: \"AsemanQml.Base/FileSystemView 2.0\"\n        exports: [\"AsemanQml.Base/FileSystemView 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"itemsLabelColor\"; type: \"QColor\" }\n        Property { name: \"gridWidth\"; type: \"double\" }\n        Property { name: \"root\"; type: \"string\" }\n        Property { name: \"filters\"; type: \"QStringList\" }\n        Property { name: \"showDotAndDotDot\"; type: \"bool\" }\n        Signal {\n            name: \"clickedOnFile\"\n            Parameter { name: \"fileUrl\"; type: \"QVariant\" }\n        }\n        Method { name: \"back\"; type: \"QVariant\" }\n        Property { name: \"tabBarRatio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"tabBarHeight\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Base/MaterialFrame 2.0\"\n        exports: [\"AsemanQml.Base/MaterialFrame 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"shadowColor\"; type: \"QColor\" }\n    }\n    Component {\n        prototype: \"QQuickMouseArea\"\n        name: \"AsemanQml.Base/NullMouseArea 2.0\"\n        exports: [\"AsemanQml.Base/NullMouseArea 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n    }\n    Component {\n        prototype: \"AsemanQuickObject\"\n        name: \"AsemanQml.Base/PointMapListener 2.0\"\n        exports: [\"AsemanQml.Base/PointMapListener 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"source\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"dest\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"x\"; type: \"double\" }\n        Property { name: \"y\"; type: \"double\" }\n        Property { name: \"result\"; type: \"QPointF\"; isReadonly: true }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Base/RoundedImage 2.0\"\n        exports: [\"AsemanQml.Base/RoundedImage 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"asynchronous\"; type: \"bool\" }\n        Property { name: \"cache\"; type: \"bool\" }\n        Property { name: \"fillMode\"; type: \"int\" }\n        Property { name: \"horizontalAlignment\"; type: \"int\" }\n        Property { name: \"mirror\"; type: \"bool\" }\n        Property { name: \"paintedHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"paintedWidth\"; type: \"double\"; isReadonly: true }\n        Property { name: \"progress\"; type: \"double\"; isReadonly: true }\n        Property { name: \"smooth\"; type: \"bool\" }\n        Property { name: \"source\"; type: \"QUrl\" }\n        Property { name: \"sourceSize\"; type: \"QSize\" }\n        Property { name: \"status\"; type: \"int\"; isReadonly: true }\n        Property { name: \"verticalAlignment\"; type: \"int\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Base/RoundedItem 2.0\"\n        exports: [\"AsemanQml.Base/RoundedItem 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"sceneData\"\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"sceneData\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Base/SelectableList 2.0\"\n        exports: [\"AsemanQml.Base/SelectableList 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"items\"; type: \"QVariant\" }\n        Property { name: \"textsColor\"; type: \"QColor\" }\n        Property { name: \"splitersColor\"; type: \"QColor\" }\n        Property { name: \"itemsHeight\"; type: \"double\" }\n        Property { name: \"nameMethodObject\"; type: \"QVariant\" }\n        Property { name: \"nameMethodFunction\"; type: \"string\" }\n        Property { name: \"debugMode\"; type: \"bool\" }\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Method {\n            name: \"positionViewAtIndex\"\n            type: \"QVariant\"\n            Parameter { name: \"index\"; type: \"QVariant\" }\n            Parameter { name: \"force\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"itemName\"\n            type: \"QVariant\"\n            Parameter { name: \"index\"; type: \"QVariant\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Base/ShadowRectangle 2.0\"\n        exports: [\"AsemanQml.Base/ShadowRectangle 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"shadowSize\"; type: \"double\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"border\"; type: \"QQuickPen\"; isReadonly: true; isPointer: true }\n        Property { name: \"shadowOpacity\"; type: \"double\" }\n        Property { name: \"shadowRadius\"; type: \"double\" }\n        Property { name: \"visibleShadow\"; type: \"bool\" }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/base/qmake_asemanqml.qrc",
    "content": "<!DOCTYPE RCC><RCC version=\"1.0\">\n<qresource prefix=\"/AsemanQml/\">\n<file>Base/AsemanFlickable.qml</file>\n<file>Base/AsemanGridView.qml</file>\n<file>Base/AsemanListView.qml</file>\n<file>Base/BackAction.qml</file>\n<file>Base/CachedImage.qml</file>\n<file>Base/CoverList.qml</file>\n<file>Base/CrashController.qml</file>\n<file>Base/DelayPropertySwitch.qml</file>\n<file>Base/FileSystemView.qml</file>\n<file>Base/MaterialFrame.qml</file>\n<file>Base/NullMouseArea.qml</file>\n<file>Base/PointMapListener.qml</file>\n<file>Base/RoundedImage.qml</file>\n<file>Base/RoundedItem.qml</file>\n<file>Base/SelectableList.qml</file>\n<file>Base/ShadowRectangle.qml</file>\n<file>Base/qmldir</file>\n<file>Base/files/aseman-abstract.png</file>\n<file>Base/files/aseman-dark.png</file>\n<file>Base/files/aseman-logo-dark.png</file>\n<file>Base/files/aseman-logo.png</file>\n<file>Base/files/aseman-silver-shadowed.png</file>\n<file>Base/files/aseman-silver.png</file>\n<file>Base/files/asemanland-logo.png</file>\n<file>Base/files/folder.png</file>\n<file>Base/files/unknown.png</file>\n</qresource>\n</RCC>\n"
  },
  {
    "path": "src/asemanqml/base/qmldir",
    "content": "module AsemanQml.Base\nclassname AsemanQmlPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlbase\ndepends QtQuick 2.0\ndepends QtGraphicalEffects 1.0\ndepends QtQuick.Controls 2.0\ndepends QtQuick.Window 2.2\ndepends QtQuick.Layouts 1.2\n"
  },
  {
    "path": "src/asemanqml/controls/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/controlsplugin.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemcontrols.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/controlsplugin.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemcontrols.cpp\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/qmake_asemancontrols.qrc\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/AsemanApplication.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport QtQuick.Controls 2.9\nimport QtQuick.Window 2.0\n\nAsemanApplicationBase {\n    id: app\n    property url source\n    readonly property alias appMain: prv.appMain\n\n    AsemanObject {\n        id: prv\n        property Window appMain\n    }\n\n    onSourceChanged: {\n        if(prv.appMain)\n            prv.appMain.destroy()\n\n        if(source.length == 0)\n            return\n\n        var component = Qt.createComponent(source, Component.Asynchronous);\n        var callback = function(){\n            if(component.status == Component.Ready)\n                prv.appMain = component.createObject(app)\n            else if(component.status == Component.Error) {\n                console.error(component.errorString())\n\n                var er = errorComponent.createObject(app)\n                er.showError(component.errorString())\n            }\n        }\n        component.statusChanged.connect(callback)\n        callback()\n    }\n\n\n    Component {\n        id: errorComponent\n        ApplicationWindow {\n            visible: true\n\n            Rectangle {\n                anchors.fill: parent\n                color: \"#000000\"\n            }\n\n            Text {\n                id: errorDialog\n                anchors.centerIn: parent\n                width: parent.width - 20*Devices.density\n                wrapMode: Text.WrapAtWordBoundaryOrAnywhere\n                font.pixelSize: 10*Devices.fontDensity\n                color: \"#eeeeee\"\n                text: \"<b>Fatal Error</b><br />Application could not be started. Additional information:\"\n            }\n\n            function showError(str) {\n                errorDialog.text += \"<br />\" + str\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/AsemanWindow.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport QtQuick.Controls 2.0\nimport AsemanQml.Base 2.0\n\nApplicationWindow {\n    id: appWin\n\n    property bool backController: true\n    property bool try_close: false\n    property alias masterPalette: palette\n    readonly property bool portrait: width<height\n    property alias tooltip: tool_tip\n\n    signal closeRequest()\n\n    onCloseRequest: if(backController) AsemanApp.back()\n\n    SystemPalette {\n        id: palette\n    }\n\n    Timer {\n        id: timer_delayer\n        interval: 300\n        repeat: false\n    }\n\n    Tooltip {\n        id: tool_tip\n        anchors.bottom: parent.bottom\n        anchors.horizontalCenter: parent.horizontalCenter\n        anchors.bottomMargin: 32*Devices.density + View.navigationBarHeight\n        z: 100000001\n    }\n\n    Connections {\n        target: AsemanApp\n        function onBackRequest() {\n            if(timer_delayer.running)\n                return\n\n            timer_delayer.start()\n            var res = BackHandler.back()\n            if( !res && !Devices.isDesktop )\n                appWin.tryClose()\n        }\n    }\n\n    function tryClose() {\n        try_close = true\n        close()\n    }\n\n    function showTooltip( text ){\n        tool_tip.showText(text)\n    }\n\n    function showGlobalWait(text, blockBack) {\n        var component = Qt.createComponent(\"private/GlobalBusyDialog.qml\")\n        var obj = component.createObject(appWin)\n        obj.z = 100000000\n        obj.text = text\n        obj.blockBack = blockBack\n        return obj\n    }\n\n    Component.onCompleted: {\n        View.registerWindow(appWin)\n        View.root = appWin\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/CircularProgressBar.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nItem {\n    id: cpbar\n    width: 64\n    height: width\n\n    property real lineWidth: 4*Devices.density\n    property alias running: anim.running\n    property real progress: 0\n    property color color: \"#0d80ec\"\n    property alias progressText: progress_text.visible\n\n    onLineWidthChanged: itttm.refresh()\n    onProgressChanged: itttm.refresh()\n    onColorChanged: itttm.refresh()\n\n    Text {\n        id: progress_text\n        anchors.centerIn: parent\n        font.family: AsemanApp.globalFont\n        font.pixelSize: 10*Devices.fontDensity\n        color: cpbar.color\n        text: {\n            var res = Math.floor(cpbar.progress*1000)\n            res = res/10\n            if(res == Math.floor(res))\n                res += \".0\"\n            return Tools.translateNumbers(res + \"%\")\n        }\n    }\n\n    Item {\n        id: itttm\n        anchors.fill: parent\n        anchors.centerIn: parent\n\n        NumberAnimation {\n            id: anim\n            easing.type: Easing.Linear\n            duration: 1500\n            from: 0\n            to: 360\n            running: cpbar.progress != 0\n            target: itttm\n            properties: \"rotation\"\n            loops: Animation.Infinite\n        }\n\n        Canvas {\n            id: canvas\n            anchors.fill: parent\n            antialiasing: true\n            renderStrategy: Canvas.Threaded\n            onPaint: {\n                var ctx = getContext(\"2d\");\n                ctx.strokeStyle = cpbar.color\n                ctx.lineWidth = lineWidth\n\n                var w = width\n                var h = height\n                var r = (Math.min(width, height) - ctx.lineWidth)/2\n                var angle = Math.PI*2 * cpbar.progress\n\n                ctx.clearRect(0, 0, w, h)\n                ctx.resetTransform()\n                ctx.beginPath()\n                ctx.arc(w/2, h/2, r, 0, angle, false)\n                ctx.stroke()\n            }\n        }\n\n        function refresh() {\n            canvas.requestPaint()\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/DateTimeChooser.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport AsemanQml.Models 2.0\nimport \".\"\n\nItem {\n    id: dt_chooser\n    width: 400*Devices.density\n    height: 150*Devices.density\n    clip: true\n\n    property color color: \"transparent\"\n    property color textsColor\n    property bool dateVisible: true\n    property bool timeVisible: true\n\n    property alias calendarType: model.calendar\n    property alias date: model.dateTime\n\n    CalendarModel {\n        id: model\n        onCurrentYearIndexChanged: year_list.positionViewAtIndex(currentYearIndex)\n        onCurrentMonthIndexChanged: month_list.positionViewAtIndex(currentMonthIndex)\n        onCurrentDaysIndexChanged: day_list.positionViewAtIndex(currentDaysIndex)\n        onCurrentHoursIndexChanged: hour_list.positionViewAtIndex(currentHoursIndex)\n        onCurrentMinutesIndexChanged: minute_list.positionViewAtIndex(currentMinutesIndex)\n\n        Component.onCompleted: {\n            year_list.positionViewAtIndex(currentYearIndex, true)\n            month_list.positionViewAtIndex(currentMonthIndex, true)\n            day_list.positionViewAtIndex(currentDaysIndex, true)\n            hour_list.positionViewAtIndex(currentHoursIndex, true)\n            minute_list.positionViewAtIndex(currentMinutesIndex, true)\n        }\n\n        function save() {\n            save_timer.restart()\n        }\n    }\n\n    Timer {\n        id: save_timer\n        interval: 800\n        onTriggered: {\n            model.setConvertDate(year_list.currentIndex,\n                                 month_list.currentIndex,\n                                 day_list.currentIndex,\n                                 hour_list.currentIndex,\n                                 minute_list.currentIndex)\n        }\n    }\n\n    Row {\n        id: row\n        anchors.fill: parent\n\n        SelectableList {\n            id: year_list\n            height: parent.height\n            width: timeVisible? dt_chooser.width*3/14 : dt_chooser.width*75/225\n            textsColor: dt_chooser.textsColor\n            color: dt_chooser.color\n            visible: dateVisible\n            items: model.years\n            onCurrentIndexChanged: model.save()\n        }\n\n        SelectableList {\n            id: month_list\n            height: parent.height\n            width: timeVisible? dt_chooser.width*4/14 : dt_chooser.width*100/225\n            textsColor: dt_chooser.textsColor\n            color: dt_chooser.color\n            visible: dateVisible\n            nameMethodObject: model\n            nameMethodFunction: \"monthName\"\n            items: model.months\n            onCurrentIndexChanged: model.save()\n        }\n\n        SelectableList {\n            id: day_list\n            height: parent.height\n            width: timeVisible? dt_chooser.width*2/14 : dt_chooser.width*50/225\n            textsColor: dt_chooser.textsColor\n            color: dt_chooser.color\n            visible: dateVisible\n            items: model.days\n            onCurrentIndexChanged: model.save()\n        }\n\n        Item {\n            height: parent.height\n            width: dt_chooser.width*1/14\n            visible: dateVisible && timeVisible\n        }\n\n        SelectableList {\n            id: hour_list\n            height: parent.height\n            width: dateVisible? dt_chooser.width*2/14 : dt_chooser.width*0.5\n            textsColor: dt_chooser.textsColor\n            color: dt_chooser.color\n            visible: timeVisible\n            nameMethodObject: row\n            nameMethodFunction: \"rightJustify\"\n            items: model.hours\n            onCurrentIndexChanged: model.save()\n        }\n\n        SelectableList {\n            id: minute_list\n            height: parent.height\n            width: dateVisible? dt_chooser.width*2/14 : dt_chooser.width*0.5\n            textsColor: dt_chooser.textsColor\n            color: dt_chooser.color\n            visible: timeVisible\n            nameMethodObject: row\n            nameMethodFunction: \"rightJustify\"\n            items: model.minutes\n            onCurrentIndexChanged: model.save()\n        }\n\n        function rightJustify( str ) {\n            var tempString = str.toString()\n            while( tempString.length < 2 )\n                tempString = \"0\" + tempString\n\n            return tempString\n        }\n    }\n\n    function getDate() {\n        return model.dateTime\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/Drawer.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nItem {\n    id: sidemenu\n    width: 100\n    height: 62\n    clip: true\n\n    property Component delegate\n    property variant item\n\n    property real handleWidth: 20*Devices.density\n\n    property alias menuWidth: item_frame.width\n    property alias pressed: marea.pressed\n    readonly property real percent: {\n        var res = (menuWidth+item_frame.x)/menuWidth\n        if(res < 0)\n            res = 0\n        else\n        if(res > 1)\n            res = 1\n        return res\n    }\n\n    readonly property bool showed: item_frame.x > -menuWidth\n\n    LayoutMirroring.childrenInherit: true\n\n    onDelegateChanged: {\n        if( item )\n            item.destroy()\n        if( !delegate )\n            return\n\n        item = delegate.createObject(item_parent)\n    }\n\n    Rectangle {\n        anchors.fill: parent\n        color: \"#000000\"\n        opacity: Devices.isIOS? percent*0.7 : percent*0.5\n    }\n\n    Item {\n        id: main_frame\n        anchors.fill: parent\n        transformOrigin: Item.Center\n        rotation: LayoutMirroring.enabled? 180 : 0\n\n        MouseArea {\n            id: marea\n            anchors.top: parent.top\n            anchors.bottom: parent.bottom\n            width: lastState? parent.width : handleWidth + menuWidth\n            x: item_frame.x\n            onMouseXChanged: {\n                var newX = item_frame.x + mouseX-pinX\n                if( newX > 0 )\n                    newX = 0\n                if( Math.abs(x-startX) > 5*Devices.density )\n                    movedX = true\n\n                item_frame.x = newX\n            }\n            onPressed: {\n                pinX = mouseX\n                item_frame.anim = false\n                startX = x\n                movedX = false\n            }\n            onReleased: {\n                item_frame.anim = true\n\n                var basePercent = lastState? 0.8 : 0.2\n\n                if( !movedX ) {\n                    item_frame.x = -menuWidth\n                    lastState = false\n                    return\n                }\n\n                if( sidemenu.percent > basePercent ) {\n                    item_frame.x = 0\n                    lastState = true\n                } else {\n                    item_frame.x = -menuWidth\n                    lastState = false\n                }\n            }\n\n            property real pinX: 0\n            property bool lastState: false\n            property real startX: 0\n            property bool movedX: false\n\n            onLastStateChanged: {\n                if( lastState )\n                    BackHandler.pushHandler(sidemenu,sidemenu.discard)\n                else\n                    BackHandler.removeHandler(sidemenu)\n            }\n        }\n\n        Item {\n            id: item_frame\n            width: {\n                var res = Devices.isMobile? sidemenu.width-50*Devices.density : sidemenu.width/2 + 20*Devices.density\n                if(res > 320*Devices.density)\n                    res = 320*Devices.density\n                return res\n            }\n            height: parent.height\n            x: -width\n\n            onWidthChanged: {\n                if(!marea.lastState)\n                {\n                    item_frame.anim = false\n                    item_frame.x = -menuWidth\n                }\n            }\n\n            property bool anim: false\n\n            Behavior on x {\n                NumberAnimation{ easing.type: Easing.OutCubic; duration: item_frame.anim? 400 : 0 }\n            }\n\n            Item {\n                id: item_parent\n                width: parent.width\n                height: parent.height\n                transformOrigin: Item.Center\n                rotation: LayoutMirroring.enabled? 180 : 0\n            }\n        }\n\n        Rectangle {\n            id: shadow_rct\n            y: -height\n            x: item_frame.x + item_frame.width\n            height: 5*Devices.density\n            width: parent.height\n            transformOrigin: Item.BottomLeft\n            opacity: Math.pow(percent, 0.1)\n            rotation: 90\n            visible: !Devices.isIOS\n            gradient: Gradient {\n                GradientStop { position: 1.0; color: \"#33000000\" }\n                GradientStop { position: 0.0; color: \"#00000000\" }\n            }\n        }\n    }\n\n    function discard() {\n        item_frame.anim = true\n        item_frame.x = -menuWidth\n        marea.lastState = false\n    }\n\n    function show() {\n        item_frame.anim = true\n        item_frame.x = 0\n        marea.lastState = true\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/DynamicTabBar.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport QtQuick.Controls 2.0 as QtControls\n\nItem {\n    id: tbar\n    height: 50*Devices.density\n\n    property alias color: back.color\n    property real minimumWidth: 120*Devices.density\n    property alias model: tabBar.model\n    property alias currentIndex: tabBar.currentIndex\n    property color highlightColor: \"#03A9F4\"\n    property color textColor: \"#333333\"\n    property real fontSize: 12*Devices.fontDensity\n    property string fontFamily: AsemanApp.globalFont.family\n    property string displayRole\n\n    signal clicked(int index)\n\n    Rectangle {\n        id: back\n        anchors.fill: tabBar\n    }\n\n    AsemanListView {\n        id: tabBar\n        anchors.fill: parent\n        orientation: Qt.Horizontal\n\n        delegate: QtControls.ItemDelegate {\n            height: tabBar.height\n            width: {\n                var res = tabBar.width/tabBar.count\n                if(res < minimumWidth)\n                    res = minimumWidth\n                return res\n            }\n            hoverEnabled: false\n            onClicked: {\n                tabBar.currentIndex = index\n                tbar.clicked(model.index)\n            }\n\n            Text {\n                width: parent.width\n                anchors.verticalCenter: parent.verticalCenter\n                horizontalAlignment: Text.AlignHCenter\n                wrapMode: Text.WrapAnywhere\n                maximumLineCount: 1\n                elide: Text.ElideRight\n                font.pixelSize: fontSize\n                font.family: tbar.fontFamily\n                color: tabBar.currentIndex==index? highlightColor : textColor\n                text: displayRole.length? model[displayRole] : tabBar.model[index]\n            }\n        }\n        highlightMoveDuration: 400\n        highlight: Item {\n            height: tabBar.height\n            width: tabBar.itemWidth\n\n            Rectangle {\n                width: parent.width\n                height: 3*Devices.density\n                anchors.bottom: parent.bottom\n                color: highlightColor\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/ExtendedFab.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Modern 2.0 as Modern\nimport AsemanQml.Base 2.0\nimport QtQuick.Controls 2.5\nimport QtQuick.Layouts 1.12\n\nItem {\n    id: item\n    height: 50 * Devices.density\n    width: scene.width\n\n    property color color\n    property alias icon: fabIcon.text\n    property alias textColor: fabIcon.color\n    property alias text: fabText.text\n    property alias fontFamily: fabText.font.family\n    property int fontSize: 20\n    property Flickable scrollArea\n\n    Item {\n        id: scene\n        width: open? extendedWidth : parent.height\n        height: open? extendedHeight : parent.height\n        anchors.centerIn: parent\n\n        property real extendedHeight: parent.height /** 0.9*/\n        property bool open: false\n        property int lastY: 0\n        property int listY: scrollArea ? scrollArea.contentY : 0\n        property int extendedWidth: rows.width + parent.height\n\n        onListYChanged: {\n            if(listY < 0)\n                return\n            if (lastY - listY > 5 ) {\n                open = true\n                lastY = listY\n            } else if(listY - lastY > 20)   {\n                open = false\n                lastY = listY\n            }\n\n        }\n\n        Modern.FastDropShadow {\n            anchors.fill: fab\n            horizontalOffset: 1*Devices.density\n            verticalOffset: 1*Devices.density\n            radius: 20*Devices.density\n            color: \"#000\"\n            opacity: 0.6\n            source: fab\n        }\n\n        Rectangle {\n            id: fab\n            anchors.fill: parent\n            radius: height / 2\n            color: mouseArea.pressed? Qt.darker(item.color, 1.3) : item.color\n\n            Behavior on color {\n                ColorAnimation {\n                    easing: {\n                        type: Easing.OutCubic\n                    }\n                    duration: 200\n                }\n            }\n\n            Row {\n                id: rows\n                anchors.verticalCenter: parent.verticalCenter\n                x: scene.open? scene.height/2 : scene.height/2 - fabIcon.width/2\n\n                Behavior on x {\n                    NumberAnimation {\n                        easing {\n                            type: Easing.OutCubic\n                        }\n                        duration: 300\n                    }\n                }\n\n                spacing: 8 * Devices.density\n                Text {\n                    id: fabIcon\n                    text: icon\n                    color: textColor\n                    font.pixelSize: fontSize * Devices.fontDensity\n                    anchors.verticalCenter: parent.verticalCenter\n                }\n\n                Text {\n                    id: fabText\n                    text: text\n                    color: textColor\n                    font.pixelSize: (fabIcon.font.pixelSize - 6) * Devices.fontDensity\n                    opacity: scene.open? 1 : 0\n                    anchors.verticalCenter: parent.verticalCenter\n\n                    Behavior on opacity {\n                        NumberAnimation {\n                            easing {\n                                type: Easing.OutCubic\n                            }\n                            duration: 300\n                        }\n                    }\n                }\n            }\n        }\n\n        Behavior on width {\n            NumberAnimation {\n                easing {\n                    type: Easing.OutCubic\n                }\n                duration: 300\n            }\n        }\n\n        MouseArea {\n            id: mouseArea\n            anchors.fill: parent\n        }\n    }\n}\n\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/HScrollBar.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/****************************************************************************\n**\n** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).\n** Contact: http://www.qt-project.org/legal\n**\n** This file is part of the QtQml module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and Digia.  For licensing terms and\n** conditions see http://qt.digia.com/licensing.  For further information\n** use the contact form at http://qt.digia.com/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU Lesser General Public License version 2.1 requirements\n** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n**\n** In addition, as a special exception, Digia gives you certain additional\n** rights.  These rights are described in the Digia Qt LGPL Exception\n** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 3.0 as published by the Free Software\n** Foundation and appearing in the file LICENSE.GPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU General Public License version 3.0 requirements will be\n** met: http://www.gnu.org/copyleft/gpl.html.\n**\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nItem {\n    id: container\n    width: 6*Devices.density\n\n    property variant scrollArea\n    property variant orientation: Qt.Vertical\n    property alias color: bilbilak.color\n    property bool forceVisible: false\n\n    opacity: scrollArea.movingVertically || scrollArea.movingHorizontally || forceVisible? 1 : 0\n\n    function position()\n    {\n        var ny = 0;\n        if (container.orientation == Qt.Vertical)\n            ny = scrollArea.visibleArea.yPosition * container.height;\n        else\n            ny = scrollArea.visibleArea.xPosition * container.width;\n        if (ny > 2) return ny; else return 2;\n    }\n\n    function size()\n    {\n        var nh, ny;\n\n        if (container.orientation == Qt.Vertical)\n            nh = scrollArea.visibleArea.heightRatio * container.height;\n        else\n            nh = scrollArea.visibleArea.widthRatio * container.width;\n\n        if (container.orientation == Qt.Vertical)\n            ny = scrollArea.visibleArea.yPosition * container.height;\n        else\n            ny = scrollArea.visibleArea.xPosition * container.width;\n\n        if (ny > 3) {\n            var t;\n            if (container.orientation == Qt.Vertical)\n                t = Math.ceil(container.height - 3 - ny);\n            else\n                t = Math.ceil(container.width - 3 - ny);\n            if (nh > t) return t; else return nh;\n        } else return nh + ny;\n    }\n\n    Rectangle {\n        id: bilbilak\n        color: \"#000000\"\n        smooth: true\n        radius: width/2\n        x: container.orientation == Qt.Vertical ? 2 : position()\n        width: container.orientation == Qt.Vertical ? container.width - 4 : diagonal\n        y: container.orientation == Qt.Vertical ? position() : 2\n        height: container.orientation == Qt.Vertical ? diagonal : container.height - 4\n        opacity: 0.5\n\n        property real diagonal: size()<20*Devices.density? 20*Devices.density : size()\n    }\n\n    Behavior on opacity {\n        NumberAnimation { duration: 300 }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/Header.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nRectangle {\n    id: header\n    width: 100\n    height: defaultHeight\n    color: \"#00000000\"\n\n    property alias text: title_txt.text\n    property alias titleFont: title_txt.font\n    property alias titleFontSize: title_txt.font.pixelSize\n    property bool light: true\n    property alias shadow: shadow_rct.visible\n    property alias shadowOpacity: shadow_rct.opacity\n    property bool statusBar: Devices.transparentStatusBar\n    property bool centerText: true\n\n    readonly property real defaultHeight: Devices.standardTitleBarHeight + (statusBar? View.statusBarHeight : 0)\n\n    Item {\n        anchors.fill: parent\n        anchors.topMargin: statusBar? View.statusBarHeight : 0\n\n        Rectangle {\n            id: shadow_rct\n            height: 3*Devices.density\n            width: parent.width\n            anchors.top: parent.bottom\n            visible: !Devices.isIOS\n            gradient: Gradient {\n                GradientStop { position: 0.0; color: \"#55000000\" }\n                GradientStop { position: 1.0; color: \"#00000000\" }\n            }\n        }\n\n        Rectangle {\n            anchors.bottom: parent.bottom\n            width: parent.width\n            height: 1*Devices.density\n            visible: !shadow_rct.visible\n            opacity: shadow_rct.opacity\n            color: \"#33000000\"\n        }\n\n        Text {\n            id: title_txt\n            font.pixelSize: Math.floor(10*Devices.fontDensity)\n            font.family: AsemanApp.globalFont.family\n            y: Devices.standardTitleBarHeight/2 - height/2\n            x: {\n                if(centerText)\n                    return parent.width/2 - width/2\n                else\n                if(LayoutMirroring.enabled)\n                    return parent.width - Devices.standardTitleBarHeight - width\n                else\n                    return Devices.standardTitleBarHeight\n            }\n\n            color: header.light? \"#ffffff\" : \"#333333\"\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/HeaderMenuButton.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nItem {\n    id: hmb\n    width: height\n    height: Devices.standardTitleBarHeight\n    y: View.statusBarHeight\n    x: LayoutMirroring.enabled? parent.width - width : 0\n\n    property alias color: rect.color\n    property alias buttonColor: menuIcon.color\n\n    property alias ratio: menuIcon.ratio\n    property alias pressed: marea.pressed\n\n    signal clicked()\n\n    LayoutMirroring.childrenInherit: true\n\n    Rectangle {\n        id: rect\n        anchors.fill: parent\n        anchors.margins: 10*Devices.density\n        color: menuIcon.color\n        radius: 3*Devices.density\n        opacity: pressed? 0.2 : 0\n    }\n\n    MenuIcon {\n        id: menuIcon\n        anchors.centerIn: parent\n    }\n\n    MouseArea {\n        id: marea\n        anchors.fill: parent\n        onClicked: hmb.clicked()\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/Helper.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport AsemanQml.GraphicalEffects 2.0\nimport QtQuick.Controls 2.1 as QtControls\nimport QtQuick.Layouts 1.2 as QtLayouts\n\nItem {\n    id: helper\n    anchors.fill: parent\n\n    property real borderPadding: 200*Devices.density\n    property alias duration: switchTimer.interval\n    property int currentIndex: -1\n    readonly property HelperPoint currentItem: {\n        if(currentIndex < 0)\n            return null\n\n        var cnt = 0\n        for(var i=0; i<children.length; i++) {\n            var item = children[i]\n            if(item.classId != \"58826245-ce6d-478a-86c2-efe33477286c\" || !item.visible)\n                continue\n\n            if(cnt >= currentIndex)\n                return item\n\n            cnt++\n        }\n\n        return null\n    }\n    readonly property int count: {\n        var cnt = 0\n        for(var i=0; i<children.length; i++) {\n            var item = children[i]\n            if(item.classId == \"58826245-ce6d-478a-86c2-efe33477286c\" && item.visible)\n                cnt++\n        }\n        return cnt\n    }\n\n    readonly property real ratio: prv.ratio\n\n    signal finished()\n\n    onCurrentItemChanged: {\n        prv.currentItem = null\n        switchTimer.restart()\n    }\n\n    QtObject {\n        id: prv\n        property HelperPoint lastItem\n        property HelperPoint currentItem\n        property real ratio: prv.currentItem? 1 : 0\n\n        Behavior on ratio {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: helper.duration*0.8 }\n        }\n    }\n\n    Timer {\n        id: switchTimer\n        interval: 400\n        repeat: false\n        onTriggered: {\n            prv.currentItem = helper.currentItem\n            prv.lastItem = helper.currentItem\n        }\n    }\n\n    Item {\n        id: scene\n        visible: false\n        anchors.fill: parent\n\n        Rectangle {\n            width: height\n            height: helper.ratio * 2*Math.max(scene.width, scene.height)\n            radius: width/2\n            opacity: helper.ratio*0.5\n            color: prv.lastItem? prv.lastItem.color : \"transparent\"\n            x: {\n                var item = prv.lastItem\n                if(!item) return 0\n\n                var itemX = item.x + item.width/2\n                var centerX = 0\n                if(itemX < scene.width/2)\n                    centerX = 0\n                else\n                    centerX = scene.width\n\n                return centerX - width/2\n            }\n            y: {\n                var item = prv.lastItem\n                if(!item) return 0\n\n                var itemY = item.y + item.height/2\n                var centerY = 0\n                if(itemY < scene.height/2)\n                    centerY = 0\n                else\n                    centerY = scene.height\n\n                return centerY - height/2\n            }\n        }\n\n\n        Rectangle {\n            width: prv.lastItem? Math.max(prv.lastItem.width, prv.lastItem.height) + extraPadding*borderPadding : 0\n            height: width\n            x: prv.lastItem? prv.lastItem.x + prv.lastItem.width/2 - width/2 : 0\n            y: prv.lastItem? prv.lastItem.y + prv.lastItem.height/2 - height/2 : 0\n            color: prv.lastItem? prv.lastItem.color : \"transparent\"\n            radius: width/2\n            opacity: extraPaddingTimer.turnedOn? 0.7 * (1-extraPadding) : 0.01\n\n            property real extraPadding: extraPaddingTimer.turnedOn? 1 : 0\n\n            Behavior on extraPadding {\n                NumberAnimation { easing.type: Easing.OutCubic; duration: 1000 }\n            }\n\n            Timer {\n                id: extraPaddingTimer\n                interval: 1000\n                repeat: true\n                running: prv.currentItem\n                onRunningChanged: turnedOn = false\n                onTriggered: turnedOn = !turnedOn\n                property bool turnedOn: false\n            }\n        }\n    }\n\n    Item {\n        id: mask\n        anchors.fill: scene\n        visible: false\n\n        Rectangle {\n            width: prv.lastItem? Math.max(prv.lastItem.width, prv.lastItem.height) : 0\n            height: width\n            x: prv.lastItem? prv.lastItem.x + prv.lastItem.width/2 - width/2 : 0\n            y: prv.lastItem? prv.lastItem.y + prv.lastItem.height/2 - height/2 : 0\n            radius: width/2\n        }\n    }\n\n    OpacityMask {\n        source: scene\n        anchors.fill: scene\n        maskSource: mask\n        invert: true\n\n        QtLayouts.ColumnLayout {\n            width: {\n                if(!prv.lastItem)\n                    return 0\n\n                var pad = 10*Devices.density\n                var res = Math.max(prv.lastItem.width, prv.lastItem.height)\n                if(res < scene.width/2)\n                    res = scene.width/2\n                else\n                if(res > scene.width - pad*2)\n                    res = scene.width - pad*2\n\n                return res\n            }\n            y: {\n                if(!prv.lastItem)\n                    return 0\n\n                var pad = 10*Devices.density\n                var max = Math.max(prv.lastItem.width, prv.lastItem.height)\n                var res = prv.lastItem.y + (prv.lastItem.height - max)/2 + max + pad\n                if(res > scene.height - height)\n                    res = prv.lastItem.y + (prv.lastItem.height - max)/2 - height - pad\n\n                return res\n            }\n            x: {\n                if(!prv.lastItem)\n                    return 0\n\n                var pad = 10*Devices.density\n                var max = Math.max(prv.lastItem.width, prv.lastItem.height)\n                var res = prv.lastItem.x + (prv.lastItem.width - max)/2 + max/2 - width/2\n                if(res < pad)\n                    res = pad\n                else\n                if(res + width + pad > scene.width)\n                    res = scene.width - width - pad\n\n                return res\n            }\n            opacity: prv.currentItem? 1 : 0\n\n            Behavior on opacity {\n                NumberAnimation { easing.type: Easing.OutCubic; duration: 400 }\n            }\n\n            QtLayouts.RowLayout {\n                QtLayouts.Layout.fillWidth: true\n\n                QtControls.Label {\n                    height: 50*Devices.density\n                    width: height\n                    color: prv.lastItem? prv.lastItem.iconColor : \"transparent\"\n                    font: prv.lastItem? prv.lastItem.iconFont : AsemanApp.globalFont\n                    text: prv.lastItem? prv.lastItem.icon : \"\"\n                }\n\n                QtLayouts.ColumnLayout {\n                    QtLayouts.Layout.fillWidth: true\n\n                    QtControls.Label {\n                        QtLayouts.Layout.fillWidth: true\n                        horizontalAlignment: Text.AlignLeft\n                        color: prv.lastItem? prv.lastItem.titleColor : \"transparent\"\n                        font: prv.lastItem? prv.lastItem.titleFont : AsemanApp.globalFont\n                        text: prv.lastItem? prv.lastItem.title : \"\"\n                        wrapMode: Text.WrapAtWordBoundaryOrAnywhere\n                    }\n\n                    QtControls.Label {\n                        QtLayouts.Layout.fillWidth: true\n                        horizontalAlignment: Text.AlignLeft\n                        color: prv.lastItem? prv.lastItem.descriptionColor : \"transparent\"\n                        font: prv.lastItem? prv.lastItem.descriptionFont : AsemanApp.globalFont\n                        text: prv.lastItem? prv.lastItem.description : \"\"\n                        wrapMode: Text.WrapAtWordBoundaryOrAnywhere\n                    }\n                }\n            }\n\n            QtControls.Button {\n                visible: text.length\n                text: prv.lastItem? prv.lastItem.buttonText : \"\"\n                onClicked: next()\n            }\n        }\n\n        MouseArea {\n            anchors.fill: parent\n            onClicked: next()\n            visible: prv.currentItem\n        }\n    }\n\n    function next() {\n        currentIndex++\n        if(currentIndex >= count)\n            Tools.jsDelayCall(duration, finished)\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/HelperPoint.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nItem {\n    id: item\n\n    property string title\n    property string description\n    property string icon\n\n    property color color: \"#0d80ec\"\n\n    property color titleColor: \"#fff\"\n    property color descriptionColor: \"#fff\"\n    property color iconColor: \"#fff\"\n\n    property font titleFont\n    property font descriptionFont\n    property font iconFont\n\n    property string buttonText: \"Next\"\n\n    titleFont.pixelSize: 11*Devices.fontDensity\n    descriptionFont.pixelSize: 9*Devices.fontDensity\n\n    readonly property string classId: \"58826245-ce6d-478a-86c2-efe33477286c\"\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/MenuIcon.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nItem {\n    id: menu_icon\n    height: 20*Devices.density\n    width: height\n\n    property color color: \"#ffffff\"\n    property real ratio: 0\n\n    readonly property bool _mirror: LayoutMirroring.enabled\n\n    Column {\n        width: Math.min(parent.width, parent.height)\n        anchors.centerIn: parent\n        spacing: 3*Devices.density\n        rotation: ratio*180\n        transform: Scale {\n            origin.x: width/2\n            origin.y: height/2\n            xScale: (_mirror?-1:1)*yScale\n            yScale: 1-ratio/6\n        }\n\n        Rectangle {\n            x: parent.width - width + ratio*parent.width*0.1\n            width: (1-ratio)*parent.width*0.25 + parent.width*0.75\n            height: 2*Devices.density\n            radius: height/2\n            color: menu_icon.color\n            rotation: ratio*45\n        }\n\n        Rectangle {\n            x: parent.width - width\n            width: parent.width + ratio*parent.width*0.2\n            height: 2*Devices.density\n            radius: height/2\n            color: menu_icon.color\n        }\n\n        Rectangle {\n            x: parent.width - width + ratio*parent.width*0.1\n            width: (1-ratio)*parent.width*0.25 + parent.width*0.75\n            height: 2*Devices.density\n            radius: height/2\n            color: menu_icon.color\n            rotation: -ratio*45\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/PanelDrawer.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nItem {\n    id: sidemenu\n    width: 100\n    height: 62\n    clip: true\n\n    property Item item\n\n    property bool disableBack: false\n\n    property real handleHeight: 20*Devices.density\n    property real defaultHeight: 400*Devices.density\n\n    property alias menuHeight: item_frame.height\n    property alias pressed: marea.pressed\n    readonly property real percent: {\n        var res = (menuHeight+item_frame.y)/menuHeight\n        if(res < 0)\n            res = 0\n        else\n        if(res > 1)\n            res = 1\n        return res\n    }\n\n    property bool maximizable: true\n    property alias maximize: maximizeAction.active\n    property bool openFromTop: false\n    readonly property bool showed: item_frame.y > -menuHeight\n\n    signal clicked()\n\n    onItemChanged: {\n        item.parent = item_parent\n        item.anchors.fill = item_parent\n    }\n\n    BackAction { id: maximizeAction; disableBack: sidemenu.disableBack }\n\n    Item {\n        id: main_frame\n        anchors.fill: parent\n        transformOrigin: Item.Center\n        rotation: openFromTop? 0 : 180\n\n        MouseArea {\n            id: marea\n            anchors.left: parent.left\n            anchors.right: parent.right\n            height: handleHeight + menuHeight\n            y: item_frame.y\n            onMouseYChanged: {\n                var newY = item_frame.y + mouseY-pinY\n                if( newY > 0 ) {\n                    if (maximizable)\n                        newY = Math.pow(newY, 0.8)\n                    else\n                        newY = 0\n                }\n                if( Math.abs(y-startY) > 5*Devices.density )\n                    movedY = true\n\n                item_frame.y = newY\n            }\n            onPressed: {\n                pinY = mouseY\n                item_frame.anim = false\n                startY = y\n                movedY = false\n            }\n            onReleased: {\n                item_frame.anim = true\n\n                var basePercent = lastState? 0.8 : 0.2\n\n                if( !movedY ) {\n                    item_frame.y = 0\n                    lastState = true\n                    sidemenu.clicked()\n                    return\n                }\n\n                if( sidemenu.percent > basePercent ) {\n                    if (maximizable && item_frame.y > 40 * Devices.density) {\n                        item_frame.y = 0\n                        lastState = true\n                        maximize = true\n                    } else {\n                        item_frame.y = 0\n                        lastState = true\n                    }\n                } else {\n                    if (maximize) {\n                        maximize = false\n                        item_frame.y = 0\n                        return\n                    }\n\n                    item_frame.y = -menuHeight\n                    lastState = false\n                }\n            }\n\n            property real pinY: 0\n            property bool lastState: false\n            property real startY: 0\n            property bool movedY: false\n\n            onLastStateChanged: {\n                if( lastState )\n                    BackHandler.pushHandler(sidemenu,sidemenu.discard)\n                else\n                    BackHandler.removeHandler(sidemenu)\n            }\n        }\n\n        Item {\n            id: item_frame\n            height: {\n                if (maximize)\n                    return sidemenu.height\n                else\n                if (sidemenu.item)\n                    return defaultHeight\n                else\n                    return 320*Devices.density\n            }\n            width: parent.width\n            y: -height\n\n            onHeightChanged: {\n                if(!marea.lastState)\n                {\n                    item_frame.anim = false\n                    item_frame.y = -menuHeight\n                }\n            }\n\n            property bool anim: false\n\n            Behavior on y {\n                NumberAnimation{ easing.type: Easing.OutCubic; duration: item_frame.anim? 400 : 0 }\n            }\n            Behavior on height {\n                NumberAnimation{ easing.type: Easing.OutCubic; duration: item_frame.anim? 400 : 0 }\n            }\n\n            Item {\n                id: item_parent\n                width: parent.width\n                height: parent.height\n                transformOrigin: Item.Center\n                rotation: openFromTop? 0 : 180\n            }\n        }\n    }\n\n    function discard() {\n        item_frame.anim = true\n        item_frame.y = -menuHeight\n        marea.lastState = false\n    }\n\n    function show() {\n        item_frame.anim = true\n        item_frame.y = 0\n        marea.lastState = true\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/PanelFlicker.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nItem {\n    id: sidemenu\n    width: 100\n    height: 62\n    clip: true\n\n    property Component delegate\n    property variant item\n\n    property real handleHeight: 20*Devices.density\n\n    property alias menuHeight: item_frame.height\n    property alias pressed: marea.pressed\n    readonly property real percent: {\n        var res = (menuHeight+item_frame.y)/menuHeight\n        if(res < 0)\n            res = 0\n        else\n        if(res > 1)\n            res = 1\n        return res\n    }\n\n    property bool bottomMenu: true\n    readonly property bool showed: item_frame.y > -menuHeight\n\n    onDelegateChanged: {\n        if( item )\n            item.destroy()\n        if( !delegate )\n            return\n\n        item = delegate.createObject(item_parent)\n    }\n\n    Rectangle {\n        anchors.fill: parent\n        color: \"#000000\"\n        opacity: Devices.isIOS? percent*0.7 : percent*0.5\n    }\n\n    Item {\n        id: main_frame\n        anchors.fill: parent\n        transformOrigin: Item.Center\n        rotation: bottomMenu? 180 : 0\n\n        MouseArea {\n            id: marea\n            anchors.left: parent.left\n            anchors.right: parent.right\n            height: lastState? parent.height : handleHeight + menuHeight\n            y: item_frame.y\n            onMouseYChanged: {\n                var newY = item_frame.y + mouseY-pinY\n                if( newY > 0 )\n                    newY = 0\n                if( Math.abs(y-startY) > 5*Devices.density )\n                    movedY = true\n\n                item_frame.y = newY\n            }\n            onPressed: {\n                pinY = mouseY\n                item_frame.anim = false\n                startY = y\n                movedY = false\n            }\n            onReleased: {\n                item_frame.anim = true\n\n                var basePercent = lastState? 0.8 : 0.2\n\n                if( !movedY ) {\n                    return\n                }\n\n                if( sidemenu.percent > basePercent ) {\n                    item_frame.y = 0\n                    lastState = true\n                } else {\n                    item_frame.y = -menuHeight\n                    lastState = false\n                }\n            }\n\n            property real pinY: 0\n            property bool lastState: false\n            property real startY: 0\n            property bool movedY: false\n\n            onLastStateChanged: {\n                if( lastState )\n                    BackHandler.pushHandler(sidemenu,sidemenu.discard)\n                else\n                    BackHandler.removeHandler(sidemenu)\n            }\n        }\n\n        Item {\n            id: item_frame\n            height: sidemenu.height\n            width: parent.width\n            y: -height\n\n            onHeightChanged: {\n                if(!marea.lastState)\n                {\n                    item_frame.anim = false\n                    item_frame.y = -menuHeight\n                }\n            }\n\n            property bool anim: false\n\n            Behavior on y {\n                NumberAnimation{ easing.type: Easing.OutCubic; duration: item_frame.anim? 400 : 0 }\n            }\n\n            Item {\n                id: item_parent\n                width: parent.width\n                height: parent.height\n                transformOrigin: Item.Center\n                rotation: bottomMenu? 180 : 0\n            }\n        }\n\n        Rectangle {\n            id: shadow_rct\n            anchors.top: item_frame.bottom\n            height: 5*Devices.density\n            width: parent.width\n            opacity: Math.pow(percent, 0.1)\n            visible: !Devices.isIOS\n            gradient: Gradient {\n                GradientStop { position: 1.0; color: \"#00000000\" }\n                GradientStop { position: 0.0; color: \"#33000000\" }\n            }\n        }\n    }\n\n    function discard() {\n        item_frame.anim = true\n        item_frame.y = -menuHeight\n        marea.lastState = false\n    }\n\n    function show() {\n        item_frame.anim = true\n        item_frame.y = 0\n        marea.lastState = true\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/Slider.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport QtQuick.Controls 2.2 as QtControls\nimport QtQuick.Controls.Material 2.1\n\n/*!\n    \\class Slider\n    \\brief Inherited QtControls Slider that show a beautiful label above it.\n */\nQtControls.Slider {\n    id: slider\n    orientation: Qt.Horizontal\n\n    /*!\n        type:bool Sets the slider upper label is visible or not. This label shows current value of the slider.\n    */\n    property alias labelVisible: lblScene.visible\n\n\n    property alias labelOpacity: lblScene.opacity\n    property int labelDecimals: 1\n    property string labelUnit: \"\"\n\n    Rectangle {\n        id: lblScene\n        parent: slider.handle\n        width: lbl.width + 20*Devices.density\n        height: lbl.height + 20*Devices.density\n        anchors.bottom: parent.top\n        anchors.bottomMargin: 10*Devices.density\n        anchors.horizontalCenter: parent.horizontalCenter\n        color: Material.accent\n        radius: 8*Devices.density\n        scale: slider.pressed? 1.2 : 1\n        transformOrigin: Item.Bottom\n        visible: labelVisible\n\n        Behavior on scale {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 250 }\n        }\n\n        QtControls.Label {\n            id: lbl\n            anchors.centerIn: parent\n            color: \"#fff\"\n            text: Math.floor(slider.value*Math.pow(10, labelDecimals))/Math.pow(10, labelDecimals) + labelUnit\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/TabView.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nItem {\n    width: 100\n    height: 62\n\n    property alias model: tabs_list.model\n    property real minimumTabSize: 40*Devices.density\n    property real maximumTabSize: width - 40*Devices.density\n    property real tabsHeight: 50*Devices.density\n\n    property alias currentIndex: tabs_list.currentIndex\n\n    AsemanListView {\n        id: tabs_list\n        width: parent.width\n        height: tabsHeight\n        orientation: ListView.Horizontal\n        currentIndex: 0\n        delegate: Item {\n            clip: true\n            height: tabs_list.height\n            width: {\n                var result = tabs_list.width/tabs_list.count\n                if(result < minimumTabSize)\n                    result = minimumTabSize\n                if(result > maximumTabSize)\n                    result = maximumTabSize\n                return result\n            }\n\n            Text {\n                anchors.centerIn: parent\n                text: model.text\n                font.pixelSize: 13*Devices.fontDensity\n                color: \"#ffffff\"\n            }\n        }\n        highlight: Item {\n            clip: true\n            height: tabs_list.height\n            width: {\n                var result = tabs_list.width/tabs_list.count\n                if(result < minimumTabSize)\n                    result = minimumTabSize\n                if(result > maximumTabSize)\n                    result = maximumTabSize\n                return result\n            }\n\n            Rectangle {\n                anchors.verticalCenter: parent.bottom\n                anchors.horizontalCenter: parent.horizontalCenter\n                width: 16*Devices.density\n                height: width\n                rotation: 45\n                transformOrigin: Item.Center\n            }\n        }\n    }\n\n    Rectangle {\n        width: parent.width\n        anchors.top: tabs_list.bottom\n        anchors.bottom: parent.bottom\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/TextArea.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport QtQuick.Controls 2.2 as QtControls\n\nQtControls.TextArea {\n    id: field\n    implicitWidth: -1\n\n    property alias placeholder: pholder.text\n\n    QtControls.Label {\n        id: pholder\n        opacity: minMode? 1 : 0.6\n        scale: minMode? 0.8 : 1\n        transformOrigin: LayoutMirroring.enabled? Item.Right : Item.Left\n        y: minMode? field.topInset - height : field.topPadding\n        x: LayoutMirroring.enabled? parent.width - width - xPad : xPad\n        color: field.focus? field.selectionColor : field.color\n\n        readonly property bool minMode: field.text.length || field.preeditText.length\n        property real xPad: minMode? 0 : LayoutMirroring.enabled? field.rightPadding : field.leftPadding\n\n        Behavior on opacity {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n        Behavior on scale {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n        Behavior on y {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n        Behavior on xPad {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/TextCursorArea.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport QtQuick.Controls 2.0 as QtControls\nimport AsemanQml.GraphicalEffects 2.0\nimport QtQuick.Window 2.2\nimport AsemanQml.Awesome 2.0\n\nItem {\n    id: tcarea\n    anchors.fill: textItem\n\n    property color color: \"#03A9F4\"\n    property color backgroundColor: \"#ffffff\"\n\n    property Item textItem: parent\n    property Item cursorParent: Window.contentItem\n\n    readonly property bool selected: textItem && textItem.selectionStart != textItem.selectionEnd\n    property alias menuMore: menuRect.more\n\n    property alias active: marea.visible\n    property real topPadding: 20\n\n    property variant menuMap: {\n        if(selected)\n            return [\n                        {\"name\": qsTr(\"Copy\"), \"action\": function() { textItem.copy(); hideMenu() }},\n                        {\"name\": qsTr(\"Delete\"), \"action\": function() { textItem.remove(textItem.selectionStart, textItem.selectionEnd); hideMenu() }},\n                        {\"name\": \"<font family=\\\"%1\\\">%2</font>\".arg(Awesome.family).arg(Awesome.fa_ellipsis_v), \"action\": function() { menuMore = true }}\n                    ]\n        else\n            return [\n                        {\"name\": qsTr(\"Paste\"), \"action\": function() { textItem.paste(); hideMenu() }},\n                        {\"name\": qsTr(\"Select All\"), \"action\": function() { textItem.selectAll(); menuRect.showCursor() }}\n                    ]\n    }\n    property variant menuMoreMap: [\n        {\"name\": qsTr(\"Cut\"), \"action\": function() { textItem.cut(); hideMenu() }},\n        {\"name\": (selected? qsTr(\"Paste\") : qsTr(\"Copy\")), \"action\": function() {\n            if(selected)\n                textItem.paste()\n            else\n                textItem.copy()\n            hideMenu()\n        }},\n        {\"name\": qsTr(\"Select All\"), \"action\": function() { textItem.selectAll(); menuRect.showCursor() }},\n        {\"name\": \"<font family=\\\"%1\\\">%2</font>\".arg(Awesome.family).arg(Awesome.fa_angle_left), \"action\": function() { menuMore = false }}\n    ]\n\n    onCursorParentChanged: if(menuRect.visible) menuRect.showCursor()\n\n    Connections {\n        target: textItem\n        onActiveFocusChanged: {\n            if(!textItem.activeFocus) {\n                hideMenu()\n            }\n            else\n            if(active) {\n            }\n        }\n    }\n\n    AsemanObject {\n        id: prv\n        property Item cursor0\n        property Item cursor1\n        property bool forceHidden: true\n\n        property string itemText: textItem? textItem.text : \"\"\n        property string nonEmptyText\n\n        onNonEmptyTextChanged: {\n            forceHidden = true\n        }\n        onItemTextChanged: {\n            if (itemText.length == 0)\n                return\n\n            nonEmptyText = itemText\n        }\n        onForceHiddenChanged: if(forceHidden) menuRect.visible = false\n\n        function switchCursors() {\n            var tmp = cursor0.propertyName\n            cursor0.propertyName = cursor1.propertyName\n            cursor1.propertyName = tmp\n        }\n    }\n\n    PointMapListener { id: mapListener; source: tcarea; dest: cursorParent }\n\n    Item {\n        id: menuRect\n        x: mapListener.result.x + extraX\n        y: mapListener.result.y + extraY\n        width: menuBack.width + 10*Devices.density\n        height: menuBack.height + 10*Devices.density\n        visible: false\n        parent: cursorParent\n        clip: true\n        z: 1000002\n\n        property real extraX\n        property real extraY\n\n        onVisibleChanged: {\n            if(!visible) more = false\n            if(visible)\n                BackHandler.pushHandler(menuRect, function(){ menuRect.visible = false; textItem.deselect() } )\n            else\n                BackHandler.removeHandler(menuRect)\n        }\n\n        property alias more: moreHandler.active\n\n        BackAction { id: moreHandler }\n\n        DropShadow {\n            anchors.fill: menuItem\n            horizontalOffset: 0\n            verticalOffset: 1*Devices.density\n            radius: 8*Devices.density\n            samples: 16\n            color: \"#80000000\"\n            source: menuItem\n            cached: true\n        }\n\n        Item {\n            id: menuItem\n            anchors.fill: parent\n\n            Rectangle {\n                id: menuBack\n                anchors.centerIn: parent\n                width: menuRect.more? menuColumn.width : menuRow.width\n                height: menuRect.more? menuColumn.height : menuRow.height\n                color: tcarea.backgroundColor\n                radius: 3*Devices.density\n\n                Behavior on width {\n                    NumberAnimation { easing.type: Easing.OutCubic; duration: 300 }\n                }\n                Behavior on height {\n                    NumberAnimation { easing.type: Easing.OutCubic; duration: 300 }\n                }\n\n                NullMouseArea { anchors.fill: parent }\n            }\n\n            Column {\n                id: menuColumn\n                visible: menuRect.more\n                x: 5*Devices.density\n                y: x\n\n                Repeater {\n                    model: menuMoreMap\n                    delegate: QtControls.Button {\n                        text: data.name\n                        flat: true\n                        width: 128*Devices.density\n                        focusPolicy: Qt.NoFocus\n                        onClicked: data.action()\n\n                        property variant data: menuMoreMap[index]\n                        Component.onCompleted: {\n                            if(text.indexOf(Awesome.family) != -1) {\n                                font.pixelSize = 13*Devices.fontDensity\n                            }\n                        }\n                    }\n                }\n            }\n\n            Row {\n                id: menuRow\n                visible: !menuRect.more\n                x: 5*Devices.density\n                y: x\n\n                Repeater {\n                    model: menuMap\n                    delegate: QtControls.Button {\n                        text: data.name\n                        flat: true\n                        focusPolicy: Qt.NoFocus\n                        anchors.verticalCenter: parent.verticalCenter\n                        onClicked: data.action()\n\n                        property variant data: menuMap[index]\n                        Component.onCompleted: {\n                            if(text.indexOf(Awesome.family) != -1) {\n                                font.pixelSize = 13*Devices.fontDensity\n                                width = height*0.75\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        function showCursor() {\n            var cItem = cursorParent\n            var minX = cItem.width\n            var maxX = 0\n            var minY = cItem.height\n            var maxY = 0\n            for(var i=textItem.selectionStart; i<=textItem.selectionEnd; i++) {\n                var rect = textItem.positionToRectangle(i)\n                if(rect.x < minX)\n                    minX = rect.x\n                if(rect.x + rect.width > maxX)\n                    maxX = rect.x + rect.width\n                if(rect.y < minY)\n                    minY = rect.y\n                if(rect.y + rect.height > maxY)\n                    maxY = rect.y + rect.height\n            }\n\n            var pnt = tcarea.mapToItem(cItem, 0, 0)\n            minX += pnt.x\n            maxX += pnt.x\n            minY += pnt.y\n            maxY += pnt.y\n\n            var mrX = (maxX+minX)/2 - menuRect.width/2\n            if(mrX < 0)\n                mrX = 0\n            if(mrX + menuRect.width > cItem.width)\n                mrX = cItem.width - menuRect.width\n\n            var mrY = minY - menuRect.height + 5*Devices.density\n            if(mrY < 0)\n                mrY = maxY + 30*Devices.density\n            if(mrY + menuRect.height > cItem.height)\n                mrY = cItem.height/2 - height/2\n\n            extraX = mrX - pnt.x\n            extraY = mrY - pnt.y\n\n            menuRect.visible = true\n            menuRect.more = false\n        }\n    }\n\n    MouseArea {\n        id: marea\n        anchors.fill: parent\n        visible: Devices.isAndroid && AsemanApp.qpaNoTextHandles\n        onPressAndHold: {\n            textItem.focus = true\n            textItem.forceActiveFocus()\n            prv.forceHidden = false\n            menuRect.visible = false\n            textItem.cursorVisible = false\n//            textItem.focus = false\n            var pos = textItem.positionAt(mouseX, mouseY)\n            textItem.cursorPosition = pos\n            textItem.selectWord()\n            menuRect.showCursor()\n        }\n        onClicked: {\n            prv.forceHidden = false\n            var pos = textItem.positionAt(mouseX, mouseY)\n            if(textItem.selectionStart != textItem.selectionEnd &&\n               textItem.selectionStart < pos &&\n               textItem.selectionEnd > pos && !menuRect.visible) {\n                menuRect.showCursor()\n            } else {\n                textItem.deselect()\n                textItem.cursorPosition = pos\n                textItem.cursorVisible = true\n                textItem.focus = true\n                textItem.forceActiveFocus()\n                menuRect.visible = false\n                Devices.showKeyboard()\n            }\n        }\n    }\n\n    Item {\n        id: cursorsScene\n        width: tcarea.width\n        height: tcarea.height\n        parent: cursorParent\n        x: mapListener.result.x\n        y: mapListener.result.y\n        z: 1000001\n        visible: textItem && textItem.visible && textItem.activeFocus\n    }\n\n    Component {\n        id: cursorComponent\n        Item {\n            id: cursorHandle\n            width: 24*Devices.density\n            height: width\n            x: customPoint.x? customPoint.x : pnt.x - width/2 + leftPadding\n            y: customPoint.y? customPoint.y : pnt.y + topPadding\n            visible: {\n                if(prv.forceHidden)\n                    return false\n                if(textItem.text.length == 0)\n                    return false\n                if(textItem && textItem.selectionStart != textItem.selectionEnd)\n                    return true\n                if(propertyName == \"selectionStart\")\n                    return true\n                return false\n            }\n\n            property real topPadding: textItem.topPadding? textItem.topPadding : 0\n            property real leftPadding: textItem.leftPadding? textItem.leftPadding : 0\n\n            Behavior on x {\n                NumberAnimation { easing.type: Easing.OutCubic; duration: customPoint.x? 0 : 300 }\n            }\n            Behavior on y {\n                NumberAnimation { easing.type: Easing.OutCubic; duration: customPoint.y? 0 : 300 }\n            }\n\n            property string propertyName: \"selectionStart\"\n\n            property point pnt: {\n                if(!textItem)\n                    return Qt.point(-1, -1)\n                if(textItem.selectionStart == textItem.selectionEnd && propertyName == \"selectionEnd\")\n                    return Qt.point(-1, -1)\n\n                var point = textItem.positionToRectangle(textItem[propertyName])\n                return Qt.point(point.x + point.width/2, point.y + point.height)\n            }\n            property point customPoint: Qt.point(0, 0)\n\n            Item {\n                  id: mycanvas\n                  anchors.fill: parent\n                  rotation: {\n                      var reverse = (textItem && textItem.horizontalAlignment==TextEdit.AlignRight? -1 : 1)\n                      if(textItem && textItem.selectionStart == textItem.selectionEnd)\n                          return 0\n                      else\n                      if(propertyName == \"selectionStart\")\n                          return 45*reverse\n                      else\n                          return -45*reverse\n                  }\n                  transformOrigin: Item.Top\n\n                  Rectangle {\n                      id: src\n                      anchors.fill: parent\n                      color: tcarea.color\n                      visible: false\n                  }\n\n                  Image {\n                      id: mask\n                      anchors.fill: parent\n                      source: \"files/text_select_handle_middle.png\"\n                      visible: false\n                  }\n\n                  OpacityMask {\n                      anchors.fill: parent\n                      source: src\n                      maskSource: mask\n                      cached: true\n                  }\n\n                  Behavior on rotation {\n                      NumberAnimation { easing.type: Easing.OutCubic; duration: 300 }\n                  }\n              }\n\n            MouseArea {\n                anchors.fill: parent\n                anchors.leftMargin: -10*Devices.density\n                anchors.rightMargin: -10*Devices.density\n                anchors.bottomMargin: -30*Devices.density\n                onPositionChanged: {\n                    var deltaX = mouseX-pinX\n                    var deltaY = mouseY-pinY\n\n                    customPoint.x = cursorHandle.x + deltaX\n                    customPoint.y = cursorHandle.y + deltaY\n\n                    var pos = textItem.positionAt(cursorHandle.x + cursorHandle.width/2, cursorHandle.y)\n                    if(textItem.selectionStart == textItem.selectionEnd && propertyName == \"selectionStart\") {\n                        textItem.cursorPosition = pos\n                    } else if(propertyName == \"selectionStart\") {\n                        if(pos < textItem.selectionEnd)\n                            textItem.select(pos, textItem.selectionEnd)\n                        else {\n                            prv.switchCursors()\n                            var rcvr = textItem.selectionEnd\n                            if(rcvr == pos)\n                                pos++\n                            textItem.select(rcvr, pos)\n                        }\n                    } else {\n                        if(pos > textItem.selectionStart)\n                            textItem.select(textItem.selectionStart, pos)\n                        else {\n                            prv.switchCursors()\n                            var rcvr = textItem.selectionStart\n                            if(rcvr == pos)\n                                pos--\n                            textItem.select(pos, rcvr)\n                        }\n                    }\n                }\n                onPressed: {\n                    pinPos = textItem[propertyName]\n                    menuRect.visible = false\n                    pinX = width/2\n                    pinY = height\n                }\n                onReleased: {\n                    customPoint = Qt.point(0, 0)\n                    menuRect.showCursor()\n                }\n\n                property real pinX\n                property real pinY\n                property int pinPos\n            }\n        }\n    }\n\n    function hideMenu() {\n        menuRect.visible = false\n    }\n\n    function close() {\n        hideMenu()\n        prv.forceHidden = true\n    }\n\n    Component.onCompleted: {\n        prv.cursor0 = cursorComponent.createObject(cursorsScene, {\"propertyName\": \"selectionStart\"})\n        prv.cursor1 = cursorComponent.createObject(cursorsScene, {\"propertyName\": \"selectionEnd\"})\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/TextField.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport QtQuick.Controls 2.2 as QtControls\n\nQtControls.TextField {\n    id: field\n    implicitWidth: -1\n\n    property alias placeholder: pholder.text\n\n    QtControls.Label {\n        id: pholder\n        opacity: minMode? 1 : 0.6\n        scale: minMode? 0.8 : 1\n        transformOrigin: LayoutMirroring.enabled? Item.Right : Item.Left\n        y: minMode? field.topInset - height : parent.height/2 - height/2 - (field.bottomPadding - field.topPadding)/2\n        x: LayoutMirroring.enabled? parent.width - width - xPad : xPad\n        color: field.focus? field.selectionColor : field.color\n\n        readonly property bool minMode: field.text.length || field.preeditText.length\n        property real xPad: minMode? 0 : LayoutMirroring.enabled? field.rightPadding : field.leftPadding\n\n        Behavior on opacity {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n        Behavior on scale {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n        Behavior on y {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n        Behavior on xPad {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/Tooltip.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport AsemanQml.GraphicalEffects 2.0\n\nItem {\n    id: tooltip\n    width: tooltipScene.width\n    height: tooltipScene.height\n\n    property int interval: 1500\n    property real padding: 8*Devices.density\n\n    property alias textFont: txt.font\n    property alias textColor: txt.color\n    property alias color: tooltipRect.color\n\n    Item {\n        id: tooltipScene\n        width: tooltipRect.width + 32*Devices.density\n        height: tooltipRect.height + 32*Devices.density\n        anchors.centerIn: parent\n        visible: opacity != 0\n        opacity: 0\n\n        Behavior on opacity {\n            NumberAnimation { id: anim_item; easing.type: Easing.OutCubic; duration: 250 }\n        }\n\n        Rectangle {\n            id: tooltipRect\n            width: txt.width + padding*2\n            height: txt.height + padding*1.5\n            anchors.centerIn: parent\n            radius: 3*Devices.density\n            color: \"#fefefe\"\n\n            Text {\n                id: txt\n                anchors.centerIn: parent\n                font.pixelSize: 10*Devices.fontDensity\n                font.family: AsemanApp.globalFont.family\n                color: \"#333\"\n            }\n        }\n    }\n\n    Timer{\n        id: hide_timer\n        interval: tooltip.interval + 250\n        repeat: false\n        onTriggered: tooltipScene.opacity = 0\n    }\n\n    function showText( text ){\n        txt.text = text\n        tooltipScene.opacity = 0.9\n        hide_timer.restart()\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/private/GlobalBusyDialog.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport QtQuick.Controls 2.0\nimport AsemanQml.GraphicalEffects 2.0\n\nItem {\n    id: gbDialog\n    anchors.fill: parent\n\n    property color color: \"#fefefe\"\n    property alias text: label.text\n    property alias textColor: label.color\n    property alias font: label.font\n    property bool blockBack: false\n    property alias scene: scene_prv\n\n    NullMouseArea { anchors.fill: parent }\n\n    Rectangle {\n        anchors.fill: parent\n        opacity: 0.4\n        color: {\n            var c = gbDialog.color\n            if( (c.r + c.g + c.b)/3 < 0.5 )\n                return \"#ffffff\"\n            else\n                return \"#000000\"\n        }\n    }\n\n    DropShadow {\n        anchors.fill: shadowSource\n        horizontalOffset: 0\n        verticalOffset: 5*Devices.density\n        radius: 32*Devices.density\n        samples: 32\n        color: \"#70000000\"\n        source: shadowSource\n        cached: true\n    }\n\n    Item {\n        id: shadowSource\n        width: scene_prv.width + 60*Devices.density\n        height: scene_prv.height + 60*Devices.density\n        anchors.centerIn: parent\n\n        Rectangle {\n            id: scene_prv\n            color: gbDialog.color\n            anchors.centerIn: parent\n            width: row.width + 40*Devices.density\n            height: row.height + 40*Devices.density\n            radius: 3*Devices.density\n\n            Row {\n                id: row\n                anchors.centerIn: parent\n                spacing: 8*Devices.density\n\n                BusyIndicator {\n                    running: true\n                    height: 48*Devices.density\n                    width: height\n                    anchors.verticalCenter: parent.verticalCenter\n                }\n\n                Label {\n                    id: label\n                    anchors.verticalCenter: parent.verticalCenter\n                }\n            }\n        }\n    }\n\n    Component.onCompleted: {\n        BackHandler.pushHandler(this, function(){\n            if(blockBack)\n                return false\n            else\n                BackHandler.back()\n        })\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/Controls/qmldir",
    "content": "module AsemanQml.Controls\nAsemanApplication 2.0 AsemanApplication.qml\nAsemanWindow 2.0 AsemanWindow.qml\nCircularProgressBar 2.0 CircularProgressBar.qml\nDateTimeChooser 2.0 DateTimeChooser.qml\nDrawer 2.0 Drawer.qml\nExtendedFab 2.0 ExtendedFab.qml\nHeader 2.0 Header.qml\nHeaderMenuButton 2.0 HeaderMenuButton.qml\nHelper 2.0 Helper.qml\nHelperPoint 2.0 HelperPoint.qml\nMenuIcon 2.0 MenuIcon.qml\nPanelFlicker 2.0 PanelFlicker.qml\nHScrollBar 2.0 HScrollBar.qml\nDynamicTabBar 2.0 DynamicTabBar.qml\nTabView 2.0 TabView.qml\nTextField 2.0 TextField.qml\nTooltip 2.0 Tooltip.qml\nSlider 2.0 Slider.qml\nTextArea 2.0 TextArea.qml\nTextCursorArea 2.0 TextCursorArea.qml\nPanelDrawer 2.0 PanelDrawer.qml\n"
  },
  {
    "path": "src/asemanqml/controls/asemanqttoolsitemcontrols.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtToolsItemControls is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtToolsItemControls is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanqttoolsitemcontrols.h\"\n\n#include <qqml.h>\n#include <QHash>\n#include <QPointer>\n#include <QFile>\n#include <QDir>\n#include <QSet>\n\nstatic QStringList aseman_qt_tools_indexCache;\nstatic QString aseman_qt_tools_destination;\n\nvoid AsemanQtToolsItemControls::registerTypes(const char *uri, bool exportMode)\n{\n    static QSet<QByteArray> register_list;\n    if(register_list.contains(uri) && !exportMode)\n        return;\n\n    register_list.insert(uri);\n}\n\nvoid AsemanQtToolsItemControls::registerFiles(const QString &filesLocation, const char *uri)\n{\n    QFile file(filesLocation + QStringLiteral(\"/qmldir\"));\n    if(file.open(QFile::ReadOnly))\n    {\n        QStringList lines = QString::fromUtf8(file.readAll()).split(QStringLiteral(\"\\n\"), Qt::SkipEmptyParts);\n        file.close();\n\n        for(const QString &l: lines)\n        {\n            QStringList parts = l.trimmed().split(QStringLiteral(\" \"), Qt::SkipEmptyParts);\n            bool singleton = false;\n            if(parts.count() && parts.first() == \"singleton\")\n                singleton = parts.takeFirst().count();\n            if(parts.length() != 3)\n                continue;\n\n            QStringList version = parts.at(1).split(QStringLiteral(\".\"), Qt::SkipEmptyParts);\n            if(version.count() != 2)\n                continue;\n\n            if(singleton)\n                qmlRegisterSingletonType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                         uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n            else\n                qmlRegisterType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n        }\n    }\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemControls::registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemControls::registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportModel<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemControls::registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterSingletonType<T>(uri, versionMajor, versionMinor, typeName, callback);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemControls::registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(qmlName));\n    else\n        return qmlRegisterUncreatableType<T>(uri, versionMajor, versionMinor, qmlName, reason);\n    return 0;\n}\n\n\nvoid AsemanQtToolsItemControls::exportDocuments(const QString &destination)\n{\n    aseman_qt_tools_destination = destination;\n\n    QDir().mkpath(aseman_qt_tools_destination);\n    aseman_qt_tools_indexCache.clear();\n\n    AsemanQtToolsItemControls::registerTypes(\"AsemanToolsItem\", true);\n\n    QString index = QStringLiteral(\"# AsemanToolsItem Documents\\n\\n\");\n    index += QStringLiteral(\"### [Getting Started](gettingstarted.md)\\n\\n\");\n    index += QStringLiteral(\"### How to import:\\n\\n\");\n    index += QStringLiteral(\"```c++\\nimport AsemanQml.Base 2.0\\n```\\n\\nor\\n\\n\"\n             \"```c++\\nimport AsemanQml.Base 2.0 as Aseman\\n```\\n\\n\");\n    index += QStringLiteral(\"### Types\\n\\nHere are all components of the AsemanToolsItem:\\n\\n\");\n    for(const QString cmpnt: aseman_qt_tools_indexCache)\n    {\n        if(cmpnt == QStringLiteral(\"MimeData\"))\n            index += QStringLiteral(\"\\n##### Normal types\\n\\n\");\n        if(cmpnt == QStringLiteral(\"MixedListModel\"))\n            index += QStringLiteral(\"\\n##### Models\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Devices\"))\n            index += QStringLiteral(\"\\n##### Singletons\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Screen\"))\n            index += QStringLiteral(\"\\n##### Uncreatable types\\n\\n\");\n        index += QStringLiteral(\" * [%1](%2.md)\\n\").arg(cmpnt).arg(cmpnt.toLower());\n    }\n\n    QString path = aseman_qt_tools_destination + \"/start.md\";\n    aseman_qt_tools_destination.clear();\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return;\n\n    file.write(index.toUtf8());\n    file.close();\n}\n\nQString AsemanQtToolsItemControls::fixType(const QString &type)\n{\n    if(type == QStringLiteral(\"QSizeF\") || type == QStringLiteral(\"QSize\"))\n        return QStringLiteral(\"size\");\n    if(type == QStringLiteral(\"QPoint\") || type == QStringLiteral(\"QPointF\"))\n        return QStringLiteral(\"point\");\n    if(type == QStringLiteral(\"QUrl\"))\n        return QStringLiteral(\"url\");\n    if(type == QStringLiteral(\"QString\"))\n        return QStringLiteral(\"string\");\n    if(type == QStringLiteral(\"QByteArray\"))\n        return QStringLiteral(\"byte\");\n    if(type == QStringLiteral(\"bool\"))\n        return QStringLiteral(\"boolean\");\n    if(type == QStringLiteral(\"double\") || type == QStringLiteral(\"qreal\"))\n        return QStringLiteral(\"real\");\n    if(type == QStringLiteral(\"QVariant\"))\n        return QStringLiteral(\"variant\");\n    if(type == QStringLiteral(\"QJSValue\"))\n        return QStringLiteral(\"function(){[code]}\");\n    if(type == QStringLiteral(\"QVariantMap\"))\n        return QStringLiteral(\"map\");\n    if(type == QStringLiteral(\"QVariantList\"))\n        return QStringLiteral(\"list&lt;variant&gt;\");\n    if(type == QStringLiteral(\"QStringList\"))\n        return QStringLiteral(\"list&lt;string&gt;\");\n    if(type == QStringLiteral(\"QList<qint32>\"))\n        return QStringLiteral(\"list&lt;int&gt;\");\n    if(type.contains(QStringLiteral(\"*\")))\n    {\n        if(type == QStringLiteral(\"QObject*\"))\n            return QStringLiteral(\"object\");\n        if(type.contains(QStringLiteral(\"Telegram\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Telegram\"));\n            return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n        }\n        if(type.contains(QStringLiteral(\"Object\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Object\"));\n            return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                    .arg(name).arg(name.toLower());\n        }\n        if(type == QStringLiteral(\"QQmlComponent*\"))\n            return QStringLiteral(\"Component\");\n        if(type == QStringLiteral(\"QQuickItem\"))\n            return QStringLiteral(\"Item\");\n    }\n    if(type.contains(QStringLiteral(\"Telegram\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Telegram\"));\n        return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n    }\n    if(type == QStringLiteral(\"QQuickItem\"))\n        return QStringLiteral(\"Item\");\n    if(type == QStringLiteral(\"QObject\"))\n        return QStringLiteral(\"object\");\n    if(type.contains(QStringLiteral(\"Object\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Object\"));\n        return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                .arg(name).arg(name.toLower());\n    }\n    return type;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemControls::exportItem(const QString &module, int major, int minor, const QString &component, bool store)\n{\n    QString result;\n    aseman_qt_tools_indexCache << component;\n\n    QMetaObject meta = T::staticMetaObject;\n    QString inherits = fixType(QString::fromUtf8(meta.superClass()? meta.superClass()->className() : \"\"));\n    bool isModel = component.toLower().contains(QStringLiteral(\"model\"));\n\n    result += QStringLiteral(\"# %1\\n\\n\").arg(component);\n\n    QString headers;\n    headers += QStringLiteral(\" * [Component details](#component-details)\\n\");\n\n    QString details = QStringLiteral(\"\\n### Component details:\\n\\n\");\n    details += QStringLiteral(\"|Detail|Value|\\n\"\n                       \"|------|-----|\\n\");\n    details += QStringLiteral(\"|%1|%2 %3.%4|\\n\").arg(QStringLiteral(\"Import\")).arg(module).arg(major).arg(minor);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Component\")).arg(component);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"C++ class\")).arg(QString::fromUtf8(meta.className()));\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Inherits\")).arg(inherits);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Model\")).arg(QString::fromUtf8(isModel?\"Yes\":\"No\"));\n\n    QString resultProperties;\n    QStringList propertiesSignals;\n    for(int i=0; i<meta.propertyCount(); i++)\n    {\n        QMetaProperty property = meta.property(i);\n        const QString &propertyName = QString::fromUtf8(property.name());\n        const QString &propertyType = fixType(QString::fromUtf8(property.typeName()));\n        propertiesSignals << QString::fromUtf8(property.notifySignal().name());\n\n        QString text = QStringLiteral(\"* <font color='#074885'><b>%1</b></font>: %2\").arg(propertyName).arg(propertyType);\n        if(!property.isWritable())\n            text += QStringLiteral(\" (readOnly)\");\n\n        text += QStringLiteral(\"\\n\");\n        if(meta.propertyOffset()<=i)\n            resultProperties += text;\n    }\n\n    QString enumResults;\n    for(int i=meta.enumeratorOffset(); i<meta.enumeratorCount(); i++)\n    {\n        QMetaEnum enumerator = meta.enumerator(i);\n        const QString &enumName = QString::fromUtf8(enumerator.name());\n\n        enumResults += QStringLiteral(\"\\n##### %1\\n\\n\").arg(enumName);\n        enumResults += QStringLiteral(\"|Key|Value|\\n\"\n                               \"|---|-----|\\n\");\n\n        for(int j=0; j<enumerator.keyCount(); j++)\n            enumResults += QStringLiteral(\"|%1|%2|\\n\").arg(QString::fromUtf8(enumerator.key(j))).arg(enumerator.value(j));\n    }\n\n    QString resultSlots;\n    QString resultSignals;\n    for(int i=meta.methodOffset(); i<meta.methodCount(); i++)\n    {\n        QMetaMethod method = meta.method(i);\n        if(method.access() != QMetaMethod::Public)\n            continue;\n\n        const QString &methodName = QString::fromUtf8(method.name());\n        if(propertiesSignals.contains(methodName))\n            continue;\n\n        const QString &methodType = fixType(QString::fromUtf8(method.typeName()));\n\n        QString args;\n        const QList<QByteArray> &paramNames = method.parameterNames();\n        const QList<QByteArray> &paramTypes = method.parameterTypes();\n        for(int j=0; j<paramNames.count(); j++)\n        {\n            if(j != 0)\n                args += QStringLiteral(\", \");\n\n            args += fixType(QString::fromUtf8(paramTypes[j])) + QStringLiteral(\" \") + paramNames[j];\n        }\n\n        QString text = QStringLiteral(\" * %1 <font color='#074885'><b>%2</b></font>(%3)\\n\").arg(methodType).arg(methodName).arg(args);\n        switch(static_cast<int>(method.methodType()))\n        {\n        case QMetaMethod::Slot:\n            resultSlots += text;\n            break;\n        case QMetaMethod::Signal:\n            resultSignals += text;\n            break;\n        }\n    }\n\n    if(!resultProperties.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Normal Properties](#normal-properties)\\n\");\n        resultProperties = QStringLiteral(\"\\n### Normal Properties\\n\\n\") + resultProperties;\n    }\n    if(!enumResults.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Enumerator](#enumerator)\\n\");\n        enumResults = QStringLiteral(\"\\n### Enumerator\\n\\n\") + enumResults;\n    }\n    if(!resultSlots.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Methods](#methods)\\n\");\n        resultSlots = QStringLiteral(\"\\n### Methods\\n\\n\") + resultSlots;\n    }\n    if(!resultSignals.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Signals](#Q_SIGNALS)\\n\");\n        resultSignals = QStringLiteral(\"\\n### Signals\\n\\n\") + resultSignals;\n    }\n    if(isModel)\n        headers += QStringLiteral(\" * [Roles](#roles)\\n\");\n\n    result += headers + QStringLiteral(\"\\n\");\n    result += details + QStringLiteral(\"\\n\");\n    result += resultProperties + QStringLiteral(\"\\n\");\n    result += resultSlots + QStringLiteral(\"\\n\");\n    result += resultSignals + QStringLiteral(\"\\n\");\n    result += enumResults + QStringLiteral(\"\\n\");\n\n    if(!store)\n        return result;\n\n    QString path = aseman_qt_tools_destination + QStringLiteral(\"/\") + component.toLower() + QStringLiteral(\".md\");\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemControls::exportModel(const QString &module, int major, int minor, const QString &component)\n{\n    QString result = exportItem<T>(module, major, minor, component, false);\n    T *model = new T();\n\n    QHash<qint32,QByteArray> roleNames = model->roleNames();\n    QMap<qint32,QByteArray> rolesMap;\n    QHashIterator<qint32,QByteArray> i(roleNames);\n    while(i.hasNext())\n    {\n        i.next();\n        rolesMap[i.key()] = i.value();\n    }\n\n    result += QStringLiteral(\"\\n### Roles\\n\\n\");\n    Q_FOREACH(const QByteArray &name, rolesMap)\n        result += QStringLiteral(\" * model.<font color='#074885'>%1</font>\\n\").arg(QString::fromUtf8(name));\n\n    delete model;\n\n    QString path = aseman_qt_tools_destination + \"/\" + component.toLower() + \".md\";\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n"
  },
  {
    "path": "src/asemanqml/controls/asemanqttoolsitemcontrols.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQTTOOLSITEMCONTROLS_H\n#define ASEMANQTTOOLSITEMCONTROLS_H\n\n#include <QtGlobal>\n#include <QString>\n\n#include <asemanqttools.h>\n\nclass QObject;\nclass QQmlEngine;\nclass QJSEngine;\nclass AsemanQtToolsItemControls: public AsemanQtTools\n{\npublic:\n    static void registerTypes(const char *uri, bool exportMode = false);\n    static void registerFiles(const QString &filesLocation, const char *uri);\n\n    template<typename T>\n    static int registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template<typename T>\n    static int registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template <typename T>\n    static int registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName,\n                                 QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode);\n\n    template<typename T>\n    static int registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason, bool exportMode);\n\n    static void exportDocuments(const QString &destination);\n\nprotected:\n    template<typename T>\n    static QString exportItem(const QString &module, int major, int minor, const QString &component, bool store = true);\n    template<typename T>\n    static QString exportModel(const QString &module, int major, int minor, const QString &component);\n\n    static QString fixType(const QString &type);\n};\n\n#endif // ASEMANQTTOOLSITEMCONTROLS_H\n"
  },
  {
    "path": "src/asemanqml/controls/controls.pri",
    "content": "INCLUDEPATH += $$PWD\nQT += qml core gui \n\nHEADERS += \\\n    $$PWD/controlsplugin.h \\\n    $$PWD/asemanqttoolsitemcontrols.h\n\nSOURCES += \\\n    $$PWD/controlsplugin.cpp \\\n    $$PWD/asemanqttoolsitemcontrols.cpp\n\nstatic: !linux: !win32: DEFINES += ASEMAN_STATIC_BUILD\n\nASEMAN_QML_FILES = $$files($$PWD/Controls/*.*) $$PWD/Controls/qmldir\nASEMAN_QML_PRIVATES = $$files($$PWD/Controls/private/*)\nASEMAN_QML_RESOURCES = $$files($$PWD/Controls/files/*)\n\nINCLUDED_RESOURCE_FILES = \\\n    $$ASEMAN_QML_FILES \\\n    $$ASEMAN_QML_PRIVATES \\\n    $$ASEMAN_QML_RESOURCES\n\nasemancontrols.files = $$INCLUDED_RESOURCE_FILES\nasemancontrols.prefix = /AsemanQml/\n\ncontains(DEFINES, QT_ASEMAN_EMBEDDED) {\n    RESOURCES += $$PWD/qmake_asemancontrols.qrc\n} else {\n    RESOURCES += asemancontrols\n}\n"
  },
  {
    "path": "src/asemanqml/controls/controls.pro",
    "content": "TARGET  = asemanqmlcontrols\nTARGETPATH = AsemanQml/Controls\nIMPORT_VERSION = 2.0\n\nQT += asemanqml asemancore\ninclude(controls.pri)\n\nload(qml_plugin)\n"
  },
  {
    "path": "src/asemanqml/controls/controlsplugin.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"controlsplugin.h\"\n#include \"asemanqttoolsitemcontrols.h\"\n\n#include <QDebug>\n#include <QDir>\n#include <QStringList>\n#include <QtQml>\n\n#ifdef QT_ASEMAN_EMBEDDED\nbool asemanqml_controls_plugin_registered = AsemanControlsPlugin::registerStaticTypes(\"AsemanQml.Controls\");\n#endif\n\nbool AsemanControlsPlugin::registerStaticTypes(const char *uri)\n{\n    Q_INIT_RESOURCE(qmake_asemancontrols);\n    AsemanQtToolsItemControls::registerTypes(uri);\n    AsemanQtToolsItemControls::registerFiles(QStringLiteral(\":/AsemanQml/Controls\"), uri);\n    return true;\n}\n\nvoid AsemanControlsPlugin::registerTypes(const char *uri)\n{\n    AsemanControlsPlugin::registerStaticTypes(uri);\n}\n\nvoid AsemanControlsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)\n{\n    QQmlExtensionPlugin::initializeEngine(engine, uri);\n}\n"
  },
  {
    "path": "src/asemanqml/controls/controlsplugin.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANCONTROLSPLUGIN_H\n#define ASEMANCONTROLSPLUGIN_H\n\n#include <QQmlExtensionPlugin>\n\nclass AsemanControlsPlugin : public QQmlExtensionPlugin\n{\n    Q_OBJECT\n\n#ifndef QT_ASEMAN_EMBEDDED\n    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)\n#endif\n\npublic:\n    static bool registerStaticTypes(const char *uri);\n    void registerTypes(const char *uri);\n    void initializeEngine(QQmlEngine *engine, const char *uri);\n};\n\n#endif // ASEMANCONTROLSPLUGIN_H\n"
  },
  {
    "path": "src/asemanqml/controls/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Controls 2.0'\n\nModule {\n    dependencies: [\n        \"QtGraphicalEffects 1.12\",\n        \"QtQml 2.7\",\n        \"QtQml.Models 2.2\",\n        \"QtQml.WorkerScript 2.15\",\n        \"QtQuick 2.9\",\n        \"QtQuick.Controls 2.5\",\n        \"QtQuick.Controls.Fusion 2.15\",\n        \"QtQuick.Controls.Fusion.impl 2.15\",\n        \"QtQuick.Controls.IOSStyle 2.12\",\n        \"QtQuick.Controls.IOSStyle.impl 2.12\",\n        \"QtQuick.Controls.Imagine 2.15\",\n        \"QtQuick.Controls.Imagine.impl 2.15\",\n        \"QtQuick.Controls.Material 2.15\",\n        \"QtQuick.Controls.Material.impl 2.15\",\n        \"QtQuick.Controls.Styles 1.4\",\n        \"QtQuick.Controls.Styles.Plasma 2.0\",\n        \"QtQuick.Controls.Universal 2.15\",\n        \"QtQuick.Controls.Universal.impl 2.15\",\n        \"QtQuick.Controls.impl 2.15\",\n        \"QtQuick.Extras 1.4\",\n        \"QtQuick.Layouts 1.4\",\n        \"QtQuick.Templates 2.5\",\n        \"QtQuick.Window 2.6\",\n        \"org.kde.kconfig 1.0\",\n        \"org.kde.kirigami 2.9\",\n        \"org.kde.kquickcontrolsaddons 2.0\",\n        \"org.kde.plasma.components 3.0\",\n        \"org.kde.plasma.core 2.0\",\n        \"org.kde.plasma.extras 2.0\"\n    ]\n    Component {\n        prototype: \"AsemanApplicationItem\"\n        name: \"AsemanQml.Controls/AsemanApplication 2.0\"\n        exports: [\"AsemanQml.Controls/AsemanApplication 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"source\"; type: \"QUrl\" }\n        Property { name: \"appMain\"; type: \"QQuickWindow\"; isReadonly: true; isPointer: true }\n    }\n    Component {\n        prototype: \"QQuickApplicationWindow\"\n        name: \"AsemanQml.Controls/AsemanWindow 2.0\"\n        exports: [\"AsemanQml.Controls/AsemanWindow 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"contentData\"\n        Property { name: \"backController\"; type: \"bool\" }\n        Property { name: \"try_close\"; type: \"bool\" }\n        Property { name: \"portrait\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"masterPalette\"; type: \"QQuickSystemPalette\"; isReadonly: true; isPointer: true }\n        Property { name: \"tooltip\"; type: \"Tooltip_QMLTYPE_4\"; isReadonly: true; isPointer: true }\n        Signal { name: \"closeRequest\" }\n        Method { name: \"tryClose\"; type: \"QVariant\" }\n        Method {\n            name: \"showTooltip\"\n            type: \"QVariant\"\n            Parameter { name: \"text\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"showGlobalWait\"\n            type: \"QVariant\"\n            Parameter { name: \"text\"; type: \"QVariant\" }\n            Parameter { name: \"blockBack\"; type: \"QVariant\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/CircularProgressBar 2.0\"\n        exports: [\"AsemanQml.Controls/CircularProgressBar 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"lineWidth\"; type: \"double\" }\n        Property { name: \"progress\"; type: \"double\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"running\"; type: \"bool\" }\n        Property { name: \"progressText\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/DateTimeChooser 2.0\"\n        exports: [\"AsemanQml.Controls/DateTimeChooser 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"textsColor\"; type: \"QColor\" }\n        Property { name: \"dateVisible\"; type: \"bool\" }\n        Property { name: \"timeVisible\"; type: \"bool\" }\n        Property { name: \"calendarType\"; type: \"int\" }\n        Property { name: \"date\"; type: \"QDateTime\" }\n        Method { name: \"getDate\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/Drawer 2.0\"\n        exports: [\"AsemanQml.Controls/Drawer 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QVariant\" }\n        Property { name: \"handleWidth\"; type: \"double\" }\n        Property { name: \"percent\"; type: \"double\"; isReadonly: true }\n        Property { name: \"showed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"menuWidth\"; type: \"double\" }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Method { name: \"discard\"; type: \"QVariant\" }\n        Method { name: \"show\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/DynamicTabBar 2.0\"\n        exports: [\"AsemanQml.Controls/DynamicTabBar 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"minimumWidth\"; type: \"double\" }\n        Property { name: \"highlightColor\"; type: \"QColor\" }\n        Property { name: \"textColor\"; type: \"QColor\" }\n        Property { name: \"fontSize\"; type: \"double\" }\n        Property { name: \"fontFamily\"; type: \"string\" }\n        Property { name: \"displayRole\"; type: \"string\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"model\"; type: \"QVariant\" }\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Signal {\n            name: \"clicked\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/ExtendedFab 2.0\"\n        exports: [\"AsemanQml.Controls/ExtendedFab 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"fontSize\"; type: \"int\" }\n        Property { name: \"scrollArea\"; type: \"QQuickFlickable\"; isPointer: true }\n        Property { name: \"icon\"; type: \"string\" }\n        Property { name: \"textColor\"; type: \"QColor\" }\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"fontFamily\"; type: \"string\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/HScrollBar 2.0\"\n        exports: [\"AsemanQml.Controls/HScrollBar 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"scrollArea\"; type: \"QVariant\" }\n        Property { name: \"orientation\"; type: \"QVariant\" }\n        Property { name: \"forceVisible\"; type: \"bool\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Method { name: \"position\"; type: \"QVariant\" }\n        Method { name: \"size\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickRectangle\"\n        name: \"AsemanQml.Controls/Header 2.0\"\n        exports: [\"AsemanQml.Controls/Header 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"light\"; type: \"bool\" }\n        Property { name: \"statusBar\"; type: \"bool\" }\n        Property { name: \"centerText\"; type: \"bool\" }\n        Property { name: \"defaultHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"titleFont\"; type: \"QFont\" }\n        Property { name: \"titleFontSize\"; type: \"int\" }\n        Property { name: \"shadow\"; type: \"bool\" }\n        Property { name: \"shadowOpacity\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/HeaderMenuButton 2.0\"\n        exports: [\"AsemanQml.Controls/HeaderMenuButton 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"buttonColor\"; type: \"QColor\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/Helper 2.0\"\n        exports: [\"AsemanQml.Controls/Helper 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"borderPadding\"; type: \"double\" }\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Property {\n            name: \"currentItem\"\n            type: \"HelperPoint_QMLTYPE_46\"\n            isReadonly: true\n            isPointer: true\n        }\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"ratio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"duration\"; type: \"int\" }\n        Signal { name: \"finished\" }\n        Method { name: \"next\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/HelperPoint 2.0\"\n        exports: [\"AsemanQml.Controls/HelperPoint 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"title\"; type: \"string\" }\n        Property { name: \"description\"; type: \"string\" }\n        Property { name: \"icon\"; type: \"string\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"titleColor\"; type: \"QColor\" }\n        Property { name: \"descriptionColor\"; type: \"QColor\" }\n        Property { name: \"iconColor\"; type: \"QColor\" }\n        Property { name: \"titleFont\"; type: \"QFont\" }\n        Property { name: \"descriptionFont\"; type: \"QFont\" }\n        Property { name: \"iconFont\"; type: \"QFont\" }\n        Property { name: \"buttonText\"; type: \"string\" }\n        Property { name: \"classId\"; type: \"string\"; isReadonly: true }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/MenuIcon 2.0\"\n        exports: [\"AsemanQml.Controls/MenuIcon 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"_mirror\"; type: \"bool\"; isReadonly: true }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/PanelDrawer 2.0\"\n        exports: [\"AsemanQml.Controls/PanelDrawer 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"item\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"disableBack\"; type: \"bool\" }\n        Property { name: \"handleHeight\"; type: \"double\" }\n        Property { name: \"defaultHeight\"; type: \"double\" }\n        Property { name: \"percent\"; type: \"double\"; isReadonly: true }\n        Property { name: \"maximizable\"; type: \"bool\" }\n        Property { name: \"openFromTop\"; type: \"bool\" }\n        Property { name: \"showed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"menuHeight\"; type: \"double\" }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"maximize\"; type: \"bool\" }\n        Signal { name: \"clicked\" }\n        Method { name: \"discard\"; type: \"QVariant\" }\n        Method { name: \"show\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/PanelFlicker 2.0\"\n        exports: [\"AsemanQml.Controls/PanelFlicker 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QVariant\" }\n        Property { name: \"handleHeight\"; type: \"double\" }\n        Property { name: \"percent\"; type: \"double\"; isReadonly: true }\n        Property { name: \"bottomMenu\"; type: \"bool\" }\n        Property { name: \"showed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"menuHeight\"; type: \"double\" }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Method { name: \"discard\"; type: \"QVariant\" }\n        Method { name: \"show\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickSlider\"\n        name: \"AsemanQml.Controls/Slider 2.0\"\n        exports: [\"AsemanQml.Controls/Slider 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"labelDecimals\"; type: \"int\" }\n        Property { name: \"labelUnit\"; type: \"string\" }\n        Property { name: \"labelVisible\"; type: \"bool\" }\n        Property { name: \"labelOpacity\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/TabView 2.0\"\n        exports: [\"AsemanQml.Controls/TabView 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"minimumTabSize\"; type: \"double\" }\n        Property { name: \"maximumTabSize\"; type: \"double\" }\n        Property { name: \"tabsHeight\"; type: \"double\" }\n        Property { name: \"model\"; type: \"QVariant\" }\n        Property { name: \"currentIndex\"; type: \"int\" }\n    }\n    Component {\n        prototype: \"QQuickTextArea\"\n        name: \"AsemanQml.Controls/TextArea 2.0\"\n        exports: [\"AsemanQml.Controls/TextArea 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"placeholder\"; type: \"string\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/TextCursorArea 2.0\"\n        exports: [\"AsemanQml.Controls/TextCursorArea 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"backgroundColor\"; type: \"QColor\" }\n        Property { name: \"textItem\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"cursorParent\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"selected\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"topPadding\"; type: \"double\" }\n        Property { name: \"menuMap\"; type: \"QVariant\" }\n        Property { name: \"menuMoreMap\"; type: \"QVariant\" }\n        Property { name: \"menuMore\"; type: \"bool\" }\n        Property { name: \"active\"; type: \"bool\" }\n        Method { name: \"hideMenu\"; type: \"QVariant\" }\n        Method { name: \"close\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickTextField\"\n        name: \"AsemanQml.Controls/TextField 2.0\"\n        exports: [\"AsemanQml.Controls/TextField 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"placeholder\"; type: \"string\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/Tooltip 2.0\"\n        exports: [\"AsemanQml.Controls/Tooltip 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"interval\"; type: \"int\" }\n        Property { name: \"padding\"; type: \"double\" }\n        Property { name: \"textFont\"; type: \"QFont\" }\n        Property { name: \"textColor\"; type: \"QColor\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Method {\n            name: \"showText\"\n            type: \"QVariant\"\n            Parameter { name: \"text\"; type: \"QVariant\" }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls/qmake_asemancontrols.qrc",
    "content": "<!DOCTYPE RCC><RCC version=\"1.0\">\n<qresource prefix=\"/AsemanQml/\">\n<file>Controls/AsemanApplication.qml</file>\n<file>Controls/AsemanWindow.qml</file>\n<file>Controls/CircularProgressBar.qml</file>\n<file>Controls/DateTimeChooser.qml</file>\n<file>Controls/Drawer.qml</file>\n<file>Controls/DynamicTabBar.qml</file>\n<file>Controls/ExtendedFab.qml</file>\n<file>Controls/Header.qml</file>\n<file>Controls/HeaderMenuButton.qml</file>\n<file>Controls/Helper.qml</file>\n<file>Controls/HelperPoint.qml</file>\n<file>Controls/HScrollBar.qml</file>\n<file>Controls/MenuIcon.qml</file>\n<file>Controls/PanelDrawer.qml</file>\n<file>Controls/PanelFlicker.qml</file>\n<file>Controls/Slider.qml</file>\n<file>Controls/TabView.qml</file>\n<file>Controls/TextArea.qml</file>\n<file>Controls/TextCursorArea.qml</file>\n<file>Controls/TextField.qml</file>\n<file>Controls/Tooltip.qml</file>\n<file>Controls/qmldir</file>\n<file>Controls/private/GlobalBusyDialog.qml</file>\n<file>Controls/files/text_select_handle_middle.png</file>\n</qresource>\n</RCC>\n"
  },
  {
    "path": "src/asemanqml/controls/qmldir",
    "content": "module AsemanQml.Controls\nclassname AsemanControlsPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlcontrols\ndepends QtQuick 2.0\ndepends QtGraphicalEffects 1.0\ndepends QtQuick.Controls 2.0\ndepends QtQuick.Window 2.2\ndepends QtQuick.Layouts 1.2\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/AsemanApplication.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nAsemanApplicationBase {\n    id: app\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/AsemanWindow.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport \".\" as R\n\nR.Window {\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/BottomDrawer.qml",
    "content": "import QtQuick 2.15\nimport \"Private\"\n\nFreeSizeViewportScene {\n    id: dis\n    styleFileName: \"BottomDrawerStyle.qml\"\n    openToPrimaryViewport: true\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/BusyIndicator.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    styleFileName: \"BusyIndicatorStyle.qml\"\n    focusableUsingKeyboard: false\n    focusable: false\n\n    property bool running: true\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/Button.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    styleFileName: \"ButtonStyle.qml\"\n\n    property string text\n    property string icon\n    property font font\n\n    property real iconPixelSize: 14\n\n    property bool highlighted\n    property bool flat\n\n    property real radius: 8\n\n    property alias pressedX: marea.mouseX\n    property alias pressedY: marea.mouseY\n    property alias pressed: marea.pressed\n    property alias hovered: marea.containsMouse\n\n    signal clicked()\n\n    Keys.onReturnPressed: dis.clicked()\n    Keys.onEnterPressed: dis.clicked()\n    Keys.onSpacePressed: dis.clicked()\n\n    MouseArea {\n        id: marea\n        hoverEnabled: true\n        anchors.fill: parent\n        onPressed: {\n            if (!dis.focusable)\n                return;\n\n            dis.focus = true;\n            dis.forceActiveFocus();\n        }\n        onClicked: dis.clicked()\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/CheckBox.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    styleFileName: \"CheckBoxStyle.qml\"\n\n    property string text\n    property bool checked\n\n    property alias pressedX: marea.mouseX\n    property alias pressedY: marea.mouseY\n    property alias pressed: marea.pressed\n    property alias hovered: marea.containsMouse\n\n    signal clicked()\n    signal toggled()\n\n    Keys.onSpacePressed: toggle()\n    Keys.onReturnPressed: toggle()\n    Keys.onEnterPressed: toggle()\n\n    function toggle() {\n        dis.checked = !dis.checked;\n        toggled();\n    }\n\n    MouseArea {\n        id: marea\n        hoverEnabled: true\n        anchors.fill: parent\n        onPressed: {\n            if (!dis.focusable)\n                return;\n\n            dis.focus = true;\n            dis.forceActiveFocus();\n        }\n        onClicked: {\n            toggle();\n            dis.clicked();\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/CheckBoxDelegate.qml",
    "content": "import QtQuick 2.0\n\nCheckBox {\n    styleFileName: \"CheckBoxDelegateStyle.qml\"\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/ColumnLayout.qml",
    "content": "import QtQuick 2.0\n\nColumn {\n    spacing: 4\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/ComboBox.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    styleFileName: \"ComboBoxStyle.qml\"\n    property string delegateStyleFileName: \"ComboBoxDelegateStyle.qml\"\n\n    property string textRole\n    property string displayText: currentText\n    readonly property string currentText: prv.currentText\n    property alias currentIndex: prv.currentIndex\n    property int count: 0\n\n    property bool flat\n    property variant model: new Array\n    property alias popup: popup\n\n    property real radius: 8\n\n    property alias pressedX: marea.mouseX\n    property alias pressedY: marea.mouseY\n    property alias pressed: marea.pressed\n    property alias hovered: marea.containsMouse\n\n    signal activated(int index)\n\n    Keys.onReturnPressed: popup.open()\n    Keys.onEnterPressed: popup.open()\n    Keys.onSpacePressed: popup.open()\n\n    QtObject {\n        id: prv\n        property int currentIndex\n        property string currentText: {\n            var modelData = Array.isArray(dis.model)? dis.model[currentIndex] : dis.model.get? dis.model.get(currentIndex) : dis.model;\n            if (modelData == dis.model)\n                return currentIndex;\n            return dis.textRole ? modelData[dis.textRole] : modelData;\n        }\n    }\n\n    MouseArea {\n        id: marea\n        hoverEnabled: true\n        anchors.fill: parent\n        onPressed: {\n            if (!dis.focusable)\n                return;\n\n            dis.focus = true;\n            dis.forceActiveFocus();\n        }\n        onClicked: popup.open()\n    }\n\n    MenuPopup {\n        id: popup\n        width: dis.width + 20\n        height: item? Math.min(item.contentHeight, 200) : 200\n        x: dis.width/2 - width/2\n        transformOrigin: Item.Top\n        styleFileName: \"ComboBoxPopupStyle.qml\"\n\n        ListView {\n            id: listv\n            model: dis.model\n            clip: true\n            currentIndex: prv.currentIndex\n            delegate: ComboBoxDelegate {\n                width: listv.width\n                styleFileName: delegateStyleFileName\n                text: dis.textRole ? (Array.isArray(dis.model) ? modelData[dis.textRole] : model[dis.textRole]) : modelData\n                selected: prv.currentIndex == model.index\n                onClicked: {\n                    prv.currentIndex = model.index;\n                    dis.activated(model.index);\n                    popup.close();\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/ComboBoxDelegate.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    styleFileName: \"ComboBoxDelegateStyle.qml\"\n    focusable: false\n\n    property string text\n    property bool selected\n\n    property real radius: 8\n\n    property alias pressedX: marea.mouseX\n    property alias pressedY: marea.mouseY\n    property alias pressed: marea.pressed\n    property alias hovered: marea.containsMouse\n\n    signal clicked()\n\n    Keys.onReturnPressed: dis.clicked()\n    Keys.onEnterPressed: dis.clicked()\n    Keys.onSpacePressed: dis.clicked()\n\n    MouseArea {\n        id: marea\n        hoverEnabled: true\n        anchors.fill: parent\n        onPressed: {\n            if (!dis.focusable)\n                return;\n\n            dis.focus = true;\n            dis.forceActiveFocus();\n        }\n        onClicked: dis.clicked()\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/Dialog.qml",
    "content": "import QtQuick 2.15\nimport AsemanQml.Viewport 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport \"Private\"\n\nAbstractViewportScene {\n    id: dis\n    sceneComponent: freeSizeSceneItem\n    styleFileName: \"DialogStyle.qml\"\n    openToPrimaryViewport: true\n\n    property Component sceneStyleComponent\n    property string sceneStyleFileName: \"DialogSceneStyle.qml\"\n\n    property string title\n    property alias buttons: buttonsScene.data\n\n    property variant leftPadding\n    property variant rightPadding\n    property variant topPadding\n    property variant bottomPadding\n\n    signal closed()\n    signal rejected()\n    signal accepted()\n\n    onOpenedChanged: {\n        if (!opened)\n            closed()\n    }\n\n    function reject() {\n        dialog.opened = false;\n        dialog.rejected();\n    }\n    function accept() {\n        dialog.opened = false;\n        dialog.accepted();\n    }\n\n    data: [\n        Item {\n            id: buttonsScene\n            visible: dis.item? true : false\n        }\n    ]\n\n    Component {\n        id: freeSizeSceneItem\n        DialogScene {\n            id: scene\n            title: dis.title\n            buttons: dis.buttons\n            styleComponent: dis.sceneStyleComponent\n            styleFileName: dis.sceneStyleFileName\n\n            leftPadding: dis.leftPadding != null? dis.leftPadding : styleItem.padding.left\n            rightPadding: dis.rightPadding != null? dis.rightPadding : styleItem.padding.right\n            topPadding: dis.topPadding != null? dis.topPadding : styleItem.padding.top\n            bottomPadding: dis.bottomPadding != null? dis.bottomPadding : styleItem.padding.bottom\n\n            property variant prv\n\n            Component.onCompleted: {\n                item = delegate.createObject(Viewport.viewport, {\"parent\": scene.scene});\n\n                prv.item = item;\n                prv.setupViewportType(scene);\n                dis.width = Qt.binding(function(){ return scene.width; });\n                dis.height = Qt.binding(function(){ return scene.height; });\n            }\n            Component.onDestruction: {\n                prv.item.destroy()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/DialogScene.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nScene {\n    id: dis\n    data: [styleItem, scene]\n    styleFileName: \"DialogSceneStyle.qml\"\n\n    property real leftPadding: dis.styleItem.padding.left\n    property real rightPadding: dis.styleItem.padding.right\n    property real topPadding: dis.styleItem.padding.top\n    property real bottomPadding: dis.styleItem.padding.bottom\n\n    property string title\n    property variant buttons\n    property Item item\n\n    property alias scene: scene\n    default property alias items: scene.data\n\n    Item {\n        id: scene\n        anchors.fill: parent\n        anchors.topMargin: dis.topPadding\n        anchors.bottomMargin: dis.bottomPadding\n        anchors.leftMargin: dis.leftPadding\n        anchors.rightMargin: dis.rightPadding\n        z: 10\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/FloatPage.qml",
    "content": "import QtQuick 2.15\nimport \"Private\"\n\nSnappedViewportScene {\n    id: dis\n    styleFileName: \"FloatPageStyle.qml\"\n    openToPrimaryViewport: true\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/Footer.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    styleFileName: \"FooterStyle.qml\"\n    data: [sceneItem, styleItem]\n    focusableUsingKeyboard: false\n    focusable: false\n\n    default property alias list: sceneItem.data\n    property int currentIndex\n    property bool interactive: true\n\n    Item {\n        id: sceneItem\n        anchors.fill: parent\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/FooterButton.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    styleFileName: \"FooterButtonStyle.qml\"\n\n    property string text\n    property string icon\n\n    property real iconPixelSize: 26\n\n    property real radius: 8\n\n    property alias pressedX: marea.mouseX\n    property alias pressedY: marea.mouseY\n    property alias pressed: marea.pressed\n    property alias hovered: marea.containsMouse\n\n    signal clicked()\n\n    Keys.onReturnPressed: dis.clicked()\n    Keys.onEnterPressed: dis.clicked()\n    Keys.onSpacePressed: dis.clicked()\n\n    MouseArea {\n        id: marea\n        hoverEnabled: true\n        anchors.fill: parent\n        onPressed: {\n            if (!dis.focusable)\n                return;\n\n            dis.focus = true;\n            dis.forceActiveFocus();\n        }\n        onClicked: dis.clicked()\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/Header.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    data: [scene, styleItem]\n    styleFileName: \"HeaderStyle.qml\"\n    focusableUsingKeyboard: false\n    focusable: false\n\n    property alias scene: scene\n    default property alias items: scene.data\n\n    property string title: parent && parent.title != undefined? parent.title : \"\"\n\n    Item {\n        id: scene\n        anchors.fill: parent\n        anchors.topMargin: dis.styleItem.padding.top\n        anchors.bottomMargin: dis.styleItem.padding.bottom\n        anchors.leftMargin: dis.styleItem.padding.left\n        anchors.rightMargin: dis.styleItem.padding.right\n        z: 10\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/HeaderMenuButton.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nItem {\n    id: hmb\n    width: height\n    height: Devices.standardTitleBarHeight\n    y: View.statusBarHeight\n    x: LayoutMirroring.enabled? parent.width - width : 0\n\n    property alias buttonColor: menuIcon.color\n\n    property alias ratio: menuIcon.ratio\n    property alias pressed: marea.pressed\n\n    signal clicked()\n\n    LayoutMirroring.childrenInherit: true\n\n    ItemDelegate {\n        id: marea\n        anchors.fill: parent\n        onClicked: hmb.clicked()\n    }\n\n    MenuIcon {\n        id: menuIcon\n        anchors.centerIn: parent\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/Icon.qml",
    "content": "import QtQuick 2.15\nimport AsemanQml.Controls.Beta 3.0\n\nText {\n    id: dis\n\n    property string styleFileName: \"IconStyle.qml\"\n\n    color: dis.Style.foregroundColor\n    font.family: styledItem.styleItem.font.family\n    font.pixelSize: styledItem.styleItem.font.pixelSize\n    leftPadding: styledItem.styleItem.padding.left\n    rightPadding: styledItem.styleItem.padding.right\n    topPadding: styledItem.styleItem.padding.top\n    bottomPadding: styledItem.styleItem.padding.bottom\n    lineHeight: styledItem.styleItem.extra.lineHeight\n    lineHeightMode: styledItem.styleItem.extra.lineHeightMode\n\n    StyledItem {\n        id: styledItem\n        styleFileName: dis.styleFileName\n        sourceItem: dis\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/ItemDelegate.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    styleFileName: \"ItemDelegateStyle.qml\"\n    data: [marea, scene, styleItem]\n\n    property alias scene: scene\n    default property alias items: scene.data\n\n    property real radius: 8\n    property alias hoverEnabled: marea.hoverEnabled\n\n    property alias pressedX: marea.mouseX\n    property alias pressedY: marea.mouseY\n    property alias pressed: marea.pressed\n    property alias hovered: marea.containsMouse\n    property alias pressAndHoldInterval: marea.pressAndHoldInterval\n    property alias acceptedButtons: marea.acceptedButtons\n\n    signal clicked(variant mouse)\n    signal pressAndHold(variant mouse)\n\n    Keys.onReturnPressed: dis.clicked()\n    Keys.onEnterPressed: dis.clicked()\n    Keys.onSpacePressed: dis.clicked()\n\n    MouseArea {\n        id: marea\n        hoverEnabled: true\n        anchors.fill: parent\n        pressAndHoldInterval: 800\n        onPressed: {\n            if (!dis.focusable)\n                return;\n\n            dis.focus = true;\n            dis.forceActiveFocus();\n        }\n        onClicked: function(mouse) { dis.clicked(mouse) }\n        onPressAndHold: function(mouse) { dis.pressAndHold(mouse) }\n    }\n\n    Item {\n        id: scene\n        anchors.fill: parent\n        anchors.topMargin: dis.styleItem.padding.top\n        anchors.bottomMargin: dis.styleItem.padding.bottom\n        anchors.leftMargin: dis.styleItem.padding.left\n        anchors.rightMargin: dis.styleItem.padding.right\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/Label.qml",
    "content": "import QtQuick 2.15\nimport AsemanQml.Controls.Beta 3.0\n\nText {\n    id: dis\n\n    property string styleFileName: \"LabelStyle.qml\"\n\n    color: dis.Style.foregroundColor\n    font: styledItem.styleItem.font\n    leftPadding: styledItem.styleItem.padding.left\n    rightPadding: styledItem.styleItem.padding.right\n    topPadding: styledItem.styleItem.padding.top\n    bottomPadding: styledItem.styleItem.padding.bottom\n    lineHeight: styledItem.styleItem.extra.lineHeight\n    lineHeightMode: styledItem.styleItem.extra.lineHeightMode\n\n    StyledItem {\n        id: styledItem\n        styleFileName: dis.styleFileName\n        sourceItem: dis\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/Menu.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nMenuPopup {\n    id: dis\n    height: mainColumn.height\n    styleFileName: \"MenuStyle.qml\"\n    delegate: Item {\n        id: listv\n\n        Component.onCompleted: {\n            for (var i=0; i<mainColumn.data.length; i++) {\n                var b = mainColumn.data[i];\n                if (b.clicked) {\n                    b.clicked.connect(dis.close);\n                }\n            }\n        }\n    }\n\n    default property alias sceneData: mainColumn.data\n\n    data: [\n        Scene {\n            parent: dis.item? dis.item : dis\n            visible: dis.item? true : false\n            width: mainColumn.width\n            height: mainColumn.height\n\n            Column {\n                id: mainColumn\n                width: dis.item? dis.item.width : 200\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/MenuButton.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    width: parent.width\n    styleFileName: \"MenuButtonStyle.qml\"\n\n    property string text\n    property string icon\n\n    property real iconPixelSize: 14\n\n    property real radius: 8\n\n    property alias pressedX: marea.mouseX\n    property alias pressedY: marea.mouseY\n    property alias pressed: marea.pressed\n    property alias hovered: marea.containsMouse\n\n    signal clicked()\n\n    Keys.onReturnPressed: dis.clicked()\n    Keys.onEnterPressed: dis.clicked()\n    Keys.onSpacePressed: dis.clicked()\n\n    MouseArea {\n        id: marea\n        hoverEnabled: true\n        anchors.fill: parent\n        onPressed: {\n            if (!dis.focusable)\n                return;\n\n            dis.focus = true;\n            dis.forceActiveFocus();\n        }\n        onClicked: dis.clicked()\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/MenuIcon.qml",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nItem {\n    id: menu_icon\n    height: 20*Devices.density\n    width: height\n\n    property color color: menu_icon.Style.primaryTextColor\n    property real ratio: 0\n\n    readonly property bool _mirror: LayoutMirroring.enabled\n\n    Column {\n        width: Math.min(parent.width, parent.height)\n        anchors.centerIn: parent\n        spacing: 3*Devices.density\n        rotation: ratio*180\n        transform: Scale {\n            origin.x: width/2\n            origin.y: height/2\n            xScale: (_mirror?-1:1)*yScale\n            yScale: 1-ratio/6\n        }\n\n        Rectangle {\n            x: parent.width - width + ratio*parent.width*0.1\n            width: (1-ratio)*parent.width*0.25 + parent.width*0.75\n            height: 2*Devices.density\n            radius: height/2\n            color: menu_icon.color\n            rotation: ratio*45\n        }\n\n        Rectangle {\n            x: parent.width - width\n            width: parent.width + ratio*parent.width*0.2\n            height: 2*Devices.density\n            radius: height/2\n            color: menu_icon.color\n        }\n\n        Rectangle {\n            x: parent.width - width + ratio*parent.width*0.1\n            width: (1-ratio)*parent.width*0.25 + parent.width*0.75\n            height: 2*Devices.density\n            radius: height/2\n            color: menu_icon.color\n            rotation: -ratio*45\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/MenuPopup.qml",
    "content": "import QtQuick 2.15\nimport \"Private\"\n\nFreeGeometryViewportScene {\n    id: dis\n    styleFileName: \"MenuPopupStyle.qml\"\n    openToPrimaryViewport: true\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/Page.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nScene {\n    id: dis\n    data: {\n        var res = new Array;\n        res[res.length] = styleItem;\n        res[res.length] = scene;\n        if (header) res[res.length] = header;\n        if (footer) res[res.length] = footer;\n        return res;\n    }\n    styleFileName: \"PageStyle.qml\"\n\n    property string title\n    property Item header\n    property Item footer\n\n    property alias scene: scene\n    default property alias items: scene.data\n\n    onHeaderChanged: {\n        if (header) {\n            header.parent = dis;\n            header.anchors.left = left;\n            header.anchors.right = right;\n            header.anchors.top = top;\n            header.z = 10;\n        }\n    }\n    onFooterChanged: {\n        if (footer) {\n            footer.parent = dis;\n            footer.anchors.left = left;\n            footer.anchors.right = right;\n            footer.anchors.bottom = bottom;\n            footer.z = 10;\n        }\n    }\n\n    Item {\n        id: scene\n        anchors.fill: parent\n        anchors.topMargin: dis.styleItem.padding.top\n        anchors.bottomMargin: dis.styleItem.padding.bottom\n        anchors.leftMargin: dis.styleItem.padding.left\n        anchors.rightMargin: dis.styleItem.padding.right\n        z: 10\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/Private/AbstractViewportScene.qml",
    "content": "import QtQuick 2.15\nimport AsemanQml.Base 2.0\nimport AsemanQml.Viewport 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nItem {\n    id: dis\n\n    property string styleFileName\n    default property Component delegate\n    property Component sceneComponent\n\n    readonly property Item item: prv.item\n\n    property bool opened: false\n\n    property real gestureWidth: -1\n    property real maximumWidth: 0\n    property bool touchToClose: true\n    property bool blockBack: false\n\n    property bool openToPrimaryViewport\n\n    function open() {\n        opened = true;\n    }\n    function close() {\n        opened = false;\n    }\n\n    onOpenedChanged: {\n        if (prv.scene)\n            prv.scene.ViewportType.open = false;\n        if (!opened)\n            return;\n\n        var viewport = (openToPrimaryViewport? Viewport.primaryViewport : Viewport.viewport);\n        var styleFilePath;\n        if (styleFileName.slice(0,5) == \"qrc:/\")\n            styleFilePath = styleFileName;\n        else\n            styleFilePath = dis.Style.styleUrl + '/' + styleFileName;\n\n        prv.scene = viewport.append(sceneComponent, {\"prv\": prv}, styleFilePath)\n    }\n\n    onStyleFileNameChanged: {\n        if (opened) {\n            close();\n            open();\n        }\n    }\n\n    QtObject {\n        id: prv\n\n        property Item item\n        property Item scene\n        property point transformPoint: {\n            switch (dis.transformOrigin) {\n            case Item.Left:\n                return Qt.point(0, dis.height/2);\n            default:\n            case Item.TopLeft:\n                return Qt.point(0, 0);\n            case Item.Top:\n                return Qt.point(dis.width/2, 0);\n            case Item.TopRight:\n                return Qt.point(dis.width, 0);\n            case Item.Right:\n                return Qt.point(dis.width, dis.height/2);\n            case Item.BottomRight:\n                return Qt.point(dis.width, dis.height);\n            case Item.Bottom:\n                return Qt.point(dis.width/2, dis.height);\n            case Item.BottomLeft:\n                return Qt.point(0, dis.height);\n            case Item.Center:\n                return Qt.point(dis.width/2, dis.height/2);\n            }\n        }\n\n        function setupViewportType(item) {\n            item.ViewportType.transformOrigin = Qt.binding(function(){ return prv.transformPoint; });\n            item.ViewportType.gestureWidth = Qt.binding(function(){ return dis.gestureWidth<0? item.width : dis.gestureWidth; });\n            item.ViewportType.maximumWidth = Qt.binding(function(){ return dis.maximumWidth; });\n            item.ViewportType.touchToClose = Qt.binding(function(){ return dis.touchToClose; });\n            item.ViewportType.blockBack = Qt.binding(function(){ return dis.blockBack; });\n        }\n\n        onSceneChanged: if (!scene) opened = false\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/Private/FreeGeometryViewportScene.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Viewport 2.0\n\nAbstractViewportScene {\n    id: dis\n    sceneComponent: freeSceneItem\n\n    Component {\n        id: freeSceneItem\n        Scene {\n            id: scene\n\n            property variant prv\n\n            PointMapListener {\n                id: mapListener\n                source: dis.parent\n                dest: Viewport.viewport\n            }\n\n            Component.onCompleted: {\n                prv.item = delegate.createObject(Viewport.viewport, {\"parent\": scene});\n                prv.item.anchors.fill = scene;\n                prv.setupViewportType(scene);\n                x = Qt.binding(function(){ return mapListener.result.x + dis.x; });\n                y = Qt.binding(function(){ return mapListener.result.y + dis.y; });\n                width = Qt.binding(function(){ return dis.width; });\n                height = Qt.binding(function(){ return dis.height; });\n            }\n            Component.onDestruction: {\n                prv.item.destroy()\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/Private/FreeSizeViewportScene.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Viewport 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nAbstractViewportScene {\n    id: dis\n    sceneComponent: freeSizeSceneItem\n\n    Component {\n        id: freeSizeSceneItem\n        Scene {\n            id: scene\n\n            property variant prv\n\n            Component.onCompleted: {\n                prv.item = delegate.createObject(Viewport.viewport, {\"parent\": scene});\n                prv.item.anchors.fill = scene;\n                prv.setupViewportType(scene);\n                width = Qt.binding(function(){ return dis.width; });\n                height = Qt.binding(function(){ return dis.height; });\n            }\n            Component.onDestruction: {\n                prv.item.destroy()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/Private/SnappedViewportScene.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.Viewport 2.0\n\nAbstractViewportScene {\n    sceneComponent: snappedSceneItem\n\n    Component {\n        id: snappedSceneItem\n        Scene {\n            id: scene\n\n            property variant prv\n\n            Component.onCompleted: {\n                prv.item = delegate.createObject(Viewport.viewport, {\"parent\": scene});\n                prv.item.anchors.fill = scene;\n                prv.setupViewportType(scene);\n            }\n            Component.onDestruction: {\n                prv.item.destroy()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/ProgressBar.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    styleFileName: \"ProgressBarStyle.qml\"\n    focusableUsingKeyboard: false\n    focusable: false\n\n    property real from: 0\n    property real to: 100\n    property real value: 0\n    property bool indeterminate\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/RadioButton.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nRadioControl {\n    id: dis\n    styleFileName: \"RadioButtonStyle.qml\"\n\n    property string text\n\n    property alias pressedX: marea.mouseX\n    property alias pressedY: marea.mouseY\n    property alias pressed: marea.pressed\n    property alias hovered: marea.containsMouse\n\n    signal clicked()\n    signal toggled()\n\n    Keys.onSpacePressed: toggle()\n    Keys.onReturnPressed: toggle()\n    Keys.onEnterPressed: toggle()\n\n    function toggle() {\n        dis.checked = true;\n        toggled();\n    }\n\n    MouseArea {\n        id: marea\n        hoverEnabled: true\n        anchors.fill: parent\n        onPressed: {\n            if (!dis.focusable)\n                return;\n\n            dis.focus = true;\n            dis.forceActiveFocus();\n        }\n        onClicked: {\n            toggle();\n            dis.clicked();\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/RowLayout.qml",
    "content": "import QtQuick 2.0\n\nRow {\n    spacing: 4\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/ScrollBar.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    styleFileName: \"ScrollBarStyle.qml\"\n    focusableUsingKeyboard: false\n    focusable: false\n\n    property Flickable flickArea\n    property int orientation: Qt.Vertical\n    property color color: dis.Style.foregroundColor\n    property bool forceVisible: false\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/ScrollView.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.Controls.Beta 3.0\n\nScrollViewCore {\n    id: dis\n    styleFileName: \"ScrollViewStyle.qml\"\n    focusableUsingKeyboard: false\n    focusable: false\n\n    onFlickAreaChanged: {\n        if (!flickArea)\n            return;\n\n        dis.data = [flickArea, styleItem];\n        flickArea.anchors.fill = dis;\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/Slider.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    styleFileName: \"SliderStyle.qml\"\n\n    property real from: 0\n    property real to: 100\n    property real value: 0\n\n    property alias pressedX: marea.mouseX\n    property alias pressedY: marea.mouseY\n    property alias pressed: marea.pressed\n    property alias hovered: marea.containsMouse\n\n    Keys.onLeftPressed: decrease()\n    Keys.onRightPressed: increase()\n\n    function decrease() {\n        value = Math.min(to, Math.max(from, value - 0.1 * (to - from)));\n    }\n    function increase() {\n        value = Math.min(to, Math.max(from, value + 0.1 * (to - from)));\n    }\n\n    MouseArea {\n        id: marea\n        anchors.fill: parent\n        hoverEnabled: true\n        onPressed: {\n            if (!dis.focusable)\n                return;\n\n            dis.focus = true;\n            dis.forceActiveFocus();\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/StackPage.qml",
    "content": "import QtQuick 2.15\nimport \"Private\"\n\nSnappedViewportScene {\n    id: dis\n    styleFileName: \"StackPageStyle.qml\"\n    openToPrimaryViewport: false\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/SwipeView.qml",
    "content": "import QtQuick 2.15\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    styleFileName: \"SwipeViewStyle.qml\"\n    focusableUsingKeyboard: false\n    focusable: false\n    data: [sceneItem, styleItem]\n\n    default property alias list: sceneItem.data\n    property int currentIndex\n    property bool interactive: true\n\n    Item {\n        id: sceneItem\n        anchors.fill: parent\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/Switch.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nCheckBox {\n    id: dis\n    styleFileName: \"SwitchStyle.qml\"\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/SwitchDelegate.qml",
    "content": "import QtQuick 2.0\n\nCheckBox {\n    styleFileName: \"SwitchDelegateStyle.qml\"\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/TabBar.qml",
    "content": "import QtQuick 2.15\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    styleFileName: \"TabBarStyle.qml\"\n    data: [sceneItem, styleItem]\n\n    default property alias list: sceneItem.data\n    property int currentIndex\n    property bool interactive: true\n\n    Item {\n        id: sceneItem\n        anchors.fill: parent\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/TabButton.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.Controls.Beta 3.0\n\nControl {\n    id: dis\n    styleFileName: \"TabButtonStyle.qml\"\n\n    property string text\n    property string icon\n\n    property real iconPixelSize: 14\n\n    property real radius: 8\n\n    property alias pressedX: marea.mouseX\n    property alias pressedY: marea.mouseY\n    property alias pressed: marea.pressed\n    property alias hovered: marea.containsMouse\n\n    signal clicked()\n\n    Keys.onReturnPressed: dis.clicked()\n    Keys.onEnterPressed: dis.clicked()\n    Keys.onSpacePressed: dis.clicked()\n\n    MouseArea {\n        id: marea\n        hoverEnabled: true\n        anchors.fill: parent\n        onPressed: {\n            if (!dis.focusable)\n                return;\n\n            dis.focus = true;\n            dis.forceActiveFocus();\n        }\n        onClicked: dis.clicked()\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/TextArea.qml",
    "content": "import QtQuick 2.15\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nTextEdit {\n    id: dis\n    persistentSelection: true\n\n    property string styleFileName: \"TextAreaStyle.qml\"\n\n    font: styledItem.styleItem.font\n    leftPadding: styledItem.styleItem.padding.left\n    rightPadding: styledItem.styleItem.padding.right\n    topPadding: styledItem.styleItem.padding.top\n    bottomPadding: styledItem.styleItem.padding.bottom\n    clip: true\n    height: Math.max(32, contentHeight + 18)\n    Layout.preferredHeight: Math.max(32, contentHeight + 18)\n\n    selectedTextColor: dis.Style.accentTextColor\n    selectionColor: dis.Style.accentColor\n    selectByMouse: Devices.isDesktop\n    color: dis.Style.foregroundColor\n\n    property string placeholderText\n    signal contextMenuRequest(real x, real y)\n\n    Keys.onTabPressed: {\n        styledItem.focusNextItem()\n    }\n\n    Control {\n        id: styledItem\n        styleFileName: dis.styleFileName\n        sourceItem: dis\n        onFocusedInUsingKeyboardChanged: {\n            dis.focus = true;\n            dis.forceActiveFocus();\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/TextField.qml",
    "content": "import QtQuick 2.15\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nTextInput {\n    id: dis\n    persistentSelection: true\n\n    property string styleFileName: \"TextFieldStyle.qml\"\n\n    font: styledItem.styleItem.font\n    leftPadding: styledItem.styleItem.padding.left\n    rightPadding: styledItem.styleItem.padding.right\n    topPadding: styledItem.styleItem.padding.top\n    bottomPadding: styledItem.styleItem.padding.bottom\n    clip: true\n    height: styledItem.implicitHeight\n    Layout.preferredHeight: styledItem.implicitHeight\n\n    selectedTextColor: dis.Style.accentTextColor\n    selectionColor: dis.Style.accentColor\n    selectByMouse: Devices.isDesktop\n    color: dis.Style.foregroundColor\n\n    property string placeholderText\n    signal contextMenuRequest(real x, real y)\n\n    Keys.onTabPressed: {\n        styledItem.focusNextItem()\n    }\n\n    Control {\n        id: styledItem\n        styleFileName: dis.styleFileName\n        sourceItem: dis\n        onFocusedInUsingKeyboardChanged: {\n            dis.focus = true;\n            dis.forceActiveFocus();\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/ViewportContainer.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Viewport 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nViewport {\n    id: viewport\n    anchors.fill: parent\n    mainItem: Scene {\n        id: scene\n        anchors.fill: parent\n    }\n\n    default property alias sceneItems: scene.data\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/Window.qml",
    "content": "import QtQuick 2.0\nimport QtQuick.Window 2.15 as QtWindow\nimport AsemanQml.Base 2.0\nimport AsemanQml.Viewport 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nQtWindow.Window {\n    id: win\n    data: [viewport]\n\n    property alias viewport: viewport\n    default property alias items: scene.data\n\n    property bool backController: true\n    property bool try_close: false\n\n    signal closeRequest()\n\n    onCloseRequest: if(backController) AsemanApp.back()\n\n    Style.stylesSearchPath: [\":/AsemanQml/Controls/Beta/styles/\"]\n    Style.styleName: \"simple\"\n    Style.primaryColor: MainPalette.background\n    Style.primaryTextColor: MainPalette.foreground\n    Style.accentColor: MainPalette.highlight\n    Style.accentTextColor: MainPalette.highlightText\n    Style.foregroundColor: MainPalette.foreground\n    Style.backgroundColor: MainPalette.background\n    Style.baseColor: MainPalette.base\n    Style.baseTextColor: MainPalette.baseText\n\n    Viewport {\n        id: viewport\n        anchors.fill: parent\n        mainItem: Item {\n            id: scene\n            anchors.fill: parent\n        }\n    }\n\n    Timer {\n        id: timer_delayer\n        interval: 300\n        repeat: false\n    }\n\n    Connections {\n        target: AsemanApp\n        function onBackRequest() {\n            if(timer_delayer.running)\n                return\n\n            timer_delayer.start()\n            var res = BackHandler.back()\n            if( !res && !Devices.isDesktop )\n                win.tryClose()\n        }\n    }\n\n    function tryClose() {\n        try_close = true\n        close()\n    }\n\n    Component.onCompleted: {\n        View.registerWindow(win)\n        View.root = win\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/qmldir",
    "content": "AsemanApplication 3.0 AsemanApplication.qml\nAsemanWindow 3.0 AsemanWindow.qml\nBottomDrawer 3.0 BottomDrawer.qml\nBusyIndicator 3.0 BusyIndicator.qml\nButton 3.0 Button.qml\nCheckBox 3.0 CheckBox.qml\nCheckBoxDelegate 3.0 CheckBoxDelegate.qml\nComboBox 3.0 ComboBox.qml\nComboBoxDelegate 3.0 ComboBoxDelegate.qml\nDialog 3.0 Dialog.qml\nFloatPage 3.0 FloatPage.qml\nFooter 3.0 Footer.qml\nFooterButton 3.0 FooterButton.qml\nHeader 3.0 Header.qml\nIcon 3.0 Icon.qml\nItemDelegate 3.0 ItemDelegate.qml\nLabel 3.0 Label.qml\nMenu 3.0 Menu.qml\nMenuButton 3.0 MenuButton.qml\nMenuPopup 3.0 MenuPopup.qml\nPage 3.0 Page.qml\nPalette 3.0 Palette.qml\nProgressBar 3.0 ProgressBar.qml\nRadioButton 3.0 RadioButton.qml\nScrollBar 3.0 ScrollBar.qml\nScrollView 3.0 ScrollView.qml\nSlider 3.0 Slider.qml\nStackPage 3.0 StackPage.qml\nSwipeView 3.0 SwipeView.qml\nSwitch 3.0 Switch.qml\nSwitchDelegate 3.0 SwitchDelegate.qml\nTabBar 3.0 TabBar.qml\nTabButton 3.0 TabButton.qml\nTextArea 3.0 TextArea.qml\nTextField 3.0 TextField.qml\nWindow 3.0 Window.qml\nDialogScene 3.0 DialogScene.qml\nHeaderMenuButton 3.0 HeaderMenuButton.qml\nMenuIcon 3.0 MenuIcon.qml\nViewportContainer 3.0 ViewportContainer.qml\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/BottomDrawerStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.GraphicalEffects 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Viewport 2.0\n\nAbstractViewportType {\n    id: item\n\n    foreground.x: foregroundItem? -foregroundItem.x : 0\n    foreground.height: foregroundItem? foregroundItem.height : item.height\n    foreground.z: 10\n    foreground.parent: dragArea\n    foregroundScene.color: \"transparent\"\n\n    property real openRatio: open? 1 : 0\n\n    Behavior on ratio {\n        NumberAnimation { easing.type: Easing.OutCubic; duration: 350 }\n    }\n\n    Rectangle {\n        anchors.fill: item.background\n        color: \"#000\"\n        opacity: item.ratio * 0.3\n    }\n\n    NumberAnimation {\n        id: foregroundAnim\n        target: foreground\n        property: \"y\"\n        easing.type: Easing.OutCubic\n        duration: 300\n    }\n\n    Item {\n        width: foregroundItem? foregroundItem.width : item.width\n        x: foregroundItem? foregroundItem.x : 0\n        height: item.height - dragArea.y - item.foreground.y\n        anchors.bottom: parent.bottom\n        z: 5\n        clip: true\n\n        FastBlur {\n            x: foregroundItem? -foregroundItem.x : 0\n            anchors.bottom: parent.bottom\n            height: item.background.height\n            width: item.background.width\n            radius: 64\n            cached: true\n            source: item.background\n        }\n    }\n\n    MouseArea {\n        anchors.fill: parent\n        hoverEnabled: true\n    }\n\n    MouseArea {\n        anchors.fill: parent\n        visible: item.touchToCloseIsNull || item.touchToClose\n        onClicked: open = false\n    }\n\n    MouseArea {\n        id: dragArea\n        width: foregroundItem? foregroundItem.width : item.width\n        x: foregroundItem? foregroundItem.x : 0\n        height: item.gestureWidthIsNull? item.foreground.height : item.gestureWidth\n        y: parent.height - item.foreground.height * item.ratio\n        z: 10\n        drag {\n            target: item.foreground\n            axis: Drag.YAxis\n            minimumY: 0\n            maximumY: item.height - 10\n            filterChildren: true\n            onActiveChanged: {\n                if (dragArea.drag.active)\n                    return;\n\n                var ratio = 1 - foreground.y / dragArea.height\n                if (ratio < 0.7) {\n                    open = false\n                } else {\n                    foregroundAnim.from = foreground.y\n                    foregroundAnim.to = 0\n                    foregroundAnim.start()\n                }\n            }\n        }\n\n        MouseArea {\n            anchors.fill: parent\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/BusyIndicatorStyle.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.GraphicalEffects 2.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitWidth: 18\n    implicitHeight: implicitWidth\n    opacity: control.running ? 1 : 0\n    Behavior on opacity { OpacityAnimator { duration: 250 } }\n\n\n    Timer {\n        interval: 80\n        repeat: true\n        running: control.running\n        onTriggered: parent.rotation = (parent.rotation + 30) % 360\n    }\n\n    Repeater {\n        model: 12\n        Rectangle {\n            property real size: parent.width\n\n            width: 2\n            height: size / 4\n            radius: 16\n            x: size/2 + size/2 * Math.sin(rotation * Math.PI/180).toFixed(12) - 1\n            y: size/2 - size/2 * Math.cos(rotation * Math.PI/180).toFixed(12)\n            rotation: index * 30\n            antialiasing: true\n            transformOrigin: Item.Top\n            opacity: 1/16 * index + 4/16\n            color: control.Style.foregroundColor\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/ButtonStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.GraphicalEffects 2.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitHeight: 44\n    implicitWidth: contentRow.width + 40\n\n    Connections {\n        target: control\n        function onPressedChanged() {\n            if (control.pressed) {\n                highlightArea.pinX = control.pressed? control.pressedX : width/2;\n                highlightArea.pinY = control.pressed? control.pressedY : height/2;\n                highlightArea.opacity = 0.15;\n                ratioAnim.start();\n            } else {\n                opacityAnim.start();\n            }\n        }\n    }\n\n    NumberAnimation {\n        id: opacityAnim\n        target: highlightArea\n        property: \"opacity\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0.15; to: 0\n    }\n    NumberAnimation {\n        id: ratioAnim\n        target: highlightArea\n        property: \"width\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0; to: dis.width*2\n    }\n\n    Rectangle {\n        id: background\n        anchors.fill: parent\n        color: control.flat? \"transparent\" : control.highlighted && control.enabled? control.Style.accentColor : \"transparent\"\n        radius: control.radius\n\n        Rectangle {\n            anchors.fill: parent\n            opacity: (!control.flat && !control.highlighted? 0.2 : !control.enabled? (control.highlighted? 0.3 : 0.2) : 0) + (control.pressed || control.focusedInUsingKeyboard || control.hovered? 0.1 : 0)\n            color: control.Style.foregroundColor\n            radius: control.radius\n        }\n    }\n\n    Item {\n        id: highlightScene\n        anchors.fill: parent\n        clip: true\n        visible: false\n\n        Rectangle {\n            id: highlightArea\n            x: pinX - width/2\n            y: pinY - height/2\n            color: control.Style.foregroundColor\n            height: width\n            radius: height / 2\n\n            property real pinX\n            property real pinY\n        }\n    }\n\n    OpacityMask {\n        anchors.fill: parent\n        maskSource: background\n        source: highlightScene\n    }\n\n    Row {\n        id: contentRow\n        anchors.centerIn: parent\n        spacing: 4\n        scale: {\n            if (!control.pressed)\n                return 1;\n\n            let m = Math.max(width, height);\n            var res = (m-4) / m;\n            return Math.max(res, 0.95);\n        }\n\n        Behavior on scale {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n\n        Root.Icon {\n            anchors.verticalCenter: parent.verticalCenter\n            color: mainText.color\n            font.pixelSize: control.iconPixelSize\n            text: control.icon\n            visible: text.length\n        }\n\n        Root.Label {\n            anchors.verticalCenter: parent.verticalCenter\n            id: mainText\n            color: control.highlighted && control.flat? control.Style.accentColor : control.highlighted? control.Style.accentTextColor : control.Style.foregroundColor\n            text: control.text\n            visible: text.length\n            font: control.font\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/CheckBoxDelegateStyle.qml",
    "content": "import QtQuick 2.0\n\nCheckBoxStyle {\n    delegateMode: true\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/CheckBoxStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.MaterialIcons 2.0\nimport AsemanQml.GraphicalEffects 2.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitHeight: contentRow.height + 14\n    implicitWidth: contentRow.width + 14\n\n    property bool delegateMode\n\n    Connections {\n        target: control\n        function onPressedChanged() {\n            if (control.pressed) {\n                highlightArea.pinX = control.pressed? control.pressedX : width/2;\n                highlightArea.pinY = control.pressed? control.pressedY : height/2;\n                highlightArea.opacity = 0.15;\n                ratioAnim.start();\n            } else {\n                opacityAnim.start();\n            }\n        }\n    }\n\n    NumberAnimation {\n        id: opacityAnim\n        target: highlightArea\n        property: \"opacity\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0.15; to: 0\n    }\n    NumberAnimation {\n        id: ratioAnim\n        target: highlightArea\n        property: \"width\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0; to: dis.width*2\n    }\n\n    Rectangle {\n        id: background\n        anchors.fill: parent\n        radius: 6\n        color: control.Style.foregroundColor\n        opacity: control.focusedInUsingKeyboard? 0.1 : 0\n    }\n\n    Item {\n        id: highlightScene\n        anchors.fill: parent\n        clip: true\n        visible: false\n\n        Rectangle {\n            id: highlightArea\n            x: pinX - width/2\n            y: pinY - height/2\n            color: control.Style.foregroundColor\n            height: width\n            radius: height / 2\n\n            property real pinX\n            property real pinY\n        }\n    }\n\n    OpacityMask {\n        anchors.fill: parent\n        maskSource: background\n        source: highlightScene\n    }\n\n    Row {\n        id: contentRow\n        anchors.centerIn: parent\n        spacing: 10\n        scale: {\n            if (!control.pressed)\n                return 1;\n\n            let m = Math.max(width, height);\n            var res = (m-4) / m;\n            return Math.max(res, 0.95);\n        }\n        layoutDirection: delegateMode? Qt.RightToLeft : Qt.LeftToRight\n\n        Behavior on scale {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n\n        Item {\n            anchors.verticalCenter: parent.verticalCenter\n            width: 22\n            height: width\n\n            Rectangle {\n                anchors.fill: parent\n                radius: 6\n                color:  control.checked? control.Style.accentColor : control.Style.foregroundColor\n                opacity: control.checked? 1 : 0.3\n\n                Behavior on color {\n                    ColorAnimation { easing.type: Easing.OutCubic; duration: 200 }\n                }\n                Behavior on opacity {\n                    NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n                }\n            }\n\n            Root.Icon {\n                anchors.centerIn: parent\n                text: MaterialIcons.mdi_check\n                color: \"#fff\"\n                opacity: control.checked? 1 : 0\n                scale: control.checked? 1 : 2\n\n                Behavior on opacity {\n                    NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n                }\n                Behavior on scale {\n                    NumberAnimation { easing.type: Easing.OutBack; duration: 200 }\n                }\n            }\n        }\n\n        Root.Label {\n            anchors.verticalCenter: parent.verticalCenter\n            color: control.Style.foregroundColor\n            text: control.text\n            visible: text.length\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/ComboBoxDelegateStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.GraphicalEffects 2.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitHeight: 44\n    implicitWidth: contentRow.width + 40\n\n    Connections {\n        target: control\n        function onPressedChanged() {\n            if (control.pressed) {\n                highlightArea.pinX = control.pressed? control.pressedX : width/2;\n                highlightArea.pinY = control.pressed? control.pressedY : height/2;\n                highlightArea.opacity = 0.15;\n                ratioAnim.start();\n            } else {\n                opacityAnim.start();\n            }\n        }\n    }\n\n    NumberAnimation {\n        id: opacityAnim\n        target: highlightArea\n        property: \"opacity\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0.15; to: 0\n    }\n    NumberAnimation {\n        id: ratioAnim\n        target: highlightArea\n        property: \"width\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0; to: dis.width*2\n    }\n\n    Item {\n        id: background\n        anchors.fill: parent\n        visible: false\n\n        Rectangle {\n            anchors.fill: parent\n            anchors.margins: 4\n            radius: control.radius\n        }\n    }\n\n    Rectangle {\n        anchors.fill: background\n        anchors.margins: 4\n        opacity: control.pressed || control.focusedInUsingKeyboard || control.hovered? 0.1 : 0\n        color: control.Style.foregroundColor\n        radius: control.radius\n    }\n\n    Item {\n        id: highlightScene\n        anchors.fill: parent\n        clip: true\n        visible: false\n\n        Rectangle {\n            id: highlightArea\n            x: pinX - width/2\n            y: pinY - height/2\n            color: control.Style.foregroundColor\n            height: width\n            radius: height / 2\n\n            property real pinX\n            property real pinY\n        }\n    }\n\n    OpacityMask {\n        anchors.fill: parent\n        maskSource: background\n        source: highlightScene\n    }\n\n    Row {\n        id: contentRow\n        anchors.centerIn: parent\n        spacing: 4\n        scale: {\n            if (!control.pressed)\n                return 1;\n\n            let m = Math.max(width, height);\n            var res = (m-4) / m;\n            return Math.max(res, 0.95);\n        }\n\n        Behavior on scale {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n\n        Root.Label {\n            id: mainText\n            color: control.highlighted? control.Style.accentTextColor : control.Style.foregroundColor\n            text: control.text\n            visible: text.length\n            font.weight: control.selected? Font.Medium : Font.Normal\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/ComboBoxPopupStyle.qml",
    "content": "import QtQuick 2.0\n\nMenuPopupStyle {\n    id: dis\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/ComboBoxStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.GraphicalEffects 2.0\nimport AsemanQml.MaterialIcons 2.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitHeight: 44\n    implicitWidth: contentRow.width + 60\n\n    Connections {\n        target: control\n        function onPressedChanged() {\n            if (control.pressed) {\n                highlightArea.pinX = control.pressed? control.pressedX : width/2;\n                highlightArea.pinY = control.pressed? control.pressedY : height/2;\n                highlightArea.opacity = 0.15;\n                ratioAnim.start();\n            } else {\n                opacityAnim.start();\n            }\n        }\n    }\n\n    NumberAnimation {\n        id: opacityAnim\n        target: highlightArea\n        property: \"opacity\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0.15; to: 0\n    }\n    NumberAnimation {\n        id: ratioAnim\n        target: highlightArea\n        property: \"width\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0; to: dis.width*2\n    }\n\n    Item {\n        id: background\n        anchors.fill: parent\n        visible: false\n\n        Rectangle {\n            anchors.fill: parent\n            radius: control.radius\n        }\n    }\n\n    Rectangle {\n        anchors.fill: background\n        color: \"transparent\"\n        radius: control.radius\n        opacity: control.focusedInUsingKeyboard? 0.5 : 0.1\n        border.width: 1\n        border.color: control.focusedInUsingKeyboard? control.Style.accentColor : control.Style.foregroundColor\n    }\n\n    Rectangle {\n        anchors.fill: background\n        opacity: control.pressed || control.focusedInUsingKeyboard || control.hovered? 0.1 : 0\n        color: control.Style.foregroundColor\n        radius: control.radius\n    }\n\n    Item {\n        id: highlightScene\n        anchors.fill: parent\n        clip: true\n        visible: false\n\n        Rectangle {\n            id: highlightArea\n            x: pinX - width/2\n            y: pinY - height/2\n            color: control.Style.foregroundColor\n            height: width\n            radius: height / 2\n\n            property real pinX\n            property real pinY\n        }\n    }\n\n    OpacityMask {\n        anchors.fill: parent\n        maskSource: background\n        source: highlightScene\n    }\n\n    Row {\n        id: contentRow\n        anchors.left: parent.left\n        anchors.leftMargin: 20\n        anchors.verticalCenter: parent.verticalCenter\n        spacing: 4\n        scale: {\n            if (!control.pressed)\n                return 1;\n\n            let m = Math.max(width, height);\n            var res = (m-4) / m;\n            return Math.max(res, 0.95);\n        }\n\n        Behavior on scale {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n\n        Root.Label {\n            id: mainText\n            color: control.Style.foregroundColor\n            text: control.displayText\n            visible: text.length\n        }\n    }\n\n    Root.Icon {\n        anchors.verticalCenter: parent.verticalCenter\n        anchors.right: parent.right\n        anchors.rightMargin: 5\n        text: MaterialIcons.mdi_menu_down\n        color: control.Style.foregroundColor\n        font.pixelSize: 20\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/DialogSceneStyle.qml",
    "content": "import QtQuick 2.15\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitWidth: (control.item? control.item.width : 0) + padding.left + padding.right\n    implicitHeight: (control.item? control.item.height : 0) + padding.top + padding.bottom\n\n    padding {\n        top: control.title.length? headerLabel.height + 10 * Devices.density : 20 * Devices.density\n        left: 20 * Devices.density\n        right: 20 * Devices.density\n        bottom: repeater.count? buttonsRow.height + 20 * Devices.density : 20 * Devices.density\n    }\n\n    Rectangle {\n        anchors.fill: parent\n        opacity: 0.8\n        color: control.Style.baseColor\n    }\n\n    Root.Label {\n        id: headerLabel\n        y: 10 * Devices.density\n        anchors.left: parent.left\n        anchors.right: parent.right\n        anchors.margins: 20 * Devices.density\n        verticalAlignment: Text.AlignVCenter\n        horizontalAlignment: Text.AlignLeft\n        height: Devices.standardTitleBarHeight\n        text: control.title\n        font.pixelSize: 12 * Devices.fontDensity\n        font.weight: Font.Medium\n    }\n\n    RowLayout {\n        id: buttonsRow\n        anchors.right: parent.right\n        anchors.bottom: parent.bottom\n        anchors.left: parent.left\n        anchors.leftMargin: 20 * Devices.density\n        anchors.rightMargin: 20 * Devices.density\n        anchors.bottomMargin: 10 * Devices.density\n        layoutDirection: Qt.RightToLeft\n\n        Repeater {\n            id: repeater\n            model: {\n                var res = new Array;\n                for (var i=control.buttons.length-1 ;i>=0; i--) {\n                    var item = control.buttons[i];\n                    if (item.transformOrigin == undefined)\n                        continue;\n\n                    res[res.length] = item;\n                }\n                return res;\n            }\n            delegate: Item {\n                id: item\n                implicitWidth: modelData.width\n                implicitHeight: modelData.height\n                Layout.fillWidth: modelData.Layout.fillWidth\n                Layout.fillHeight: modelData.Layout.fillHeight\n                Layout.preferredWidth: modelData.Layout.preferredWidth\n                Layout.preferredHeight: modelData.Layout.preferredHeight\n\n                property Item backupParent\n                Component.onCompleted: {\n                    backupParent = modelData.parent;\n                    modelData.parent = item;\n                }\n                Component.onDestruction: modelData.parent = backupParent\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/DialogStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.GraphicalEffects 2.0\nimport AsemanQml.Viewport 2.0\nimport AsemanQml.Base 2.0\n\nAbstractViewportType {\n    id: item\n\n    foreground.height: foregroundItem? foregroundItem.height : item.height\n    foreground.width: foregroundItem? foregroundItem.width : item.width\n    foreground.scale: item.open? 1.1 - ratio * 0.1 : 1\n    foreground.opacity: ratio\n    foreground.anchors.centerIn: foreground.parent\n    foreground.z: 10\n    foreground.radius: 18 * Devices.density\n    foregroundScene.color: \"transparent\"\n\n    Behavior on ratio {\n        NumberAnimation { easing.type: Easing.OutCubic; duration: 250 }\n    }\n\n    Rectangle {\n        anchors.fill: item.background\n        color: \"#000\"\n        opacity: item.ratio * 0.2\n        visible: item.ratio\n\n        MouseArea {\n            anchors.fill: parent\n            hoverEnabled: true\n            onClicked: if (item.touchToCloseIsNull || item.touchToClose) item.open = false\n        }\n    }\n\n    RoundedItem {\n        anchors.centerIn: item.foreground\n        width: item.foreground.width\n        height: item.foreground.height\n        scale: item.foreground.scale\n        z: 8\n        opacity: item.ratio\n        radius: item.foreground.radius\n        clip: true\n\n        FastBlur {\n            anchors.centerIn: parent\n            height: item.background.height\n            width: item.background.width\n            radius: 64\n            cached: true\n            source: item.background\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/FastDropShadow.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.GraphicalEffects 2.0\n\nItem {\n    id: item\n\n    property alias radius: blur.radius\n    property alias color: shadowMask.color\n    property real horizontalOffset\n    property real verticalOffset\n    property bool cached: true\n    property alias source: shadowArea.maskSource\n\n    FastBlur {\n        id: blur\n        x: parent.width/2 - width/2 + item.horizontalOffset\n        y: parent.height/2 - height/2 + item.verticalOffset\n        width: shadowScene.width\n        height: shadowScene.height\n        source: shadowScene\n        cached: item.cached\n    }\n\n    Item {\n        id: shadowScene\n        anchors.fill: parent\n        anchors.margins: -item.radius*2\n        visible: false\n\n        Item {\n            width: item.width\n            height: item.height\n            anchors.centerIn: parent\n\n            OpacityMask {\n                id: shadowArea\n                anchors.fill: parent\n                source: shadowMask\n                cached: item.cached\n            }\n\n            Rectangle {\n                id: shadowMask\n                color: \"#333\"\n                anchors.fill: parent\n                visible: false\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/FloatPageStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Viewport 2.0\n\nAbstractViewportType {\n    id: item\n\n    fillForeground: true\n    ratio: openRatio * mouseRatio\n\n    background.scale: Math.min(1, iosBelowIndex < 2 && !tabletMode? 1 - (realRatio * ((topPadSize -  background.radius) * 2) / height) : 1)\n    background.transformOrigin: Item.Center\n    background.radius: tabletMode? 0 : 10 * Devices.density\n\n    foreground.z: 10\n    foreground.y: height * (1-ratio)\n    foreground.parent: dragArea\n    foreground.height: foregroundHeight + foreground.radius\n    foreground.radius: 10 * Devices.density\n    foreground.transformOrigin: Item.Center\n    foreground.scale: 1 - foregroundScale * ((topPadSize -  background.radius) * 2) / height\n    foregroundScene.anchors.topMargin: -Devices.statusBarHeight\n    foregroundScene.anchors.bottomMargin: foreground.radius\n\n    readonly property real topPadSize: Math.max(20 * Devices.density, Devices.statusBarHeight + 20 * Devices.density)\n    property real openRatio: open? 1 : 0\n    property real mouseRatio: 1\n    readonly property real foregroundScale: nextItem? nextItem.realRatio : 0\n    readonly property real foregroundHeight: item.height - topPadSize\n    readonly property real realRatio: 1 - foreground.y / foreground.height\n    readonly property bool tabletMode: !item.maximumWidthIsNull && item.maximumWidth != 0\n\n    readonly property bool isIOSPopup: true\n    readonly property Item nextItem: {\n        if (index==0 || !list || list.count <= index)\n            return null;\n        if (list.at(index).isIOSPopup)\n            return list.at(index);\n        return null;\n    }\n    readonly property int iosBelowIndex: {\n        if (index==0 || !list || list.count === 0)\n            return 0;\n\n        var start = Math.min(index, list.count-1);\n        for (var i=start; i>=0; i--)\n            if (!list.at(i).isIOSPopup)\n                return start - i - 1;\n\n        return index;\n    }\n\n    Behavior on openRatio {\n        NumberAnimation { easing.type: Easing.OutCubic; duration: 350 }\n    }\n\n    Rectangle {\n        anchors.fill: parent\n        z: -1\n        color: \"#000\"\n    }\n\n    Rectangle {\n        parent: item.backgroundScene\n        anchors.fill: parent\n        z: 100\n        color: \"#000\"\n        opacity: item.ratio * 0.3\n    }\n\n    NumberAnimation {\n        id: mouseRatioAnim\n        target: item\n        property: \"mouseRatio\"\n        easing.type: Easing.OutCubic\n        duration: 300\n    }\n\n    MouseArea {\n        anchors.fill: parent\n        hoverEnabled: true\n    }\n\n    MouseArea {\n        anchors.fill: parent\n        visible: item.touchToCloseIsNull || item.touchToClose\n        onClicked: open = false\n    }\n\n    MouseArea {\n        id: dragArea\n        width: tabletMode? item.maximumWidth : item.width\n        x: Math.floor(item.width/2 - foreground.width/2)\n        y: Math.floor(topPadSize * (1 - foregroundScale))\n        height: item.gestureWidthIsNull? (item.height - topPadSize) : item.gestureWidth\n        drag {\n            target: item.foreground\n            axis: Drag.YAxis\n            minimumY: 0\n            maximumY: item.height - 10\n            filterChildren: true\n            onActiveChanged: {\n                if (dragArea.drag.active)\n                    return;\n\n                mouseRatio = realRatio\n                foreground.y = Qt.binding( function() { return foregroundHeight * (1-ratio); } )\n                if (realRatio < 0.7) {\n                    open = false\n                } else {\n                    mouseRatioAnim.from = realRatio\n                    mouseRatioAnim.to = 1\n                    mouseRatioAnim.start()\n                }\n            }\n        }\n\n        MouseArea {\n            anchors.fill: parent\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/FooterButtonStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.GraphicalEffects 2.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitHeight: 44\n    implicitWidth: contentRow.width + 40\n\n    Connections {\n        target: control\n        function onPressedChanged() {\n            if (control.pressed) {\n                highlightArea.pinX = control.pressed? control.pressedX : width/2;\n                highlightArea.pinY = control.pressed? control.pressedY : height/2;\n                highlightArea.opacity = 0.1;\n                ratioAnim.start();\n            } else {\n                opacityAnim.start();\n            }\n        }\n    }\n\n    NumberAnimation {\n        id: opacityAnim\n        target: highlightArea\n        property: \"opacity\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0.15; to: 0\n    }\n    NumberAnimation {\n        id: ratioAnim\n        target: highlightArea\n        property: \"width\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0; to: dis.width*2\n    }\n\n    Item {\n        id: background\n        anchors.fill: parent\n        visible: false\n\n        Rectangle {\n            anchors.fill: parent\n        }\n    }\n\n    Rectangle {\n        anchors.fill: background\n        opacity: control.pressed || control.focusedInUsingKeyboard || control.hovered? 0.05 : 0\n        color: control.Style.foregroundColor\n    }\n\n    Item {\n        id: highlightScene\n        anchors.fill: parent\n        clip: true\n        visible: false\n\n        Rectangle {\n            id: highlightArea\n            x: pinX - width/2\n            y: pinY - height/2\n            color: control.Style.foregroundColor\n            height: width\n            radius: height / 2\n\n            property real pinX\n            property real pinY\n        }\n    }\n\n    OpacityMask {\n        anchors.fill: parent\n        maskSource: background\n        source: highlightScene\n    }\n\n    Column {\n        id: contentRow\n        anchors.centerIn: parent\n        spacing: 4\n        scale: {\n            var value = 0.8;\n            if (!control.pressed)\n                return value;\n\n            let m = Math.max(width, height);\n            var res = (m-4) / m;\n            return Math.max(res, 0.95) * value;\n        }\n\n        Behavior on scale {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n\n        Root.Icon {\n            anchors.horizontalCenter: parent.horizontalCenter\n            color: mainText.color\n            font.pixelSize: control.iconPixelSize\n            text: control.icon\n            visible: text.length\n        }\n\n        Root.Label {\n            id: mainText\n            anchors.horizontalCenter: parent.horizontalCenter\n            color: control.parent.ListView.isCurrentItem? control.Style.accentColor : control.Style.foregroundColor\n            text: control.text\n            visible: text.length\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/FooterStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.Base 2.0\n\nAbstractStyle {\n    id: dis\n    implicitHeight: Devices.navigationBarHeight + Devices.standardTitleBarHeight*1.2\n\n    padding {\n        bottom: Devices.navigationBarHeight\n    }\n\n    Connections {\n        target: control\n        function onCurrentIndexChanged() {\n            listv.currentIndex = control.currentIndex;\n        }\n    }\n\n    Rectangle {\n        anchors.fill: parent\n        color: control.Style.backgroundColor\n    }\n\n    Rectangle {\n        anchors.left: parent.left\n        anchors.right: parent.right\n        anchors.top: parent.top\n        color: control.Style.foregroundColor\n        height: 1\n        opacity: 0.1\n    }\n\n    ListView {\n        id: listv\n        anchors.horizontalCenter: parent.horizontalCenter\n        anchors.top: parent.top\n        anchors.bottom: parent.bottom\n        anchors.bottomMargin: Devices.navigationBarHeight\n\n        orientation: ListView.Horizontal\n        snapMode: ListView.SnapToItem\n\n        flickableDirection: Flickable.AutoFlickIfNeeded\n        boundsBehavior: Flickable.StopAtBounds\n\n        highlightRangeMode: ListView.ApplyRange\n        highlightFollowsCurrentItem: true\n        highlightMoveDuration: 200\n\n        currentIndex: control.currentIndex\n        onCurrentIndexChanged: control.currentIndex = currentIndex;\n\n        interactive: control.interactive\n        clip: true\n        model: {\n            var res = new Array;\n            for (var i=0 ;i<control.list.length; i++) {\n                var item = control.list[i];\n                if (item.transformOrigin == undefined)\n                    continue;\n\n                item.widthChanged.connect(listv.recalculateWidth);\n                item.visibleChanged.connect(listv.recalculateWidth);\n                res[res.length] = item;\n            }\n\n            return res;\n        }\n\n        onModelChanged: recalculateWidth()\n\n        function recalculateWidth() {\n            var width = 0;\n            for (var i=0; i<listv.model.length; i++)\n            {\n                var item = model[i];\n                if (item && item.visible)\n                    width += item.width;\n            }\n            listv.width = Qt.binding(function(){ return Math.min(dis.width, width); });\n        }\n\n        highlight: Item {\n            Rectangle {\n                anchors.left: parent.left\n                anchors.right: parent.right\n                height: 3\n                radius: height/2\n                anchors.top: parent.top\n                color: control.Style.accentColor\n            }\n        }\n\n        delegate: Item {\n            id: item\n            width: modelData.visible? modelData.width : 0\n            height: listv.height\n            opacity: modelData.visible? 1 : 0\n            enabled: modelData.visible\n            clip: true\n\n            property Item backupParent\n            Component.onCompleted: {\n                backupParent = modelData.parent;\n                modelData.parent = item;\n                modelData.anchors.left = item.left;\n                modelData.anchors.top = item.top;\n                modelData.anchors.bottom = item.bottom;\n\n                var index = model.index;\n                var list = listv;\n                if (modelData.clicked != undefined)\n                    modelData.clicked.connect(function(){list.currentIndex = index});\n            }\n            Component.onDestruction: modelData.parent = backupParent\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/HeaderStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitHeight: Devices.standardTitleBarHeight + Devices.statusBarHeight\n\n    padding {\n        top: Devices.statusBarHeight\n    }\n\n    Rectangle {\n        anchors.fill: parent\n        color: control.Style.primaryColor\n\n        Root.Label {\n            anchors.verticalCenterOffset: Devices.statusBarHeight/2\n            anchors.centerIn: parent\n            font.weight: Font.Medium\n            font.pixelSize: 10 * Devices.fontDensity\n            text: control.title\n            color: control.Style.primaryTextColor\n        }\n    }\n\n    Rectangle {\n        anchors.left: parent.left\n        anchors.right: parent.right\n        anchors.bottom: parent.bottom\n        color: control.Style.foregroundColor\n        height: 1\n        opacity: 0.1\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/IconStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.MaterialIcons 2.0\n\nAbstractStyle {\n    id: dis\n    height: control.contentHeight\n    width: control.contentWidth\n    font.family: MaterialIcons.family\n    extra: {\n        \"lineHeight\": 1,\n        \"lineHeightMode\": Text.ProportionalHeight,\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/ItemDelegateStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.GraphicalEffects 2.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitHeight: 52\n    implicitWidth: 100\n\n    Connections {\n        target: control\n        function onPressedChanged() {\n            if (control.pressed) {\n                highlightArea.pinX = control.pressed? control.pressedX : width/2;\n                highlightArea.pinY = control.pressed? control.pressedY : height/2;\n                highlightArea.opacity = 0.15;\n                ratioAnim.start();\n\n                let m = Math.max(width, height);\n                var res = (m-4) / m;\n\n                scenePressAnim.from = control.scene.scale;\n                scenePressAnim.to = Math.max(res, 0.95);\n                scenePressAnim.start();\n            } else {\n                opacityAnim.start();\n\n                scenePressAnim.from = control.scene.scale;\n                scenePressAnim.to = 1;\n                scenePressAnim.start();\n            }\n        }\n    }\n\n    NumberAnimation {\n        id: scenePressAnim\n        target: control.scene\n        property: \"scale\"\n        easing.type: Easing.Linear\n    }\n\n    NumberAnimation {\n        id: opacityAnim\n        target: highlightArea\n        property: \"opacity\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0.15; to: 0\n    }\n    NumberAnimation {\n        id: ratioAnim\n        target: highlightArea\n        property: \"width\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0; to: dis.width*2\n    }\n\n    Rectangle {\n        id: background\n        anchors.fill: parent\n        radius: control.radius\n        color: control.Style.foregroundColor\n        visible: control.hoverEnabled\n        scale: control.hoverEnabled? 1 : control.scene.scale\n        opacity: control.focusedInUsingKeyboard || control.hovered? 0.1 : 0\n    }\n\n    Item {\n        id: highlightScene\n        anchors.fill: parent\n        clip: true\n        visible: false\n\n        Rectangle {\n            id: highlightArea\n            x: pinX - width/2\n            y: pinY - height/2\n            color: control.Style.foregroundColor\n            height: width\n            radius: height / 2\n\n            property real pinX\n            property real pinY\n        }\n    }\n\n    OpacityMask {\n        anchors.fill: highlightScene\n        maskSource: background\n        source: highlightScene\n        scale: control.hoverEnabled? 1 : control.scene.scale\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/LabelStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nAbstractStyle {\n    id: dis\n    height: control.contentHeight\n    width: control.contentWidth\n    extra: {\n        \"lineHeight\": 1,\n        \"lineHeightMode\": Text.ProportionalHeight,\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/MenuButtonStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.GraphicalEffects 2.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitHeight: 44\n    implicitWidth: contentRow.width + 40\n\n    Connections {\n        target: control\n        function onPressedChanged() {\n            if (control.pressed) {\n                highlightArea.pinX = control.pressed? control.pressedX : width/2;\n                highlightArea.pinY = control.pressed? control.pressedY : height/2;\n                highlightArea.opacity = 0.15;\n                ratioAnim.start();\n            } else {\n                opacityAnim.start();\n            }\n        }\n    }\n\n    NumberAnimation {\n        id: opacityAnim\n        target: highlightArea\n        property: \"opacity\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0.15; to: 0\n    }\n    NumberAnimation {\n        id: ratioAnim\n        target: highlightArea\n        property: \"width\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0; to: dis.width*2\n    }\n\n    Item {\n        id: background\n        anchors.fill: parent\n        visible: false\n\n        Rectangle {\n            anchors.fill: parent\n            anchors.margins: 4\n            radius: control.radius\n        }\n    }\n\n    Rectangle {\n        anchors.fill: background\n        anchors.margins: 4\n        opacity: control.pressed || control.focusedInUsingKeyboard || control.hovered? 0.1 : 0\n        color: control.Style.foregroundColor\n        radius: control.radius\n    }\n\n    Item {\n        id: highlightScene\n        anchors.fill: parent\n        clip: true\n        visible: false\n\n        Rectangle {\n            id: highlightArea\n            x: pinX - width/2\n            y: pinY - height/2\n            color: control.Style.foregroundColor\n            height: width\n            radius: height / 2\n\n            property real pinX\n            property real pinY\n        }\n    }\n\n    OpacityMask {\n        anchors.fill: parent\n        maskSource: background\n        source: highlightScene\n    }\n\n    Row {\n        id: contentRow\n        anchors.centerIn: parent\n        spacing: 4\n        opacity: control.enabled? 1 : 0.4\n        scale: {\n            if (!control.pressed)\n                return 1;\n\n            let m = Math.max(width, height);\n            var res = (m-4) / m;\n            return Math.max(res, 0.95);\n        }\n\n        Behavior on scale {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n\n        Root.Icon {\n            color: mainText.color\n            font.pixelSize: control.iconPixelSize\n            text: control.icon\n            visible: text.length\n        }\n\n        Root.Label {\n            id: mainText\n            color: control.highlighted? control.Style.accentTextColor : control.Style.foregroundColor\n            text: control.text\n            visible: text.length\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/MenuPopupStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.GraphicalEffects 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Viewport 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nAbstractViewportType {\n    id: item\n\n    background.transform: Scale {\n        origin.x: listener.result.x\n        origin.y: listener.result.y\n        xScale: 1 + ratio * 0.1\n        yScale: 1 + ratio * 0.1\n    }\n\n    foreground.transform: Scale {\n        origin.x: listener.result.x\n        origin.y: listener.result.y\n        xScale: 0.5 + ratio * 0.5\n        yScale: 0.5 + ratio * 0.5\n    }\n    foreground.opacity: ratio\n    foreground.z: 10\n    foregroundScene.color: \"transparent\"\n\n    PointMapListener {\n        id: listener\n        source: item.foregroundItem\n        dest: item\n        x: item.typeTransformOriginIsNull? 0 : item.typeTransformOrigin.x\n        y: item.typeTransformOriginIsNull? 0 : item.typeTransformOrigin.y\n    }\n\n    Behavior on ratio {\n        NumberAnimation { easing.type: Easing.OutCubic; duration: 250 }\n    }\n\n    FastBlur {\n        anchors.fill: parent\n        radius: Devices.isAndroid? 0 : 64\n        cached: true\n        source: item.background\n        scale: item.background.scale\n        opacity: ratio\n        transform: Scale {\n            origin.x: listener.result.x\n            origin.y: listener.result.y\n            xScale: 1 + ratio * 0.1\n            yScale: 1 + ratio * 0.1\n        }\n\n        Rectangle {\n            anchors.fill: parent\n            opacity: Devices.isAndroid? 0.7 : 0.3\n            color: Devices.isAndroid? \"#000\" : \"#888\"\n        }\n\n        MouseArea {\n            anchors.fill: parent\n            hoverEnabled: true\n            onClicked: if (item.touchToCloseIsNull || item.touchToClose) item.open = false\n        }\n    }\n\n    Rectangle {\n        parent: item.foregroundScene\n        anchors.fill: item.foregroundItem\n        color: item.Style.baseColor\n        radius: 8\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/MenuStyle.qml",
    "content": "import QtQuick 2.0\n\nMenuPopupStyle {\n    id: dis\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/PageStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nAbstractStyle {\n    id: dis\n\n    padding {\n        top: control.header? control.header.height : 0\n        bottom: control.footer? control.footer.height : 0\n    }\n\n    Rectangle {\n        anchors.fill: parent\n        color: control.Style.backgroundColor\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/ProgressBarStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitHeight: 7\n\n    Rectangle {\n        anchors.fill: parent\n        opacity: 0.3\n        radius: height/2\n        color: control.Style.foregroundColor\n    }\n\n    Rectangle {\n        anchors.left: parent.left\n        anchors.top: parent.top\n        anchors.bottom: parent.bottom\n        radius: height/2\n        color: control.Style.accentColor\n        width: radius*2 + (dis.width - radius*2) * ((control.value + control.from) / (control.to - control.from))\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/RadioButtonStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.MaterialIcons 2.0\nimport AsemanQml.GraphicalEffects 2.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitHeight: contentRow.height + 14\n    implicitWidth: contentRow.width + 14\n\n    property bool delegateMode\n\n    Connections {\n        target: control\n        function onPressedChanged() {\n            if (control.pressed) {\n                highlightArea.pinX = control.pressed? control.pressedX : width/2;\n                highlightArea.pinY = control.pressed? control.pressedY : height/2;\n                highlightArea.opacity = 0.15;\n                ratioAnim.start();\n            } else {\n                opacityAnim.start();\n            }\n        }\n    }\n\n    NumberAnimation {\n        id: opacityAnim\n        target: highlightArea\n        property: \"opacity\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0.15; to: 0\n    }\n    NumberAnimation {\n        id: ratioAnim\n        target: highlightArea\n        property: \"width\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0; to: dis.width*2\n    }\n\n    Rectangle {\n        id: background\n        anchors.fill: parent\n        radius: 6\n        color: control.Style.foregroundColor\n        opacity: control.focusedInUsingKeyboard? 0.1 : 0\n    }\n\n    Item {\n        id: highlightScene\n        anchors.fill: parent\n        clip: true\n        visible: false\n\n        Rectangle {\n            id: highlightArea\n            x: pinX - width/2\n            y: pinY - height/2\n            color: control.Style.foregroundColor\n            height: width\n            radius: height / 2\n\n            property real pinX\n            property real pinY\n        }\n    }\n\n    OpacityMask {\n        anchors.fill: parent\n        maskSource: background\n        source: highlightScene\n    }\n\n    Row {\n        id: contentRow\n        anchors.centerIn: parent\n        spacing: 10\n        scale: {\n            if (!control.pressed)\n                return 1;\n\n            let m = Math.max(width, height);\n            var res = (m-4) / m;\n            return Math.max(res, 0.95);\n        }\n        layoutDirection: delegateMode? Qt.RightToLeft : Qt.LeftToRight\n\n        Behavior on scale {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n\n        Item {\n            anchors.verticalCenter: parent.verticalCenter\n            width: 22\n            height: width\n\n            Rectangle {\n                anchors.fill: parent\n                radius: height/2\n                color:  control.checked? control.Style.accentColor : control.Style.foregroundColor\n                opacity: control.checked? 1 : 0.3\n\n                Behavior on color {\n                    ColorAnimation { easing.type: Easing.OutCubic; duration: 200 }\n                }\n                Behavior on opacity {\n                    NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n                }\n            }\n\n            Rectangle {\n                anchors.fill: parent\n                anchors.margins: 6\n                radius: height/2\n                color: control.Style.accentTextColor\n                opacity: control.checked? 1 : 0\n\n                Behavior on opacity {\n                    NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n                }\n                Behavior on scale {\n                    NumberAnimation { easing.type: Easing.OutBack; duration: 200 }\n                }\n            }\n        }\n\n        Root.Label {\n            anchors.verticalCenter: parent.verticalCenter\n            color: control.Style.foregroundColor\n            text: control.text\n            visible: text.length\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/ScrollBarStyle.qml",
    "content": "import QtQuick 2.15\nimport AsemanQml.Controls.Beta 3.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitWidth: 8\n\n    opacity: control.flickArea.movingVertically || control.flickArea.movingHorizontally || control.forceVisible? 1 : 0\n\n    function position()\n    {\n        var ny = 0;\n        if (control.orientation == Qt.Vertical)\n            ny = control.flickArea.visibleArea.yPosition * dis.height;\n        else\n            ny = control.flickArea.visibleArea.xPosition * dis.width;\n        if (ny > 2) return ny; else return 2;\n    }\n\n    function size()\n    {\n        var nh, ny;\n\n        if (control.orientation == Qt.Vertical)\n            nh = control.flickArea.visibleArea.heightRatio * dis.height;\n        else\n            nh = control.flickArea.visibleArea.widthRatio * dis.width;\n\n        if (control.orientation == Qt.Vertical)\n            ny = control.flickArea.visibleArea.yPosition * dis.height;\n        else\n            ny = control.flickArea.visibleArea.xPosition * dis.width;\n\n        if (ny > 3) {\n            var t;\n            if (control.orientation == Qt.Vertical)\n                t = Math.ceil(dis.height - 3 - ny);\n            else\n                t = Math.ceil(dis.width - 3 - ny);\n            if (nh > t) return t; else return nh;\n        } else return nh + ny;\n    }\n\n    Rectangle {\n        id: bilbilak\n        color: control.color\n        smooth: true\n        radius: width/2\n        x: control.orientation == Qt.Vertical ? 2 : position()\n        width: control.orientation == Qt.Vertical ? dis.width - 4 : diagonal\n        y: control.orientation == Qt.Vertical ? position() : 2\n        height: control.orientation == Qt.Vertical ? diagonal : dis.height - 4\n        opacity: 0.5\n\n        property real diagonal: size()<20? 20 : size()\n    }\n\n    Behavior on opacity {\n        NumberAnimation { duration: 300 }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/ScrollViewStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    data: [verticalScrollBar]\n\n    property Root.ScrollBar verticalScrollBar: Root.ScrollBar {\n        anchors.right: parent.right\n        anchors.top: parent.top\n        anchors.bottom: parent.bottom\n        z: 1000\n        flickArea: control.flickArea\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/SliderStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitHeight: 28\n\n    Connections {\n        target: control\n        function onPressedXChanged() {\n            if (!control.pressed)\n                return;\n\n            var val = ((control.pressedX - background.x) * (control.to - control.from) / background.width) + control.from;\n            control.value = Math.min(control.to, Math.max(control.from, val));\n        }\n    }\n\n    Rectangle {\n        anchors.fill: parent\n        radius: 6\n        color: control.Style.foregroundColor\n        opacity: control.focusedInUsingKeyboard? 0.1 : 0\n    }\n\n    Rectangle {\n        id: background\n        anchors.left: parent.left\n        anchors.right: parent.right\n        anchors.verticalCenter: parent.verticalCenter\n        anchors.margins: 12\n        height: 5\n        opacity: 0.3\n        radius: height/2\n        color: control.Style.foregroundColor\n    }\n\n    Rectangle {\n        id: fillArea\n        anchors.left: background.left\n        anchors.top: background.top\n        anchors.bottom: background.bottom\n        radius: height/2\n        color: control.Style.accentColor\n        width: radius*2 + (background.width - radius*2) * ((control.value + control.from) / (control.to - control.from))\n    }\n\n    Rectangle {\n        anchors.horizontalCenter: fillArea.right\n        anchors.horizontalCenterOffset: -fillArea.radius\n        anchors.top: parent.top\n        anchors.bottom: parent.bottom\n        anchors.margins: 4\n        width: height\n        radius: height/2\n        color: control.Style.accentColor\n        scale: {\n            if (!control.pressed)\n                return 1;\n\n            let m = Math.max(width, height);\n            var res = (m-4) / m;\n            return Math.max(res, 0.95);\n        }\n\n        Behavior on scale {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n\n        Rectangle {\n            anchors.fill: parent\n            anchors.margins: 2\n            radius: height/2\n            color: control.Style.backgroundColor\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/StackPageStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Viewport 2.0\n\nAbstractViewportType {\n    id: item\n\n    fillForeground: true\n    ratio: openRatio * mouseRatio\n\n    background.x: LayoutMirroring.enabled? (foreground.x + item.width)/2 : (foreground.x - item.width)/2\n\n    foreground.parent: dragScene\n    foreground.anchors.top: foreground.parent.top\n    foreground.anchors.bottom: foreground.parent.bottom\n    foreground.x: foregroundX\n\n    property real openRatio: open? 1 : 0\n    property real mouseRatio: 1\n    readonly property real foregroundX: (LayoutMirroring.enabled? -width : width) * (1-ratio)\n\n    Behavior on openRatio {\n        NumberAnimation { easing.type: Easing.OutCubic; duration: 250 }\n    }\n\n    Rectangle {\n        parent: item.backgroundScene\n        anchors.fill: parent\n        z: 100\n        color: \"#000\"\n        opacity: item.openRatio * 0.4\n    }\n\n    NumberAnimation {\n        id: mouseRatioAnim\n        target: item\n        property: \"mouseRatio\"\n        easing.type: Easing.OutCubic\n        duration: 300\n    }\n\n    MouseArea {\n        id: dragArea\n        anchors.top: parent.top\n        anchors.bottom: parent.bottom\n        anchors.left: parent.left\n        width: item.gestureWidthIsNull? parent.width : item.gestureWidth\n        drag {\n            target: item.foreground\n            axis: Drag.XAxis\n            minimumX: LayoutMirroring.enabled? -item.width + 10 : 0\n            maximumX: LayoutMirroring.enabled? 0 : item.width - 10\n            filterChildren: true\n            onActiveChanged: {\n                if (dragArea.drag.active)\n                    return;\n\n                mouseRatio = (LayoutMirroring.enabled? item.width + foreground.x : item.width - foreground.x) / item.width\n                foreground.x = Qt.binding( function(){ return foregroundX } )\n\n                if (mouseRatio < 0.7) {\n                    open = false\n                } else {\n                    mouseRatioAnim.from = mouseRatio\n                    mouseRatioAnim.to = 1\n                    mouseRatioAnim.start()\n                }\n            }\n        }\n\n        MouseArea {\n            anchors.fill: parent\n        }\n\n        Item {\n            id: dragScene\n            width: item.width\n            anchors.top: parent.top\n            anchors.bottom: parent.bottom\n            anchors.left: parent.left\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/SwipeViewStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.Controls.Beta 3.0\n\nAbstractStyle {\n    id: dis\n\n    Connections {\n        target: control\n        function onCurrentIndexChanged() {\n            listv.currentIndex = control.currentIndex;\n        }\n    }\n\n    ListView {\n        id: listv\n        anchors.fill: parent\n        orientation: ListView.Horizontal\n        highlightRangeMode: ListView.StrictlyEnforceRange\n        highlightMoveDuration: 250\n        snapMode: ListView.SnapOneItem\n        currentIndex: control.currentIndex\n        onCurrentIndexChanged: if (moving) control.currentIndex = currentIndex;\n        interactive: control.interactive\n        clip: true\n        model: {\n            var res = new Array;\n            for (var i=0 ;i<control.list.length; i++) {\n                var item = control.list[i];\n                if (item.transformOrigin == undefined)\n                    continue;\n\n                item.visible = false;\n                res[res.length] = item;\n            }\n            return res;\n        }\n        delegate: Control {\n            id: item\n            width: listv.width\n            height: listv.height\n            clip: true\n            focusableUsingKeyboard: false\n            focusable: false\n\n\n            property Item backupParent\n            Component.onCompleted: {\n                backupParent = modelData.parent;\n                modelData.parent = item;\n                modelData.anchors.fill = item;\n                modelData.visible = true;\n            }\n            Component.onDestruction: {\n                modelData.visible = false;\n                modelData.parent = backupParent\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/SwitchDelegateStyle.qml",
    "content": "import QtQuick 2.0\n\nSwitchStyle {\n    delegateMode: true\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/SwitchStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.MaterialIcons 2.0\nimport AsemanQml.GraphicalEffects 2.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitHeight: contentRow.height + 14\n    implicitWidth: contentRow.width + 14\n\n    property bool delegateMode\n\n    Connections {\n        target: control\n        function onPressedChanged() {\n            if (control.pressed) {\n                highlightArea.pinX = control.pressed? control.pressedX : width/2;\n                highlightArea.pinY = control.pressed? control.pressedY : height/2;\n                highlightArea.opacity = 0.15;\n                ratioAnim.start();\n            } else {\n                opacityAnim.start();\n            }\n        }\n    }\n\n    NumberAnimation {\n        id: opacityAnim\n        target: highlightArea\n        property: \"opacity\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0.15; to: 0\n    }\n    NumberAnimation {\n        id: ratioAnim\n        target: highlightArea\n        property: \"width\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0; to: dis.width*2\n    }\n\n    Rectangle {\n        id: background\n        anchors.fill: parent\n        radius: 6\n        color: control.Style.foregroundColor\n        opacity: control.focusedInUsingKeyboard? 0.1 : 0\n    }\n\n    Item {\n        id: highlightScene\n        anchors.fill: parent\n        clip: true\n        visible: false\n\n        Rectangle {\n            id: highlightArea\n            x: pinX - width/2\n            y: pinY - height/2\n            color: control.Style.foregroundColor\n            height: width\n            radius: height / 2\n\n            property real pinX\n            property real pinY\n        }\n    }\n\n    OpacityMask {\n        anchors.fill: parent\n        maskSource: background\n        source: highlightScene\n    }\n\n    Row {\n        id: contentRow\n        anchors.centerIn: parent\n        spacing: 10\n        scale: {\n            if (!control.pressed)\n                return 1;\n\n            let m = Math.max(width, height);\n            var res = (m-4) / m;\n            return Math.max(res, 0.95);\n        }\n        layoutDirection: delegateMode? Qt.RightToLeft : Qt.LeftToRight\n\n        Behavior on scale {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n\n        Item {\n            width: 36\n            height: 22\n\n            Rectangle {\n                id: bilbil\n                anchors.verticalCenter: parent.verticalCenter\n                width: parent.width\n                height: parent.height\n                radius: height/2\n                color:  control.checked? control.Style.accentColor : control.Style.foregroundColor\n                opacity: control.checked? 1 : 0.3\n\n                Behavior on color {\n                    ColorAnimation { easing.type: Easing.OutCubic; duration: 200 }\n                }\n                Behavior on opacity {\n                    NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n                }\n            }\n\n            Rectangle {\n                height: parent.height - 4\n                anchors.verticalCenter: parent.verticalCenter\n                x: control.checked? (control.LayoutMirroring.enabled? 2 : parent.width - width - 2) : (control.LayoutMirroring.enabled? parent.width - width - 2 : 2)\n                width: height\n                radius: height / 2\n                color: control.Style.backgroundColor\n\n                Behavior on opacity {\n                    NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n                }\n\n                Behavior on x {\n                    NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n                }\n            }\n        }\n\n        Root.Label {\n            anchors.verticalCenter: parent.verticalCenter\n            color: control.Style.foregroundColor\n            text: control.text\n            visible: text.length\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/TabBarStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\n\nAbstractStyle {\n    id: dis\n    implicitHeight: 46\n\n    Connections {\n        target: control\n        function onCurrentIndexChanged() {\n            listv.currentIndex = control.currentIndex;\n        }\n    }\n\n    Rectangle {\n        anchors.fill: listv\n        anchors.margins: 3\n        anchors.leftMargin: -3\n        anchors.rightMargin: -3\n        radius: 10\n        color: control.Style.backgroundColor\n    }\n\n    Rectangle {\n        anchors.fill: listv\n        anchors.margins: 3\n        anchors.leftMargin: -3\n        anchors.rightMargin: -3\n        color: control.Style.foregroundColor\n        opacity: 0.1\n        radius: 10\n    }\n\n    ListView {\n        id: listv\n        anchors.horizontalCenter: parent.horizontalCenter\n        anchors.top: parent.top\n        anchors.bottom: parent.bottom\n\n        orientation: ListView.Horizontal\n        snapMode: ListView.SnapToItem\n\n        flickableDirection: Flickable.AutoFlickIfNeeded\n        boundsBehavior: Flickable.StopAtBounds\n\n        highlightRangeMode: ListView.ApplyRange\n        highlightFollowsCurrentItem: true\n        highlightMoveDuration: 200\n\n        currentIndex: control.currentIndex\n        onCurrentIndexChanged: control.currentIndex = currentIndex;\n\n        interactive: control.interactive\n        clip: true\n        model: {\n            var res = new Array;\n            for (var i=0 ;i<control.list.length; i++) {\n                var item = control.list[i];\n                if (item.transformOrigin == undefined)\n                    continue;\n\n                item.widthChanged.connect(listv.recalculateWidth);\n                item.visibleChanged.connect(listv.recalculateWidth);\n                res[res.length] = item;\n            }\n\n            return res;\n        }\n\n        onModelChanged: recalculateWidth()\n\n        function recalculateWidth() {\n            var width = 0;\n            for (var i=0; i<listv.model.length; i++)\n            {\n                var item = model[i];\n                if (item && item.visible)\n                    width += item.width;\n            }\n            listv.width = Qt.binding(function(){ return Math.min(dis.width-18, width); });\n        }\n\n        highlight: Item {\n            FastDropShadow {\n                anchors.fill: back\n                source: back\n                horizontalOffset: 0\n                verticalOffset: 1\n                radius: 5\n                opacity: 0.2\n                color: control.Style.foregroundColor\n            }\n\n            Rectangle {\n                id: back\n                anchors.fill: parent\n                anchors.margins: 7\n                anchors.leftMargin: 1\n                anchors.rightMargin: 1\n                color: control.Style.backgroundColor\n                radius: 8\n\n                Rectangle {\n                    anchors.fill: parent\n                    color: \"#fff\"\n                    radius: 8\n                    opacity: 0.3\n                }\n            }\n        }\n\n        delegate: Item {\n            id: item\n            width: modelData.visible? modelData.width : 0\n            height: listv.height\n            opacity: modelData.visible? 1 : 0\n            enabled: modelData.visible\n            clip: true\n\n            Connections {\n                target: modelData\n                function onClicked() {\n                    listv.currentIndex = model.index\n                }\n            }\n\n            property Item backupParent\n            Component.onCompleted: {\n                backupParent = modelData.parent;\n                modelData.parent = item;\n                modelData.anchors.left = item.left;\n                modelData.anchors.top = item.top;\n                modelData.anchors.bottom = item.bottom;\n                if (modelData.clicked != undefined)\n                    modelData.clicked.connect(function(){listv.currentIndex = model.index});\n            }\n            Component.onDestruction: modelData.parent = backupParent\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/TabButtonStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport AsemanQml.GraphicalEffects 2.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitHeight: 44\n    implicitWidth: contentRow.width + 40\n\n    Connections {\n        target: control\n        function onPressedChanged() {\n            if (control.pressed) {\n                highlightArea.pinX = control.pressed? control.pressedX : width/2;\n                highlightArea.pinY = control.pressed? control.pressedY : height/2;\n                highlightArea.opacity = 0.1;\n                ratioAnim.start();\n            } else {\n                opacityAnim.start();\n            }\n        }\n    }\n\n    NumberAnimation {\n        id: opacityAnim\n        target: highlightArea\n        property: \"opacity\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0.15; to: 0\n    }\n    NumberAnimation {\n        id: ratioAnim\n        target: highlightArea\n        property: \"width\"\n        easing.type: Easing.Linear\n        duration: 300\n        from: 0; to: dis.width*2\n    }\n\n    Item {\n        id: background\n        anchors.fill: parent\n        visible: false\n\n        Rectangle {\n            anchors.fill: parent\n            anchors.margins: 7\n            anchors.leftMargin: 1\n            anchors.rightMargin: 1\n            radius: control.radius\n        }\n    }\n\n    Rectangle {\n        anchors.fill: background\n        anchors.leftMargin: 1\n        anchors.rightMargin: 1\n        anchors.margins: 7\n        opacity: control.pressed || control.focusedInUsingKeyboard || control.hovered? 0.05 : 0\n        color: control.Style.foregroundColor\n        radius: control.radius\n    }\n\n    Item {\n        id: highlightScene\n        anchors.fill: parent\n        clip: true\n        visible: false\n\n        Rectangle {\n            id: highlightArea\n            x: pinX - width/2\n            y: pinY - height/2\n            color: control.Style.foregroundColor\n            height: width\n            radius: height / 2\n\n            property real pinX\n            property real pinY\n        }\n    }\n\n    OpacityMask {\n        anchors.fill: parent\n        maskSource: background\n        source: highlightScene\n    }\n\n    Row {\n        id: contentRow\n        anchors.centerIn: parent\n        spacing: 4\n        scale: {\n            if (!control.pressed)\n                return 1;\n\n            let m = Math.max(width, height);\n            var res = (m-4) / m;\n            return Math.max(res, 0.95);\n        }\n\n        Behavior on scale {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n        }\n\n        Root.Icon {\n            anchors.verticalCenter: parent.verticalCenter\n            color: mainText.color\n            font.pixelSize: control.iconPixelSize\n            text: control.icon\n            visible: text.length\n        }\n\n        Root.Label {\n            anchors.verticalCenter: parent.verticalCenter\n            id: mainText\n            color: control.highlighted? control.Style.accentTextColor : control.Style.foregroundColor\n            text: control.text\n            visible: text.length\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/TextAreaStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitHeight: control.height\n    implicitWidth: control.width\n\n    padding {\n        top: 8\n        bottom: 10\n        left: 4\n        right: 4\n    }\n\n    NumberAnimation {\n        id: scenePressAnim\n        target: control\n        property: \"scale\"\n        easing.type: Easing.Linear\n    }\n\n    Root.Label {\n        anchors.fill: parent\n        leftPadding: dis.padding.left\n        topPadding: dis.padding.top\n        rightPadding: dis.padding.right\n        bottomPadding: dis.padding.bottom\n        horizontalAlignment: control.horizontalAlignment\n        verticalAlignment: control.horizontalAlignment\n        font: control.font\n        color: control.color\n        opacity: 0.5\n        text: control.placeholderText\n        visible: control.text.length == 0\n    }\n\n    Item {\n        id: highlightArea\n        anchors.left: parent.left\n        anchors.right: parent.right\n        anchors.bottom: parent.bottom\n        height: 2\n\n        Rectangle {\n            anchors.fill: parent\n            color: control.Style.foregroundColor\n            opacity: 0.1\n        }\n\n        Rectangle {\n            anchors.centerIn: parent\n            height: parent.height\n            width: control.activeFocus || marea.pressed? parent.width : 0\n            radius: height/2\n            color: control.Style.accentColor\n\n            Behavior on width {\n                NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n            }\n        }\n    }\n\n    MouseArea {\n        id: marea\n        hoverEnabled: true\n        acceptedButtons: Qt.RightButton\n        cursorShape: Qt.IBeamCursor\n        anchors.fill: parent\n        onPressed: {\n            let m = Math.max(width, height);\n            var res = (m-4) / m;\n\n            scenePressAnim.from = control.scale;\n            scenePressAnim.to = Math.max(res, 0.95);\n            scenePressAnim.start();\n        }\n        onReleased: {\n            scenePressAnim.from = control.scale;\n            scenePressAnim.to = 1;\n            scenePressAnim.start();\n\n            control.contextMenuRequest(mouseX, mouseY);\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/Beta/styles/simple/TextFieldStyle.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Controls.Beta 3.0\nimport \"../..\" as Root\n\nAbstractStyle {\n    id: dis\n    implicitHeight: (control.contentHeight <= 0? 33 : control.contentHeight + 18)\n    implicitWidth: control.width\n\n    padding {\n        top: 9\n        bottom: 10\n        left: 4\n        right: 4\n    }\n\n    NumberAnimation {\n        id: scenePressAnim\n        target: control\n        property: \"scale\"\n        easing.type: Easing.Linear\n    }\n\n    Root.Label {\n        anchors.fill: parent\n        leftPadding: dis.padding.left\n        topPadding: dis.padding.top\n        rightPadding: dis.padding.right\n        bottomPadding: dis.padding.bottom\n        font: control.font\n        color: control.color\n        opacity: 0.5\n        horizontalAlignment: control.horizontalAlignment\n        verticalAlignment: control.horizontalAlignment\n        text: control.placeholderText\n        visible: control.text.length == 0\n    }\n\n    Item {\n        id: highlightArea\n        anchors.left: parent.left\n        anchors.right: parent.right\n        anchors.bottom: parent.bottom\n        height: 2\n\n        Rectangle {\n            anchors.fill: parent\n            color: control.Style.foregroundColor\n            opacity: 0.1\n        }\n\n        Rectangle {\n            anchors.centerIn: parent\n            height: parent.height\n            width: control.activeFocus || marea.pressed? parent.width : 0\n            radius: height/2\n            color: control.Style.accentColor\n\n            Behavior on width {\n                NumberAnimation { easing.type: Easing.OutCubic; duration: 200 }\n            }\n        }\n    }\n\n    MouseArea {\n        id: marea\n        hoverEnabled: true\n        acceptedButtons: Qt.RightButton\n        cursorShape: Qt.IBeamCursor\n        anchors.fill: parent\n        onPressed: {\n            let m = Math.max(width, height);\n            var res = (m-4) / m;\n\n            scenePressAnim.from = control.scale;\n            scenePressAnim.to = Math.max(res, 0.95);\n            scenePressAnim.start();\n        }\n        onReleased: {\n            scenePressAnim.from = control.scale;\n            scenePressAnim.to = 1;\n            scenePressAnim.start();\n\n            control.contextMenuRequest(mouseX, mouseY);\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickabstractbutton.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickabstractstyle.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickboxsize.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickcolumnlayout.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickcontrolitem.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicklayout.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickmainpalette.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickradiobuttoncontrol.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickradiobuttongroup.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickrowlayout.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicksceneitem.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickscrollviewcore.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickstyleattachedproperty.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickstyleditem.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemcontrolsbeta.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/controlsbetaplugin.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickabstractbutton.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickabstractstyle.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickboxsize.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickcolumnlayout.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickcontrolitem.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicklayout.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickmainpalette.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickradiobuttoncontrol.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickradiobuttongroup.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickrowlayout.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicksceneitem.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickscrollviewcore.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickstyleattachedproperty.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickstyleditem.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemcontrolsbeta.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/controlsbetaplugin.cpp\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/qmake_asemancontrols_beta.qrc\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanqttoolsitemcontrolsbeta.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtToolsItemControlsBeta is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtToolsItemControlsBeta is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanqttoolsitemcontrolsbeta.h\"\n#include \"asemanquicksceneitem.h\"\n#include \"asemanquickcontrolitem.h\"\n#include \"asemanquickmainpalette.h\"\n#include \"asemanquickabstractbutton.h\"\n#include \"asemanquickstyleattachedproperty.h\"\n#include \"asemanquickabstractstyle.h\"\n#include \"asemanquickradiobuttoncontrol.h\"\n#include \"asemanquickradiobuttongroup.h\"\n#include \"asemanquickscrollviewcore.h\"\n#include \"asemanquickcolumnlayout.h\"\n#include \"asemanquickrowlayout.h\"\n\n#include <qqml.h>\n#include <QHash>\n#include <QPointer>\n#include <QFile>\n#include <QDir>\n#include <QSet>\n\n#define SINGLETON_PROVIDER(TYPE, FNC_NAME, NEW_CREATOR) \\\n    static QObject *FNC_NAME(QQmlEngine *engine, QJSEngine *scriptEngine) { \\\n        Q_UNUSED(engine) \\\n        Q_UNUSED(scriptEngine) \\\n        TYPE *singleton = NEW_CREATOR; \\\n        return singleton; \\\n    }\n\nSINGLETON_PROVIDER(AsemanQuickMainPalette, aseman_controls_mainpalette_singleton, new AsemanQuickMainPalette(engine))\n\nstatic QStringList aseman_qt_tools_indexCache;\nstatic QString aseman_qt_tools_destination;\n\nvoid AsemanQtToolsItemControlsBeta::registerTypes(const char *uri, bool exportMode)\n{\n    static QSet<QByteArray> register_list;\n    if(register_list.contains(uri) && !exportMode)\n        return;\n\n    registerType<AsemanQuickSceneItem>(uri, 3, 0, \"Scene\", exportMode);\n    registerType<AsemanQuickControlItem>(uri, 3, 0, \"Control\", exportMode);\n    registerType<AsemanQuickRadioButtonControl>(uri, 3, 0, \"RadioControl\", exportMode);\n    registerType<AsemanQuickStyledItem>(uri, 3, 0, \"StyledItem\", exportMode);\n    registerType<AsemanQuickAbstractStyle>(uri, 3, 0, \"AbstractStyle\", exportMode);\n    registerType<AsemanQuickRadioButtonGroup>(uri, 3, 0, \"RadioButtonGroup\", exportMode);\n    registerType<AsemanQuickScrollViewCore>(uri, 3, 0, \"ScrollViewCore\", exportMode);\n    registerType<AsemanQuickColumnLayout>(uri, 3, 0, \"ColumnLayout\", exportMode);\n    registerType<AsemanQuickRowLayout>(uri, 3, 0, \"RowLayout\", exportMode);\n    registerUncreatableType<AsemanQuickStyleProperty>(uri, 3, 0, \"Style\", \"\", exportMode);\n    registerUncreatableType<AsemanQuickRadioButtonGroupAttachedCreator>(uri, 3, 0, \"ButtonGroup\", \"\", exportMode);\n    registerUncreatableType<AsemanQuickLayout>(uri, 3, 0, \"Layout\", \"\", exportMode);\n    registerUncreatableType<AsemanQuickBoxSize>(uri, 3, 0, \"BoxSize\", \"\", exportMode);\n    registerSingletonType<AsemanQuickMainPalette>(uri, 3, 0, \"MainPalette\", aseman_controls_mainpalette_singleton, exportMode);\n\n    register_list.insert(uri);\n}\n\nvoid AsemanQtToolsItemControlsBeta::registerFiles(const QString &filesLocation, const char *uri)\n{\n    QFile file(filesLocation + QStringLiteral(\"/qmldir\"));\n    if(file.open(QFile::ReadOnly))\n    {\n        QStringList lines = QString::fromUtf8(file.readAll()).split(QStringLiteral(\"\\n\"), Qt::SkipEmptyParts);\n        file.close();\n\n        for(const QString &l: lines)\n        {\n            QStringList parts = l.trimmed().split(QStringLiteral(\" \"), Qt::SkipEmptyParts);\n            bool singleton = false;\n            if(parts.count() && parts.first() == \"singleton\")\n                singleton = parts.takeFirst().count();\n            if(parts.length() != 3)\n                continue;\n\n            QStringList version = parts.at(1).split(QStringLiteral(\".\"), Qt::SkipEmptyParts);\n            if(version.count() != 2)\n                continue;\n\n            if(singleton)\n                qmlRegisterSingletonType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                         uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n            else\n                qmlRegisterType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n        }\n    }\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemControlsBeta::registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemControlsBeta::registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportModel<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemControlsBeta::registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterSingletonType<T>(uri, versionMajor, versionMinor, typeName, callback);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemControlsBeta::registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(qmlName));\n    else\n        return qmlRegisterUncreatableType<T>(uri, versionMajor, versionMinor, qmlName, reason);\n    return 0;\n}\n\n\nvoid AsemanQtToolsItemControlsBeta::exportDocuments(const QString &destination)\n{\n    aseman_qt_tools_destination = destination;\n\n    QDir().mkpath(aseman_qt_tools_destination);\n    aseman_qt_tools_indexCache.clear();\n\n    AsemanQtToolsItemControlsBeta::registerTypes(\"AsemanToolsItem\", true);\n\n    QString index = QStringLiteral(\"# AsemanToolsItem Documents\\n\\n\");\n    index += QStringLiteral(\"### [Getting Started](gettingstarted.md)\\n\\n\");\n    index += QStringLiteral(\"### How to import:\\n\\n\");\n    index += QStringLiteral(\"```c++\\nimport AsemanQml.Base 2.0\\n```\\n\\nor\\n\\n\"\n             \"```c++\\nimport AsemanQml.Base 2.0 as Aseman\\n```\\n\\n\");\n    index += QStringLiteral(\"### Types\\n\\nHere are all components of the AsemanToolsItem:\\n\\n\");\n    for(const QString cmpnt: aseman_qt_tools_indexCache)\n    {\n        if(cmpnt == QStringLiteral(\"MimeData\"))\n            index += QStringLiteral(\"\\n##### Normal types\\n\\n\");\n        if(cmpnt == QStringLiteral(\"MixedListModel\"))\n            index += QStringLiteral(\"\\n##### Models\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Devices\"))\n            index += QStringLiteral(\"\\n##### Singletons\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Screen\"))\n            index += QStringLiteral(\"\\n##### Uncreatable types\\n\\n\");\n        index += QStringLiteral(\" * [%1](%2.md)\\n\").arg(cmpnt).arg(cmpnt.toLower());\n    }\n\n    QString path = aseman_qt_tools_destination + \"/start.md\";\n    aseman_qt_tools_destination.clear();\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return;\n\n    file.write(index.toUtf8());\n    file.close();\n}\n\nQString AsemanQtToolsItemControlsBeta::fixType(const QString &type)\n{\n    if(type == QStringLiteral(\"QSizeF\") || type == QStringLiteral(\"QSize\"))\n        return QStringLiteral(\"size\");\n    if(type == QStringLiteral(\"QPoint\") || type == QStringLiteral(\"QPointF\"))\n        return QStringLiteral(\"point\");\n    if(type == QStringLiteral(\"QUrl\"))\n        return QStringLiteral(\"url\");\n    if(type == QStringLiteral(\"QString\"))\n        return QStringLiteral(\"string\");\n    if(type == QStringLiteral(\"QByteArray\"))\n        return QStringLiteral(\"byte\");\n    if(type == QStringLiteral(\"bool\"))\n        return QStringLiteral(\"boolean\");\n    if(type == QStringLiteral(\"double\") || type == QStringLiteral(\"qreal\"))\n        return QStringLiteral(\"real\");\n    if(type == QStringLiteral(\"QVariant\"))\n        return QStringLiteral(\"variant\");\n    if(type == QStringLiteral(\"QJSValue\"))\n        return QStringLiteral(\"function(){[code]}\");\n    if(type == QStringLiteral(\"QVariantMap\"))\n        return QStringLiteral(\"map\");\n    if(type == QStringLiteral(\"QVariantList\"))\n        return QStringLiteral(\"list&lt;variant&gt;\");\n    if(type == QStringLiteral(\"QStringList\"))\n        return QStringLiteral(\"list&lt;string&gt;\");\n    if(type == QStringLiteral(\"QList<qint32>\"))\n        return QStringLiteral(\"list&lt;int&gt;\");\n    if(type.contains(QStringLiteral(\"*\")))\n    {\n        if(type == QStringLiteral(\"QObject*\"))\n            return QStringLiteral(\"object\");\n        if(type.contains(QStringLiteral(\"Telegram\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Telegram\"));\n            return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n        }\n        if(type.contains(QStringLiteral(\"Object\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Object\"));\n            return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                    .arg(name).arg(name.toLower());\n        }\n        if(type == QStringLiteral(\"QQmlComponent*\"))\n            return QStringLiteral(\"Component\");\n        if(type == QStringLiteral(\"QQuickItem\"))\n            return QStringLiteral(\"Item\");\n    }\n    if(type.contains(QStringLiteral(\"Telegram\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Telegram\"));\n        return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n    }\n    if(type == QStringLiteral(\"QQuickItem\"))\n        return QStringLiteral(\"Item\");\n    if(type == QStringLiteral(\"QObject\"))\n        return QStringLiteral(\"object\");\n    if(type.contains(QStringLiteral(\"Object\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Object\"));\n        return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                .arg(name).arg(name.toLower());\n    }\n    return type;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemControlsBeta::exportItem(const QString &module, int major, int minor, const QString &component, bool store)\n{\n    QString result;\n    aseman_qt_tools_indexCache << component;\n\n    QMetaObject meta = T::staticMetaObject;\n    QString inherits = fixType(QString::fromUtf8(meta.superClass()? meta.superClass()->className() : \"\"));\n    bool isModel = component.toLower().contains(QStringLiteral(\"model\"));\n\n    result += QStringLiteral(\"# %1\\n\\n\").arg(component);\n\n    QString headers;\n    headers += QStringLiteral(\" * [Component details](#component-details)\\n\");\n\n    QString details = QStringLiteral(\"\\n### Component details:\\n\\n\");\n    details += QStringLiteral(\"|Detail|Value|\\n\"\n                       \"|------|-----|\\n\");\n    details += QStringLiteral(\"|%1|%2 %3.%4|\\n\").arg(QStringLiteral(\"Import\")).arg(module).arg(major).arg(minor);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Component\")).arg(component);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"C++ class\")).arg(QString::fromUtf8(meta.className()));\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Inherits\")).arg(inherits);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Model\")).arg(QString::fromUtf8(isModel?\"Yes\":\"No\"));\n\n    QString resultProperties;\n    QStringList propertiesSignals;\n    for(int i=0; i<meta.propertyCount(); i++)\n    {\n        QMetaProperty property = meta.property(i);\n        const QString &propertyName = QString::fromUtf8(property.name());\n        const QString &propertyType = fixType(QString::fromUtf8(property.typeName()));\n        propertiesSignals << QString::fromUtf8(property.notifySignal().name());\n\n        QString text = QStringLiteral(\"* <font color='#074885'><b>%1</b></font>: %2\").arg(propertyName).arg(propertyType);\n        if(!property.isWritable())\n            text += QStringLiteral(\" (readOnly)\");\n\n        text += QStringLiteral(\"\\n\");\n        if(meta.propertyOffset()<=i)\n            resultProperties += text;\n    }\n\n    QString enumResults;\n    for(int i=meta.enumeratorOffset(); i<meta.enumeratorCount(); i++)\n    {\n        QMetaEnum enumerator = meta.enumerator(i);\n        const QString &enumName = QString::fromUtf8(enumerator.name());\n\n        enumResults += QStringLiteral(\"\\n##### %1\\n\\n\").arg(enumName);\n        enumResults += QStringLiteral(\"|Key|Value|\\n\"\n                               \"|---|-----|\\n\");\n\n        for(int j=0; j<enumerator.keyCount(); j++)\n            enumResults += QStringLiteral(\"|%1|%2|\\n\").arg(QString::fromUtf8(enumerator.key(j))).arg(enumerator.value(j));\n    }\n\n    QString resultSlots;\n    QString resultSignals;\n    for(int i=meta.methodOffset(); i<meta.methodCount(); i++)\n    {\n        QMetaMethod method = meta.method(i);\n        if(method.access() != QMetaMethod::Public)\n            continue;\n\n        const QString &methodName = QString::fromUtf8(method.name());\n        if(propertiesSignals.contains(methodName))\n            continue;\n\n        const QString &methodType = fixType(QString::fromUtf8(method.typeName()));\n\n        QString args;\n        const QList<QByteArray> &paramNames = method.parameterNames();\n        const QList<QByteArray> &paramTypes = method.parameterTypes();\n        for(int j=0; j<paramNames.count(); j++)\n        {\n            if(j != 0)\n                args += QStringLiteral(\", \");\n\n            args += fixType(QString::fromUtf8(paramTypes[j])) + QStringLiteral(\" \") + paramNames[j];\n        }\n\n        QString text = QStringLiteral(\" * %1 <font color='#074885'><b>%2</b></font>(%3)\\n\").arg(methodType).arg(methodName).arg(args);\n        switch(static_cast<int>(method.methodType()))\n        {\n        case QMetaMethod::Slot:\n            resultSlots += text;\n            break;\n        case QMetaMethod::Signal:\n            resultSignals += text;\n            break;\n        }\n    }\n\n    if(!resultProperties.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Normal Properties](#normal-properties)\\n\");\n        resultProperties = QStringLiteral(\"\\n### Normal Properties\\n\\n\") + resultProperties;\n    }\n    if(!enumResults.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Enumerator](#enumerator)\\n\");\n        enumResults = QStringLiteral(\"\\n### Enumerator\\n\\n\") + enumResults;\n    }\n    if(!resultSlots.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Methods](#methods)\\n\");\n        resultSlots = QStringLiteral(\"\\n### Methods\\n\\n\") + resultSlots;\n    }\n    if(!resultSignals.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Signals](#Q_SIGNALS)\\n\");\n        resultSignals = QStringLiteral(\"\\n### Signals\\n\\n\") + resultSignals;\n    }\n    if(isModel)\n        headers += QStringLiteral(\" * [Roles](#roles)\\n\");\n\n    result += headers + QStringLiteral(\"\\n\");\n    result += details + QStringLiteral(\"\\n\");\n    result += resultProperties + QStringLiteral(\"\\n\");\n    result += resultSlots + QStringLiteral(\"\\n\");\n    result += resultSignals + QStringLiteral(\"\\n\");\n    result += enumResults + QStringLiteral(\"\\n\");\n\n    if(!store)\n        return result;\n\n    QString path = aseman_qt_tools_destination + QStringLiteral(\"/\") + component.toLower() + QStringLiteral(\".md\");\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemControlsBeta::exportModel(const QString &module, int major, int minor, const QString &component)\n{\n    QString result = exportItem<T>(module, major, minor, component, false);\n    T *model = new T();\n\n    QHash<qint32,QByteArray> roleNames = model->roleNames();\n    QMap<qint32,QByteArray> rolesMap;\n    QHashIterator<qint32,QByteArray> i(roleNames);\n    while(i.hasNext())\n    {\n        i.next();\n        rolesMap[i.key()] = i.value();\n    }\n\n    result += QStringLiteral(\"\\n### Roles\\n\\n\");\n    Q_FOREACH(const QByteArray &name, rolesMap)\n        result += QStringLiteral(\" * model.<font color='#074885'>%1</font>\\n\").arg(QString::fromUtf8(name));\n\n    delete model;\n\n    QString path = aseman_qt_tools_destination + \"/\" + component.toLower() + \".md\";\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanqttoolsitemcontrolsbeta.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQTTOOLSITEMCONTROLSBETA_H\n#define ASEMANQTTOOLSITEMCONTROLSBETA_H\n\n#include <QtGlobal>\n#include <QString>\n\n#include <asemanqttools.h>\n\nclass QObject;\nclass QQmlEngine;\nclass QJSEngine;\nclass AsemanQtToolsItemControlsBeta: public AsemanQtTools\n{\npublic:\n    static void registerTypes(const char *uri, bool exportMode = false);\n    static void registerFiles(const QString &filesLocation, const char *uri);\n\n    template<typename T>\n    static int registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template<typename T>\n    static int registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template <typename T>\n    static int registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName,\n                                 QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode);\n\n    template<typename T>\n    static int registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason, bool exportMode);\n\n    static void exportDocuments(const QString &destination);\n\nprotected:\n    template<typename T>\n    static QString exportItem(const QString &module, int major, int minor, const QString &component, bool store = true);\n    template<typename T>\n    static QString exportModel(const QString &module, int major, int minor, const QString &component);\n\n    static QString fixType(const QString &type);\n};\n\n#endif // ASEMANQTTOOLSITEMCONTROLSBETA_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickabstractbutton.cpp",
    "content": "#include \"asemanquickabstractbutton.h\"\n\nAsemanQuickAbstractButton::AsemanQuickAbstractButton(QQuickItem *parent)\n    : AsemanQuickControlItem(parent)\n{\n    setAcceptedMouseButtons(mAcceptableButtons);\n}\n\nAsemanQuickAbstractButton::~AsemanQuickAbstractButton()\n{\n}\n\nbool AsemanQuickAbstractButton::getPressedStatus() const\n{\n    return mPressed;\n}\n\nint AsemanQuickAbstractButton::acceptableButtons() const\n{\n    return mAcceptableButtons;\n}\n\nvoid AsemanQuickAbstractButton::setAcceptableButtons(int _acceptableButtons)\n{\n    auto acceptableButtons = static_cast<Qt::MouseButton>(_acceptableButtons);\n    if (mAcceptableButtons == acceptableButtons)\n        return;\n\n    mAcceptableButtons = acceptableButtons;\n    setAcceptedMouseButtons(mAcceptableButtons);\n    Q_EMIT acceptableButtonsChanged();\n}\n\nbool AsemanQuickAbstractButton::hoverEnabled() const\n{\n    return mHoverEnabled;\n}\n\nvoid AsemanQuickAbstractButton::setHoverEnabled(bool newHoverEnabled)\n{\n    if (mHoverEnabled == newHoverEnabled)\n        return;\n    mHoverEnabled = newHoverEnabled;\n    setAcceptHoverEvents(mHoverEnabled);\n    Q_EMIT hoverEnabledChanged();\n}\n\nbool AsemanQuickAbstractButton::containsMouse() const\n{\n    return mContainsMouse;\n}\n\nQPointF AsemanQuickAbstractButton::cursorPosition() const\n{\n    return mCursorPosition;\n}\n\nvoid AsemanQuickAbstractButton::mouseMoveEvent(QMouseEvent *e)\n{\n    e->accept();\n    setCursorPosition(e->pos());\n}\n\nvoid AsemanQuickAbstractButton::mousePressEvent(QMouseEvent *e)\n{\n    e->accept();\n    setCursorPosition(e->pos());\n    setPressed(true);\n}\n\nvoid AsemanQuickAbstractButton::mouseReleaseEvent(QMouseEvent *e)\n{\n    e->accept();\n    setCursorPosition(e->pos());\n    setPressed(false);\n}\n\nvoid AsemanQuickAbstractButton::mouseUngrabEvent()\n{\n    setPressed(false);\n}\n\nvoid AsemanQuickAbstractButton::touchEvent(QTouchEvent *e)\n{\n    e->accept();\n    if (e->touchPoints().count())\n        setCursorPosition(e->touchPoints().first().pos());\n    setPressed(true);\n}\n\nvoid AsemanQuickAbstractButton::touchUngrabEvent()\n{\n    setPressed(false);\n}\n\nvoid AsemanQuickAbstractButton::wheelEvent(QWheelEvent *e)\n{\n    e->accept();\n    setCursorPosition(e->position());\n}\n\nvoid AsemanQuickAbstractButton::setPressed(bool pressed)\n{\n    if (mPressed == pressed)\n        return;\n\n    mPressed = pressed;\n    Q_EMIT pressedChanged();\n}\n\nvoid AsemanQuickAbstractButton::setContainsMouse(bool containsMouse)\n{\n    if (mContainsMouse == containsMouse)\n        return;\n\n    mContainsMouse = containsMouse;\n    Q_EMIT containsMouseChanged();\n}\n\nvoid AsemanQuickAbstractButton::setCursorPosition(const QPointF &cursorPosition)\n{\n    if (mCursorPosition == cursorPosition)\n        return;\n\n    mCursorPosition = cursorPosition;\n    Q_EMIT cursorPositionChanged();\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickabstractbutton.h",
    "content": "#ifndef ASEMANQUICKABSTRACTBUTTON_H\n#define ASEMANQUICKABSTRACTBUTTON_H\n\n#include \"asemanquickcontrolitem.h\"\n\n#include <QPointF>\n\nclass AsemanQuickAbstractButton : public AsemanQuickControlItem\n{\n    Q_OBJECT\n    Q_PROPERTY(bool pressed READ getPressedStatus NOTIFY pressedChanged)\n    Q_PROPERTY(int acceptableButtons READ acceptableButtons WRITE setAcceptableButtons NOTIFY acceptableButtonsChanged)\n    Q_PROPERTY(bool hoverEnabled READ hoverEnabled WRITE setHoverEnabled NOTIFY hoverEnabledChanged)\n    Q_PROPERTY(bool containsMouse READ containsMouse NOTIFY containsMouseChanged)\n    Q_PROPERTY(QPointF cursorPosition READ cursorPosition NOTIFY cursorPositionChanged)\n\npublic:\n    AsemanQuickAbstractButton(QQuickItem *parent = nullptr);\n    virtual ~AsemanQuickAbstractButton();\n\n    bool getPressedStatus() const;\n\n    int acceptableButtons() const;\n    void setAcceptableButtons(int newAcceptableButtons);\n\n    bool hoverEnabled() const;\n    void setHoverEnabled(bool newHoverEnabled);\n\n    bool containsMouse() const;\n    QPointF cursorPosition() const;\n\nQ_SIGNALS:\n    void clicked(int buttons, const QPointF &position);\n    void pressed(int buttons, const QPointF &position);\n    void released(int buttons, const QPointF &position);\n    void pressedChanged();\n    void acceptableButtonsChanged();\n    void hoverEnabledChanged();\n    void containsMouseChanged();\n    void cursorPositionChanged();\n\nprotected:\n    virtual void mouseMoveEvent(QMouseEvent *event) override;\n    virtual void mousePressEvent(QMouseEvent *event) override;\n    virtual void mouseReleaseEvent(QMouseEvent *event) override;\n    virtual void mouseUngrabEvent() override;\n    virtual void touchEvent(QTouchEvent *event) override;\n    virtual void touchUngrabEvent() override;\n    virtual void wheelEvent(QWheelEvent *event) override;\n\nprivate:\n    void setPressed(bool pressed);\n    void setContainsMouse(bool containsMouse);\n    void setCursorPosition(const QPointF &cursorPosition);\n\nprivate:\n    bool mPressed = false;\n    Qt::MouseButtons mAcceptableButtons = Qt::LeftButton;\n    bool mHoverEnabled = false;\n    bool mContainsMouse = false;\n    QPointF mCursorPosition;\n};\n\n#endif // ASEMANQUICKABSTRACTBUTTON_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickabstractstyle.cpp",
    "content": "#include \"asemanquickabstractstyle.h\"\n#include \"asemanquickstyleattachedproperty.h\"\n\n#include <QGuiApplication>\n\nAsemanQuickAbstractStyle::AsemanQuickAbstractStyle(QQuickItem *parent)\n    : QQuickItem(parent)\n{\n    mPadding = new AsemanQuickBoxSize(this);\n}\n\nAsemanQuickAbstractStyle::~AsemanQuickAbstractStyle()\n{\n\n}\n\nAsemanQuickBoxSize *AsemanQuickAbstractStyle::padding() const\n{\n    return mPadding;\n}\n\nvoid AsemanQuickAbstractStyle::setPadding(AsemanQuickBoxSize *newPadding)\n{\n    if (mPadding->padding() == newPadding->padding())\n        return;\n    mPadding->setPadding(newPadding->padding());\n    Q_EMIT paddingChanged();\n}\n\nQFont AsemanQuickAbstractStyle::font() const\n{\n    return mFont.value_or(qApp->font());\n}\n\nvoid AsemanQuickAbstractStyle::setFont(const QFont &newFont)\n{\n    if (mFont == newFont)\n        return;\n    mFont = newFont;\n    Q_EMIT fontChanged();\n}\n\nQVariantMap AsemanQuickAbstractStyle::extra() const\n{\n    return mExtra;\n}\n\nvoid AsemanQuickAbstractStyle::setExtra(const QVariantMap &newExtra)\n{\n    if (mExtra == newExtra)\n        return;\n    mExtra = newExtra;\n    Q_EMIT extraChanged();\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickabstractstyle.h",
    "content": "#ifndef ASEMANQUICKABSTRACTSTYLE_H\n#define ASEMANQUICKABSTRACTSTYLE_H\n\n#include <QQuickItem>\n#include <QFont>\n\n#include <optional>\n\n#include \"asemanquickboxsize.h\"\n\nclass AsemanQuickAbstractStyle : public QQuickItem\n{\n    Q_OBJECT\n    Q_PROPERTY(AsemanQuickBoxSize *padding READ padding WRITE setPadding NOTIFY paddingChanged)\n    Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)\n    Q_PROPERTY(QVariantMap extra READ extra WRITE setExtra NOTIFY extraChanged)\n\npublic:\n    AsemanQuickAbstractStyle(QQuickItem *parent = nullptr);\n    virtual ~AsemanQuickAbstractStyle();\n\n    AsemanQuickBoxSize *padding() const;\n    void setPadding(AsemanQuickBoxSize *newPadding);\n\n    QFont font() const;\n    void setFont(const QFont &newFont);\n\n    QVariantMap extra() const;\n    void setExtra(const QVariantMap &newExtra);\n\nQ_SIGNALS:\n    void paddingChanged();\n    void fontChanged();\n    void extraChanged();\n\nprivate:\n    AsemanQuickBoxSize *mPadding;\n    std::optional<QFont> mFont;\n    QVariantMap mExtra;\n};\n\n#endif // ASEMANQUICKABSTRACTSTYLE_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickboxsize.cpp",
    "content": "#include \"asemanquickboxsize.h\"\n\nAsemanQuickBoxSize::AsemanQuickBoxSize(QObject *parent)\n    : QObject(parent)\n{\n\n}\n\nAsemanQuickBoxSize::~AsemanQuickBoxSize()\n{\n\n}\n\nqint32 AsemanQuickBoxSize::left() const\n{\n    return mPadding.mLeft;\n}\n\nvoid AsemanQuickBoxSize::setLeft(qint32 newLeft)\n{\n    if (mPadding.mLeft == newLeft)\n        return;\n    mPadding.mLeft = newLeft;\n    Q_EMIT leftChanged();\n}\n\nqint32 AsemanQuickBoxSize::top() const\n{\n    return mPadding.mTop;\n}\n\nvoid AsemanQuickBoxSize::setTop(qint32 newTop)\n{\n    if (mPadding.mTop == newTop)\n        return;\n    mPadding.mTop = newTop;\n    Q_EMIT topChanged();\n}\n\nqint32 AsemanQuickBoxSize::right() const\n{\n    return mPadding.mRight;\n}\n\nvoid AsemanQuickBoxSize::setRight(qint32 newRight)\n{\n    if (mPadding.mRight == newRight)\n        return;\n    mPadding.mRight = newRight;\n    Q_EMIT rightChanged();\n}\n\nqint32 AsemanQuickBoxSize::bottom() const\n{\n    return mPadding.mBottom;\n}\n\nvoid AsemanQuickBoxSize::setBottom(qint32 newBottom)\n{\n    if (mPadding.mBottom == newBottom)\n        return;\n    mPadding.mBottom = newBottom;\n    Q_EMIT bottomChanged();\n}\n\nAsemanQuickBoxSize::Padding AsemanQuickBoxSize::padding() const\n{\n    return mPadding;\n}\n\nvoid AsemanQuickBoxSize::setPadding(const Padding &newPadding)\n{\n    mPadding = newPadding;\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickboxsize.h",
    "content": "#ifndef ASEMANQUICKBOXSIZE_H\n#define ASEMANQUICKBOXSIZE_H\n\n#include <QObject>\n\nclass AsemanQuickBoxSize: public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(qint32 left READ left WRITE setLeft NOTIFY leftChanged)\n    Q_PROPERTY(qint32 top READ top WRITE setTop NOTIFY topChanged)\n    Q_PROPERTY(qint32 right READ right WRITE setRight NOTIFY rightChanged)\n    Q_PROPERTY(qint32 bottom READ bottom WRITE setBottom NOTIFY bottomChanged)\n\npublic:\n    AsemanQuickBoxSize(QObject *parent = nullptr);\n    virtual ~AsemanQuickBoxSize();\n\n    qint32 left() const;\n    void setLeft(qint32 newLeft);\n\n    qint32 top() const;\n    void setTop(qint32 newTop);\n\n    qint32 right() const;\n    void setRight(qint32 newRight);\n\n    qint32 bottom() const;\n    void setBottom(qint32 newBottom);\n\n    struct Padding {\n        qint32 mLeft = 0;\n        qint32 mTop = 0;\n        qint32 mRight = 0;\n        qint32 mBottom = 0;\n\n        bool operator==(const Padding &b) const {\n            return mLeft == b.mLeft &&\n                   mRight == b.mRight &&\n                   mTop == b.mTop &&\n                   mBottom == b.mBottom;\n        }\n    };\n\n    Padding padding() const;\n    void setPadding(const Padding &newPadding);\n\nQ_SIGNALS:\n    void leftChanged();\n    void topChanged();\n    void rightChanged();\n    void bottomChanged();\n\nprivate:\n    Padding mPadding;\n};\n\n#endif // ASEMANQUICKBOXSIZE_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickcolumnlayout.cpp",
    "content": "#include \"asemanquickcolumnlayout.h\"\n\nAsemanQuickColumnLayout::AsemanQuickColumnLayout(QQuickItem *parent)\n    : AsemanQuickLayout(parent)\n{\n}\n\nAsemanQuickColumnLayout::~AsemanQuickColumnLayout()\n{\n\n}\n\nvoid AsemanQuickColumnLayout::relocateChilds()\n{\n    const auto childs = childItems();\n\n    qreal static_height = 0, h;\n    int autoFillCount = 0;\n    int visibleCount = 0;\n    for (auto c: childs)\n    {\n        if (!c->isVisible())\n            continue;\n\n        visibleCount++;\n        auto attached = getAttached(c);\n        if (attached->mFillHeight)\n        {\n            autoFillCount++;\n            continue;\n        }\n\n        h = c->implicitHeight();\n        if (attached->mPreferredHeight > 0)\n            h = attached->mPreferredHeight;\n\n        c->setHeight(h);\n        static_height += h + attached->mTopMargin + attached->mBottomMargin;\n    }\n    static_height += (visibleCount-1)*mSpacing;\n\n    const qreal autoFillHeight = height() - static_height;\n    const qreal standardAutoFillHeight = autoFillHeight / autoFillCount;\n\n    for (auto c: childs)\n    {\n        if (!c->isVisible())\n            continue;\n        auto attached = getAttached(c);\n        if (!attached->mFillHeight)\n            continue;\n\n        c->setHeight(standardAutoFillHeight);\n    }\n\n    qreal lastY = 0;\n    qreal w, maxW = 0;\n    for (auto c: childs)\n    {\n        if (!c->isVisible())\n            continue;\n\n        auto attached = getAttached(c);\n\n        c->setY(lastY + attached->mTopMargin);\n\n        w = c->implicitWidth();\n        if (attached->mFillWidth)\n            w = width() - attached->mLeftMargin - attached->mRightMargin;\n        else if (attached->mPreferredWidth > 0)\n            w = attached->mPreferredWidth;\n\n        c->setWidth(w);\n        maxW = std::max(maxW, c->x() + c->width());\n\n        switch (attached->mAlignment & Qt::AlignHorizontal_Mask)\n        {\n        default:\n        case Qt::AlignLeft:\n            c->setX(attached->mLeftMargin);\n            break;\n        case Qt::AlignRight:\n            c->setX(width() - c->width() - attached->mRightMargin);\n            break;\n        case Qt::AlignHCenter:\n            c->setX(width()/2 - c->width()/2);\n            break;\n        }\n\n        if (c->height() > 0)\n            lastY += c->height() + attached->mTopMargin + attached->mBottomMargin + mSpacing;\n    }\n    if (visibleCount)\n        lastY -= mSpacing;\n\n    setImplicitHeight(lastY);\n    setImplicitWidth(maxW);\n}\n\nqreal AsemanQuickColumnLayout::spacing() const\n{\n    return mSpacing;\n}\n\nvoid AsemanQuickColumnLayout::setSpacing(qreal newSpacing)\n{\n    if (qFuzzyCompare(mSpacing, newSpacing))\n        return;\n    mSpacing = newSpacing;\n    reloadDelayed();\n    Q_EMIT spacingChanged();\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickcolumnlayout.h",
    "content": "#ifndef ASEMANQUICKCOLUMNLAYOUT_H\n#define ASEMANQUICKCOLUMNLAYOUT_H\n\n#include \"asemanquicklayout.h\"\n\nclass AsemanQuickColumnLayout : public AsemanQuickLayout\n{\n    Q_OBJECT\n    Q_PROPERTY(qreal spacing READ spacing WRITE setSpacing NOTIFY spacingChanged)\n\npublic:\n    AsemanQuickColumnLayout(QQuickItem *parent = nullptr);\n    virtual ~AsemanQuickColumnLayout();\n\n    qreal spacing() const;\n    void setSpacing(qreal newSpacing);\n\nQ_SIGNALS:\n    void spacingChanged();\n\nprotected:\n    void relocateChilds() override;\n\nprivate:\n    qreal mSpacing = 4;\n};\n\n#endif // ASEMANQUICKCOLUMNLAYOUT_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickcontrolitem.cpp",
    "content": "#include \"asemanquickcontrolitem.h\"\n#include \"asemanquicksceneitem.h\"\n\n#include <QKeyEvent>\n\nAsemanQuickControlItem::AsemanQuickControlItem(QQuickItem *parent)\n    : AsemanQuickStyledItem(parent)\n{\n    setSourceItem(this);\n    connect(this, &AsemanQuickControlItem::focusChanged, this, [this](){\n        if (!hasFocus())\n            setFocusedInUsingKeyboard(false);\n    });\n}\n\nAsemanQuickControlItem::~AsemanQuickControlItem()\n{\n}\n\nvoid AsemanQuickControlItem::focusNextItem()\n{\n    auto next = mNextTabOrder;\n    if (!next)\n    {\n        const auto scene = AsemanQuickSceneItem::findScene(this);\n        const auto controls = findAllControls(scene, true, true);\n        const auto index = controls.indexOf(this);\n        if (index >= 0 && index < controls.size()-1)\n            next = controls.at(index+1);\n        else if (index > 0)\n            next = controls.first();\n    }\n\n    if (next)\n    {\n        next->setFocus(true);\n        next->forceActiveFocus();\n        next->setFocusedInUsingKeyboard(true);\n    }\n}\n\nvoid AsemanQuickControlItem::focusPreviousItem()\n{\n    auto prev = mPreviousTabOrder;\n    if (!prev)\n    {\n        const auto scene = AsemanQuickSceneItem::findScene(this);\n        const auto controls = findAllControls(scene, true, true);\n        const auto index = controls.indexOf(this);\n        if (index > 0)\n            prev = controls.at(index-1);\n        else if (index < controls.size()-1)\n            prev = controls.last();\n    }\n\n    if (prev)\n    {\n        prev->setFocus(true);\n        prev->forceActiveFocus();\n        prev->setFocusedInUsingKeyboard(true);\n    }\n\n}\n\nvoid AsemanQuickControlItem::keyPressEvent(QKeyEvent *e)\n{\n    switch (e->key())\n    {\n    case Qt::Key_Tab:\n        if (e->modifiers() & Qt::ShiftModifier)\n            focusPreviousItem();\n        else\n            focusNextItem();\n        break;\n\n    default:\n        QQuickItem::keyPressEvent(e);\n        break;\n    }\n\n    e->accept();\n}\n\nbool AsemanQuickControlItem::focusableUsingKeyboard() const\n{\n    return mFocusableUsingKeyboard;\n}\n\nvoid AsemanQuickControlItem::setFocusableUsingKeyboard(bool newFocusableUsingKeyboard)\n{\n    if (mFocusableUsingKeyboard == newFocusableUsingKeyboard)\n        return;\n    mFocusableUsingKeyboard = newFocusableUsingKeyboard;\n    Q_EMIT focusableUsingKeyboardChanged();\n}\n\nbool AsemanQuickControlItem::focusedInUsingKeyboard() const\n{\n    return mFocusedInUsingKeyboard;\n}\n\nvoid AsemanQuickControlItem::setFocusedInUsingKeyboard(bool newFocusedInUsingKeyboard)\n{\n    if (mFocusedInUsingKeyboard == newFocusedInUsingKeyboard)\n        return;\n    mFocusedInUsingKeyboard = newFocusedInUsingKeyboard;\n    Q_EMIT focusedInUsingKeyboardChanged();\n}\n\nbool AsemanQuickControlItem::focusable() const\n{\n    return mFocusable;\n}\n\nvoid AsemanQuickControlItem::setFocusable(bool newFocusable)\n{\n    if (mFocusable == newFocusable)\n        return;\n    mFocusable = newFocusable;\n    Q_EMIT focusableChanged();\n}\n\nAsemanQuickControlItem *AsemanQuickControlItem::nextTabOrder() const\n{\n    return mNextTabOrder;\n}\n\nvoid AsemanQuickControlItem::setNextTabOrder(AsemanQuickControlItem *newNextTabOrder)\n{\n    if (mNextTabOrder == newNextTabOrder)\n        return;\n\n    if (mNextTabOrder)\n    {\n        mNextTabOrder->mPreviousTabOrder = nullptr;\n        Q_EMIT mNextTabOrder->nextTabOrderChanged();\n    }\n\n    mNextTabOrder = newNextTabOrder;\n    if (mNextTabOrder)\n    {\n        mNextTabOrder->mPreviousTabOrder = this;\n        Q_EMIT mNextTabOrder->nextTabOrderChanged();\n    }\n\n    Q_EMIT nextTabOrderChanged();\n}\n\nQList<AsemanQuickControlItem *> AsemanQuickControlItem::findAllControls(const QQuickItem *item, bool recursive, bool focusablesOnly)\n{\n    QList<AsemanQuickControlItem*> res;\n    if (!item)\n        return res;\n\n    for (auto obj: item->childItems())\n    {\n        auto scene = qobject_cast<AsemanQuickSceneItem*>(obj);\n        if (scene)\n            continue;\n\n        auto child = qobject_cast<AsemanQuickControlItem*>(obj);\n        if (child && (!focusablesOnly || (child->mFocusableUsingKeyboard && child->mFocusable)))\n            res << child;\n        if (recursive)\n            res << findAllControls(obj, true, focusablesOnly);\n    }\n\n    return res;\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickcontrolitem.h",
    "content": "#ifndef ASEMANQUICKCONTROLITEM_H\n#define ASEMANQUICKCONTROLITEM_H\n\n#include \"asemanquickstyleditem.h\"\n\nclass AsemanQuickControlItem : public AsemanQuickStyledItem\n{\n    Q_OBJECT\n    Q_PROPERTY(AsemanQuickControlItem *nextTabOrder READ nextTabOrder WRITE setNextTabOrder NOTIFY nextTabOrderChanged)\n    Q_PROPERTY(bool focusedInUsingKeyboard READ focusedInUsingKeyboard NOTIFY focusedInUsingKeyboardChanged)\n    Q_PROPERTY(bool focusableUsingKeyboard READ focusableUsingKeyboard WRITE setFocusableUsingKeyboard NOTIFY focusableUsingKeyboardChanged)\n    Q_PROPERTY(bool focusable READ focusable WRITE setFocusable NOTIFY focusableChanged)\n\npublic:\n    AsemanQuickControlItem(QQuickItem *parent = nullptr);\n    virtual ~AsemanQuickControlItem();\n\n    static QList<AsemanQuickControlItem*> findAllControls(const QQuickItem *item, bool recursive = true, bool focusablesOnly = false);\n\n    AsemanQuickControlItem *nextTabOrder() const;\n    void setNextTabOrder(AsemanQuickControlItem *newNextTabOrder);\n\n    bool focusedInUsingKeyboard() const;\n\n    bool focusableUsingKeyboard() const;\n    void setFocusableUsingKeyboard(bool newFocusableUsingKeyboard);\n\n    bool focusable() const;\n    void setFocusable(bool newFocusable);\n\npublic Q_SLOTS:\n    void focusNextItem();\n    void focusPreviousItem();\n\nQ_SIGNALS:\n    void nextTabOrderChanged();\n    void focusedInUsingKeyboardChanged();\n    void focusableUsingKeyboardChanged();\n    void focusableChanged();\n\nprotected:\n    void keyPressEvent(QKeyEvent *e) override;\n    void setFocusedInUsingKeyboard(bool newFocusedInUsingKeyboard);\n\nprivate:\n    QPointer<AsemanQuickControlItem> mNextTabOrder;\n    QPointer<AsemanQuickControlItem> mPreviousTabOrder;\n    bool mFocusedInUsingKeyboard = false;\n    bool mFocusableUsingKeyboard = true;\n    bool mFocusable = true;\n};\n\n#endif // ASEMANQUICKCONTROLITEM_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquicklayout.cpp",
    "content": "#include \"asemanquicklayout.h\"\n\n#include <QEvent>\n\nAsemanQuickLayout::AsemanQuickLayout(QQuickItem *parent)\n    : QQuickItem(parent)\n{\n    connect(this, &QQuickItem::widthChanged, this, &AsemanQuickLayout::reload);\n    connect(this, &QQuickItem::heightChanged, this, &AsemanQuickLayout::reload);\n}\n\nAsemanQuickLayout::~AsemanQuickLayout()\n{\n}\n\nAsemanQuickLayoutProperty *AsemanQuickLayout::qmlAttachedProperties(QObject *object)\n{\n    return new AsemanQuickLayoutProperty(object);\n}\n\nvoid AsemanQuickLayout::reload()\n{\n    if (mReloadBlocker)\n        return;\n\n    mReloadBlocker = true;\n    relocateChilds();\n    mReloadBlocker = false;\n}\n\nvoid AsemanQuickLayout::reloadDelayed()\n{\n    if (mReloadBlocker)\n        return;\n\n    if (!mReloadTimer)\n    {\n        mReloadTimer = new QTimer(this);\n        mReloadTimer->setInterval(5);\n        mReloadTimer->setSingleShot(true);\n\n        connect(mReloadTimer, &QTimer::timeout, this, &AsemanQuickLayout::reload);\n    }\n\n    mReloadTimer->stop();\n    mReloadTimer->start();\n}\n\nvoid AsemanQuickLayout::itemChange(ItemChange change, const ItemChangeData &value)\n{\n    switch (static_cast<int>(change))\n    {\n    case QQuickItem::ItemChildAddedChange:\n    {\n        auto attached = getAttached(value.item);\n\n        connect(value.item, &QQuickItem::implicitWidthChanged, this, &AsemanQuickLayout::reload);\n        connect(value.item, &QQuickItem::implicitHeightChanged, this, &AsemanQuickLayout::reload);\n        connect(value.item, &QQuickItem::visibleChanged, this, &AsemanQuickLayout::reload, Qt::QueuedConnection);\n        connect(attached, &AsemanQuickLayoutProperty::changed, this, &AsemanQuickLayout::reload);\n\n        reloadDelayed();\n    }\n        break;\n\n    case QQuickItem::ItemChildRemovedChange:\n    {\n        auto attached = getAttached(value.item);\n\n        disconnect(value.item, &QQuickItem::implicitWidthChanged, this, &AsemanQuickLayout::reload);\n        disconnect(value.item, &QQuickItem::implicitHeightChanged, this, &AsemanQuickLayout::reload);\n        disconnect(value.item, &QQuickItem::visibleChanged, this, &AsemanQuickLayout::reload);\n        disconnect(attached, &AsemanQuickLayoutProperty::changed, this, &AsemanQuickLayout::reload);\n\n        reloadDelayed();\n    }\n        break;\n    }\n\n    QQuickItem::itemChange(change, value);\n}\n\nAsemanQuickLayoutProperty *AsemanQuickLayout::getAttached(QObject *object)\n{\n    return qobject_cast<AsemanQuickLayoutProperty*>(qmlAttachedPropertiesObject<AsemanQuickLayout>(object, true));\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquicklayout.h",
    "content": "#ifndef ASEMANQUICKLAYOUT_H\n#define ASEMANQUICKLAYOUT_H\n\n#include <QQuickItem>\n#include <QTimer>\n\nclass AsemanQuickLayoutProperty;\nclass AsemanQuickLayout : public QQuickItem\n{\n    Q_OBJECT\npublic:\n    AsemanQuickLayout(QQuickItem *parent = nullptr);\n    virtual ~AsemanQuickLayout();\n\n    static AsemanQuickLayoutProperty *qmlAttachedProperties(QObject *object);\n\npublic Q_SLOTS:\n    void reload();\n\nprotected:\n    void reloadDelayed();\n    virtual void relocateChilds() {}\n\n    void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &value) override;\n\n    AsemanQuickLayoutProperty *getAttached(QObject *object);\n\nprivate:\n    QTimer *mReloadTimer = nullptr;\n    bool mReloadBlocker = false;\n};\n\nclass AsemanQuickLayoutProperty : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(bool fillWidth MEMBER mFillWidth NOTIFY changed)\n    Q_PROPERTY(bool fillHeight MEMBER mFillHeight NOTIFY changed)\n\n    Q_PROPERTY(qreal preferredWidth MEMBER mPreferredWidth NOTIFY changed)\n    Q_PROPERTY(qreal preferredHeight MEMBER mPreferredHeight NOTIFY changed)\n\n    Q_PROPERTY(qreal leftMargin MEMBER mLeftMargin NOTIFY changed)\n    Q_PROPERTY(qreal topMargin MEMBER mTopMargin NOTIFY changed)\n    Q_PROPERTY(qreal rightMargin MEMBER mRightMargin NOTIFY changed)\n    Q_PROPERTY(qreal bottomMargin MEMBER mBottomMargin NOTIFY changed)\n\n    Q_PROPERTY(qint32 alignment MEMBER mAlignment NOTIFY changed)\n\npublic:\n    AsemanQuickLayoutProperty(QObject *parent = nullptr): QObject(parent) {}\n    virtual ~AsemanQuickLayoutProperty() {}\n\nQ_SIGNALS:\n    void changed();\n\npublic:\n    bool mFillWidth = false;\n    bool mFillHeight = false;\n\n    qreal mPreferredWidth = 0;\n    qreal mPreferredHeight = 0;\n\n    qreal mLeftMargin = 0;\n    qreal mTopMargin = 0;\n    qreal mRightMargin = 0;\n    qreal mBottomMargin = 0;\n\n    qint32 mAlignment = 0;\n};\n\nQML_DECLARE_TYPEINFO(AsemanQuickLayout, QML_HAS_ATTACHED_PROPERTIES)\n\n#endif // ASEMANQUICKLAYOUT_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickmainpalette.cpp",
    "content": "#include \"asemanquickmainpalette.h\"\n\n#include <QPalette>\n#include <QGuiApplication>\n\nAsemanQuickMainPalette::AsemanQuickMainPalette(QObject *parent)\n    : QObject(parent)\n{\n    auto palette = qApp->palette();\n    mBackground = palette.window().color();\n    mForeground = palette.windowText().color();\n    mHighlight = palette.highlight().color();\n    mHighlightText = palette.highlightedText().color();\n    mBase = palette.base().color();\n    mBaseText = palette.text().color();\n}\n\nAsemanQuickMainPalette::~AsemanQuickMainPalette()\n{\n}\n\nint AsemanQuickMainPalette::theme() const\n{\n    return mTheme;\n}\n\nvoid AsemanQuickMainPalette::setTheme(int newTheme)\n{\n    if (mTheme == newTheme)\n        return;\n    mTheme = newTheme;\n    Q_EMIT themeChanged();\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickmainpalette.h",
    "content": "#ifndef ASEMANQUICKMAINPALETTE_H\n#define ASEMANQUICKMAINPALETTE_H\n\n#include <QObject>\n#include <QColor>\n\nclass AsemanQuickMainPalette : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(int theme READ theme WRITE setTheme NOTIFY themeChanged)\n    Q_PROPERTY(QColor highlight MEMBER mHighlight NOTIFY themeChanged)\n    Q_PROPERTY(QColor highlightText MEMBER mHighlightText NOTIFY themeChanged)\n    Q_PROPERTY(QColor foreground MEMBER mForeground NOTIFY themeChanged)\n    Q_PROPERTY(QColor background MEMBER mBackground NOTIFY themeChanged)\n    Q_PROPERTY(QColor base MEMBER mBase NOTIFY themeChanged)\n    Q_PROPERTY(QColor baseText MEMBER mBaseText NOTIFY themeChanged)\n\npublic:\n    enum Theme {\n        Auto,\n        Light,\n        Dark,\n    };\n    Q_ENUM(Theme)\n\n    AsemanQuickMainPalette(QObject *parent = nullptr);\n    virtual ~AsemanQuickMainPalette();\n\n    int theme() const;\n    void setTheme(int newTheme);\n\nQ_SIGNALS:\n    void themeChanged();\n\nprivate:\n    int mTheme = Auto;\n\n    QColor mForeground;\n    QColor mBackground;\n    QColor mHighlight;\n    QColor mHighlightText;\n    QColor mBase;\n    QColor mBaseText;\n};\n\n#endif // ASEMANQUICKMAINPALETTE_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickradiobuttoncontrol.cpp",
    "content": "#include \"asemanquickradiobuttoncontrol.h\"\n#include \"asemanquickradiobuttongroup.h\"\n\nAsemanQuickRadioButtonControl::AsemanQuickRadioButtonControl(QQuickItem *parent)\n    : AsemanQuickControlItem(parent)\n{\n}\n\nAsemanQuickRadioButtonControl::~AsemanQuickRadioButtonControl()\n{\n}\n\nbool AsemanQuickRadioButtonControl::checked() const\n{\n    return mChecked;\n}\n\nvoid AsemanQuickRadioButtonControl::setChecked(bool newChecked)\n{\n    if (mChecked == newChecked)\n        return;\n    mChecked = newChecked;\n    if (mChecked)\n        uncheckOthers();\n    Q_EMIT checkedChanged();\n}\n\nvoid AsemanQuickRadioButtonControl::uncheckOthers()\n{\n    QList<QQuickItem*> childs;\n    auto attached = qobject_cast<AsemanQuickRadioButtonGroupAttachedProperty*>(qmlAttachedPropertiesObject<AsemanQuickRadioButtonGroupAttachedCreator>(this, false));\n    if (attached && attached->group())\n    {\n        for (auto b: attached->group()->buttons())\n            childs << b;\n    }\n    else\n    {\n        auto parent = parentItem();\n        if (!parent)\n            return;\n\n        childs = parent->childItems();\n    }\n\n    for (auto c: childs)\n    {\n        auto radio = qobject_cast<AsemanQuickRadioButtonControl*>(c);\n        if (!radio)\n            continue;\n        if (radio == this)\n            continue;\n\n        radio->mChecked = false;\n        Q_EMIT radio->checkedChanged();\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickradiobuttoncontrol.h",
    "content": "#ifndef ASEMANQUICKRADIOBUTTONCONTROL_H\n#define ASEMANQUICKRADIOBUTTONCONTROL_H\n\n#include \"asemanquickcontrolitem.h\"\n\nclass AsemanQuickRadioButtonControl : public AsemanQuickControlItem\n{\n    Q_OBJECT\n    Q_PROPERTY(bool checked READ checked WRITE setChecked NOTIFY checkedChanged)\n\npublic:\n    AsemanQuickRadioButtonControl(QQuickItem *parent = nullptr);\n    virtual ~AsemanQuickRadioButtonControl();\n\n    bool checked() const;\n    void setChecked(bool newChecked);\n\nQ_SIGNALS:\n    void checkedChanged();\n\npublic Q_SLOTS:\n\nprotected:\n    void uncheckOthers();\n\nprivate:\n    bool mChecked = false;\n};\n\n#endif // ASEMANQUICKRADIOBUTTONCONTROL_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickradiobuttongroup.cpp",
    "content": "#include \"asemanquickradiobuttongroup.h\"\n\nAsemanQuickRadioButtonGroup::AsemanQuickRadioButtonGroup(QObject *parent)\n    : QObject(parent)\n{\n}\n\nAsemanQuickRadioButtonGroup::~AsemanQuickRadioButtonGroup()\n{\n}\n\nQQmlListProperty<AsemanQuickRadioButtonControl> AsemanQuickRadioButtonGroup::items()\n{\n    return QQmlListProperty<AsemanQuickRadioButtonControl>(this, &mButtons,\n                                                           QQmlListProperty<AsemanQuickRadioButtonControl>::AppendFunction(append),\n                                                           QQmlListProperty<AsemanQuickRadioButtonControl>::CountFunction(count),\n                                                           QQmlListProperty<AsemanQuickRadioButtonControl>::AtFunction(at),\n                                                           QQmlListProperty<AsemanQuickRadioButtonControl>::ClearFunction(clear) );\n}\n\nvoid AsemanQuickRadioButtonGroup::append(QQmlListProperty<AsemanQuickRadioButtonControl> *p, AsemanQuickRadioButtonControl *v)\n{\n    AsemanQuickRadioButtonGroup *aobj = static_cast<AsemanQuickRadioButtonGroup*>(p->object);\n    aobj->addButton(v);\n}\n\nint AsemanQuickRadioButtonGroup::count(QQmlListProperty<AsemanQuickRadioButtonControl> *p)\n{\n    AsemanQuickRadioButtonGroup *aobj = static_cast<AsemanQuickRadioButtonGroup*>(p->object);\n    return aobj->mButtons.count();\n}\n\nAsemanQuickRadioButtonControl *AsemanQuickRadioButtonGroup::at(QQmlListProperty<AsemanQuickRadioButtonControl> *p, int idx)\n{\n    AsemanQuickRadioButtonGroup *aobj = static_cast<AsemanQuickRadioButtonGroup*>(p->object);\n    return aobj->mButtons.at(idx);\n}\n\nvoid AsemanQuickRadioButtonGroup::clear(QQmlListProperty<AsemanQuickRadioButtonControl> *p)\n{\n    AsemanQuickRadioButtonGroup *aobj = static_cast<AsemanQuickRadioButtonGroup*>(p->object);\n    while (aobj->mButtons.count())\n        aobj->removeButton(aobj->mButtons.takeFirst());\n\n    Q_EMIT aobj->itemsChanged();\n}\n\nQList<AsemanQuickRadioButtonControl *> AsemanQuickRadioButtonGroup::buttons() const\n{\n    return mButtons;\n}\n\nvoid AsemanQuickRadioButtonGroup::addButton(AsemanQuickRadioButtonControl *r)\n{\n    if (mButtons.contains(r))\n        return;\n\n    auto attached = qobject_cast<AsemanQuickRadioButtonGroupAttachedProperty*>(qmlAttachedPropertiesObject<AsemanQuickRadioButtonGroupAttachedCreator>(r, true));\n    attached->setGroup(this);\n    mButtons << r;\n\n    connect(r, &QObject::destroyed, this, [this, r](){\n        mButtons.removeAll(r);\n        Q_EMIT itemsChanged();\n    });\n\n    Q_EMIT itemsChanged();\n}\n\nvoid AsemanQuickRadioButtonGroup::removeButton(AsemanQuickRadioButtonControl *r)\n{\n    auto attached = qobject_cast<AsemanQuickRadioButtonGroupAttachedProperty*>(qmlAttachedPropertiesObject<AsemanQuickRadioButtonGroupAttachedCreator>(r, true));\n    if (attached->group() == this)\n        attached->setGroup(nullptr);\n\n    if (mButtons.contains(r))\n    {\n        mButtons.removeAll(r);\n        Q_EMIT itemsChanged();\n    }\n}\n\n\nAsemanQuickRadioButtonGroupAttachedProperty::AsemanQuickRadioButtonGroupAttachedProperty(QObject *parent)\n    : QObject(parent)\n{\n}\n\nAsemanQuickRadioButtonGroupAttachedProperty::~AsemanQuickRadioButtonGroupAttachedProperty()\n{\n}\n\nAsemanQuickRadioButtonGroup *AsemanQuickRadioButtonGroupAttachedProperty::group() const\n{\n    return mGroup;\n}\n\nvoid AsemanQuickRadioButtonGroupAttachedProperty::setGroup(AsemanQuickRadioButtonGroup *newGroup)\n{\n    if (mGroup == newGroup)\n        return;\n\n    auto radio = qobject_cast<AsemanQuickRadioButtonControl*>(parent());\n    if (radio && mGroup)\n        mGroup->removeButton(radio);\n\n    mGroup = newGroup;\n    if (radio && mGroup)\n        mGroup->addButton(radio);\n\n    Q_EMIT groupChanged();\n}\n\n\nAsemanQuickRadioButtonGroupAttachedProperty *AsemanQuickRadioButtonGroupAttachedCreator::qmlAttachedProperties(QObject *object)\n{\n    return new AsemanQuickRadioButtonGroupAttachedProperty(object);\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickradiobuttongroup.h",
    "content": "#ifndef ASEMANQUICKRADIOBUTTONGROUP_H\n#define ASEMANQUICKRADIOBUTTONGROUP_H\n\n#include <QObject>\n\n#include \"asemanquickradiobuttoncontrol.h\"\n\nclass AsemanQuickRadioButtonGroup : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QQmlListProperty<AsemanQuickRadioButtonControl> items READ items NOTIFY itemsChanged)\n    Q_CLASSINFO(\"DefaultProperty\", \"items\")\npublic:\n    AsemanQuickRadioButtonGroup(QObject *parent = nullptr);\n    virtual ~AsemanQuickRadioButtonGroup();\n\n    QQmlListProperty<AsemanQuickRadioButtonControl> items();\n\n    QList<AsemanQuickRadioButtonControl*> buttons() const;\n\npublic Q_SLOTS:\n    void addButton(AsemanQuickRadioButtonControl *radio);\n    void removeButton(AsemanQuickRadioButtonControl *radio);\n\nQ_SIGNALS:\n    void itemsChanged();\n\nprivate:\n    static void append(QQmlListProperty<AsemanQuickRadioButtonControl> *p, AsemanQuickRadioButtonControl *v);\n    static int count(QQmlListProperty<AsemanQuickRadioButtonControl> *p);\n    static AsemanQuickRadioButtonControl *at(QQmlListProperty<AsemanQuickRadioButtonControl> *p, int idx);\n    static void clear(QQmlListProperty<AsemanQuickRadioButtonControl> *p);\n\nprivate:\n    QList<AsemanQuickRadioButtonControl*> mButtons;\n};\n\n\nclass AsemanQuickRadioButtonGroupAttachedProperty : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(AsemanQuickRadioButtonGroup *group READ group WRITE setGroup NOTIFY groupChanged)\n\npublic:\n    AsemanQuickRadioButtonGroupAttachedProperty(QObject *parent = nullptr);\n    virtual ~AsemanQuickRadioButtonGroupAttachedProperty();\n\n    AsemanQuickRadioButtonGroup *group() const;\n    void setGroup(AsemanQuickRadioButtonGroup *newGroup);\n\nQ_SIGNALS:\n    void groupChanged();\n\nprivate:\n    QPointer<AsemanQuickRadioButtonGroup> mGroup;\n};\n\n\nclass AsemanQuickRadioButtonGroupAttachedCreator : public QObject\n{\n    Q_OBJECT\npublic:\n    static AsemanQuickRadioButtonGroupAttachedProperty *qmlAttachedProperties(QObject *object);\n};\n\nQML_DECLARE_TYPEINFO(AsemanQuickRadioButtonGroupAttachedCreator, QML_HAS_ATTACHED_PROPERTIES)\n\n#endif // ASEMANQUICKRADIOBUTTONGROUP_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickrowlayout.cpp",
    "content": "#include \"asemanquickrowlayout.h\"\n\nAsemanQuickRowLayout::AsemanQuickRowLayout(QQuickItem *parent)\n    : AsemanQuickLayout(parent)\n{\n\n}\n\nAsemanQuickRowLayout::~AsemanQuickRowLayout()\n{\n\n}\n\nvoid AsemanQuickRowLayout::relocateChilds()\n{\n    const bool mirrored = (mLayoutDirection == Qt::RightToLeft);\n\n    const auto childs = childItems();\n\n    qreal width = AsemanQuickRowLayout::width();\n    const bool width_is_zero = (width <= 0);\n\n    qreal static_width = 0, w;\n    int autoFillCount = 0;\n    int visibleCount = 0;\n    for (auto c: childs)\n    {\n        if (!c->isVisible())\n            continue;\n\n        visibleCount++;\n        auto attached = qobject_cast<AsemanQuickLayoutProperty*>(qmlAttachedPropertiesObject<AsemanQuickLayout>(c, true));\n\n        w = c->implicitWidth();\n        if (attached->mPreferredWidth > 0)\n            w = attached->mPreferredWidth;\n        if (width_is_zero)\n            width += w + attached->mLeftMargin + attached->mRightMargin + mSpacing;\n\n        if (attached->mFillWidth)\n        {\n            autoFillCount++;\n            continue;\n        }\n\n        c->setWidth(w);\n        static_width += w + attached->mLeftMargin + attached->mRightMargin;\n    }\n    static_width += (visibleCount-1)*mSpacing;\n\n    const qreal autoFillWidth = width - static_width;\n    const qreal standardAutoFillWidth = (autoFillCount? autoFillWidth / autoFillCount : autoFillWidth);\n\n    for (auto c: childs)\n    {\n        if (!c->isVisible())\n            continue;\n        auto attached = qobject_cast<AsemanQuickLayoutProperty*>(qmlAttachedPropertiesObject<AsemanQuickLayout>(c, true));\n        if (!attached->mFillWidth)\n            continue;\n\n        c->setWidth(standardAutoFillWidth);\n    }\n\n    qreal lastX = 0;\n    qreal h, maxH = 0;\n    for (auto c: childs)\n    {\n        if (!c->isVisible())\n            continue;\n\n        auto attached = qobject_cast<AsemanQuickLayoutProperty*>(qmlAttachedPropertiesObject<AsemanQuickLayout>(c, true));\n\n        const auto newX = lastX + attached->mLeftMargin;\n        if (mirrored)\n            c->setX(width - newX - c->width());\n        else\n            c->setX(newX);\n\n        h = c->implicitHeight();\n        if (attached->mFillHeight)\n            h = height() - attached->mTopMargin - attached->mBottomMargin;\n        else if (attached->mPreferredHeight > 0)\n            h = attached->mPreferredHeight;\n\n        c->setHeight(h);\n        maxH = std::max(maxH, c->y() + c->height());\n\n        switch (attached->mAlignment & Qt::AlignVertical_Mask)\n        {\n        case Qt::AlignTop:\n            c->setY(attached->mTopMargin);\n            break;\n        case Qt::AlignBottom:\n            c->setY(height() - c->height() - attached->mBottomMargin);\n            break;\n        default:\n        case Qt::AlignVCenter:\n            c->setY(height()/2 - c->height()/2);\n            break;\n        }\n\n        if (c->width() > 0)\n            lastX += c->width() + attached->mLeftMargin + attached->mRightMargin + mSpacing;\n    }\n    if (visibleCount)\n        lastX -= mSpacing;\n\n    setImplicitWidth(lastX);\n    setImplicitHeight(maxH);\n}\n\nint AsemanQuickRowLayout::layoutDirection() const\n{\n    return mLayoutDirection;\n}\n\nvoid AsemanQuickRowLayout::setLayoutDirection(int newLayoutDirection)\n{\n    if (mLayoutDirection == newLayoutDirection)\n        return;\n    mLayoutDirection = newLayoutDirection;\n    reloadDelayed();\n    Q_EMIT layoutDirectionChanged();\n}\n\nqreal AsemanQuickRowLayout::spacing() const\n{\n    return mSpacing;\n}\n\nvoid AsemanQuickRowLayout::setSpacing(qreal newSpacing)\n{\n    if (qFuzzyCompare(mSpacing, newSpacing))\n        return;\n    mSpacing = newSpacing;\n    reloadDelayed();\n    Q_EMIT spacingChanged();\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickrowlayout.h",
    "content": "#ifndef ASEMANQUICKROWLAYOUT_H\n#define ASEMANQUICKROWLAYOUT_H\n\n#include \"asemanquicklayout.h\"\n\nclass AsemanQuickRowLayout : public AsemanQuickLayout\n{\n    Q_OBJECT\n    Q_PROPERTY(int layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged)\n    Q_PROPERTY(qreal spacing READ spacing WRITE setSpacing NOTIFY spacingChanged)\n\npublic:\n    AsemanQuickRowLayout(QQuickItem *parent = nullptr);\n    virtual ~AsemanQuickRowLayout();\n\n    qreal spacing() const;\n    void setSpacing(qreal newSpacing);\n\n    int layoutDirection() const;\n    void setLayoutDirection(int newLayoutDirection);\n\nQ_SIGNALS:\n    void spacingChanged();\n    void layoutDirectionChanged();\n\nprotected:\n    void relocateChilds() override;\n\nprivate:\n    qreal mSpacing = 4;\n    int mLayoutDirection = Qt::LeftToRight;\n};\n\n#endif // ASEMANQUICKROWLAYOUT_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquicksceneitem.cpp",
    "content": "#include \"asemanquicksceneitem.h\"\n\n#include <QQuickWindow>\n#include <QTimer>\n\nAsemanQuickSceneItem::AsemanQuickSceneItem(QQuickItem *parent)\n    : AsemanQuickStyledItem(parent)\n{\n    setAcceptHoverEvents(true);\n    setAcceptTouchEvents(true);\n    setAcceptedMouseButtons(Qt::AllButtons);\n    setSourceItem(this);\n\n    connect(this, &QQuickItem::visibleChanged, this, &AsemanQuickSceneItem::checkAndCaptureFocus, Qt::QueuedConnection);\n    QMetaObject::invokeMethod(this, &AsemanQuickSceneItem::checkAndCaptureFocus, Qt::QueuedConnection);\n}\n\nvoid AsemanQuickSceneItem::checkAndCaptureFocus()\n{\n    auto scene = this;\n    QQuickItem *itemToFocus = nullptr;\n    if (!isVisible())\n    {\n        itemToFocus = mPreviousFocused.item;\n        scene = mPreviousFocused.scene;\n    }\n    if (!scene)\n        return;\n\n    const auto controls = AsemanQuickControlItem::findAllControls(scene, true, true);\n    if (controls.isEmpty())\n        return;\n\n    auto win = window();\n    if (win)\n    {\n        mPreviousFocused.item = win->activeFocusItem();\n        mPreviousFocused.scene = findScene(mPreviousFocused.item);\n    }\n\n    auto c = itemToFocus? itemToFocus : controls.first();\n    if (c)\n    {\n        c->setFocus(true);\n        c->forceActiveFocus();\n    }\n}\n\nAsemanQuickSceneItem::~AsemanQuickSceneItem()\n{\n}\n\nQList<AsemanQuickControlItem *> AsemanQuickSceneItem::controls() const\n{\n    return AsemanQuickControlItem::findAllControls(this, true, false);\n}\n\nAsemanQuickSceneItem *AsemanQuickSceneItem::findScene(const QQuickItem *item)\n{\n    if (!item)\n        return nullptr;\n\n    auto parent = findParent(item);\n    while (parent)\n    {\n        auto obj = qobject_cast<AsemanQuickSceneItem*>(parent);\n        if (obj)\n            return obj;\n\n        parent = findParent(parent);\n    }\n    return nullptr;\n}\n\nvoid AsemanQuickSceneItem::mouseMoveEvent(QMouseEvent *e)\n{\n    e->accept();\n}\n\nvoid AsemanQuickSceneItem::mousePressEvent(QMouseEvent *e)\n{\n    e->accept();\n}\n\nvoid AsemanQuickSceneItem::mouseReleaseEvent(QMouseEvent *e)\n{\n    e->accept();\n}\n\nvoid AsemanQuickSceneItem::mouseUngrabEvent()\n{\n}\n\nvoid AsemanQuickSceneItem::touchEvent(QTouchEvent *e)\n{\n    e->accept();\n}\n\nvoid AsemanQuickSceneItem::touchUngrabEvent()\n{\n}\n\nvoid AsemanQuickSceneItem::wheelEvent(QWheelEvent *e)\n{\n    e->accept();\n}\n\nQObject *AsemanQuickSceneItem::findParent(const QObject *obj)\n{\n    auto *item = qobject_cast<const QQuickItem*>(obj);\n    if (item && item->parentItem())\n        return item->parentItem();\n    else\n        return obj->parent();\n}\n\nQFont AsemanQuickSceneItem::font() const\n{\n    return mFont;\n}\n\nvoid AsemanQuickSceneItem::setFont(const QFont &newFont)\n{\n    if (mFont == newFont)\n        return;\n    mFont = newFont;\n    Q_EMIT fontChanged();\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquicksceneitem.h",
    "content": "#ifndef ASEMANQUICKSCENEITEM_H\n#define ASEMANQUICKSCENEITEM_H\n\n#include \"asemanquickcontrolitem.h\"\n#include \"asemanquickstyleditem.h\"\n\nclass AsemanQuickSceneItem: public AsemanQuickStyledItem\n{\n    Q_OBJECT\n    Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)\n\npublic:\n    AsemanQuickSceneItem(QQuickItem *parent = nullptr);\n    virtual ~AsemanQuickSceneItem();\n\n    QList<AsemanQuickControlItem*> controls() const;\n\n    static AsemanQuickSceneItem *findScene(const QQuickItem *item);\n\n    QFont font() const;\n    void setFont(const QFont &newFont);\n\nQ_SIGNALS:\n    void fontChanged();\n\nprotected:\n    virtual void mouseMoveEvent(QMouseEvent *event) override;\n    virtual void mousePressEvent(QMouseEvent *event) override;\n    virtual void mouseReleaseEvent(QMouseEvent *event) override;\n    virtual void mouseUngrabEvent() override;\n    virtual void touchEvent(QTouchEvent *event) override;\n    virtual void touchUngrabEvent() override;\n    virtual void wheelEvent(QWheelEvent *event) override;\n\n    static QObject *findParent(const QObject *obj);\n    void checkAndCaptureFocus();\n\nprivate:\n    QFont mFont;\n\n    struct PreviousFocus {\n        QPointer<AsemanQuickSceneItem> scene;\n        QPointer<QQuickItem> item;\n    };\n\n    PreviousFocus mPreviousFocused;\n};\n\n#endif // ASEMANQUICKSCENEITEM_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickscrollviewcore.cpp",
    "content": "#include \"asemanquickscrollviewcore.h\"\n\nAsemanQuickScrollViewCore::AsemanQuickScrollViewCore(QQuickItem *parent)\n    : AsemanQuickControlItem(parent)\n{\n}\n\nAsemanQuickScrollViewCore::~AsemanQuickScrollViewCore()\n{\n}\n\nQQuickItem *AsemanQuickScrollViewCore::flickArea() const\n{\n    return mFlickArea;\n}\n\nvoid AsemanQuickScrollViewCore::setFlickArea(QQuickItem *newFlickArea)\n{\n    if (mFlickArea == newFlickArea)\n        return;\n    if (mFlickArea)\n        mFlickArea->removeEventFilter(this);\n\n    mFlickArea = newFlickArea;\n    if (mFlickArea)\n        mFlickArea->installEventFilter(this);\n\n    Q_EMIT flickAreaChanged();\n}\n\nbool AsemanQuickScrollViewCore::eventFilter(QObject *o, QEvent *e)\n{\n#if !defined(Q_OS_IOS) && !defined(Q_OS_ANDROID)\n    if (o == mFlickArea)\n    {\n        switch (static_cast<int>(e->type()))\n        {\n        case QEvent::MouseMove:\n            return true;\n            break;\n\n        case QEvent::Wheel:\n            break;\n        }\n    }\n#endif\n\n    return AsemanQuickControlItem::eventFilter(o, e);\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickscrollviewcore.h",
    "content": "#ifndef ASEMANQUICKSCROLLVIEWCORE_H\n#define ASEMANQUICKSCROLLVIEWCORE_H\n\n#include \"asemanquickcontrolitem.h\"\n\nclass AsemanQuickScrollViewCore : public AsemanQuickControlItem\n{\n    Q_OBJECT\n    Q_PROPERTY(QQuickItem *flickArea READ flickArea WRITE setFlickArea NOTIFY flickAreaChanged)\n    Q_CLASSINFO(\"DefaultProperty\", \"flickArea\")\n\npublic:\n    AsemanQuickScrollViewCore(QQuickItem *parent = nullptr);\n    virtual ~AsemanQuickScrollViewCore();\n\n    QQuickItem *flickArea() const;\n    void setFlickArea(QQuickItem *newFlickArea);\n\n    bool eventFilter(QObject *o, QEvent *e);\n\nQ_SIGNALS:\n    void flickAreaChanged();\n\nprivate:\n    QPointer<QQuickItem> mFlickArea;\n};\n\n#endif // ASEMANQUICKSCROLLVIEWCORE_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickstyleattachedproperty.cpp",
    "content": "#include \"asemanquickcontrolitem.h\"\n#include \"asemanquickstyleattachedproperty.h\"\n\n#include <QQuickItem>\n#include <QDebug>\n#include <QGuiApplication>\n\n#define ASEMAN_READ_STYLE(PROPERTY) \\\n    auto parentObject = AsemanQuickStyleAttachedProperty::findParent(this); \\\n    auto res = PROPERTY; \\\n    while (!res.has_value() && parentObject) { \\\n        auto attached = qobject_cast<AsemanQuickStyleAttachedProperty*>(qmlAttachedPropertiesObject<AsemanQuickStyleProperty>(parentObject, false)); \\\n        if (attached && attached->PROPERTY.has_value()) { \\\n            res = attached->PROPERTY; \\\n            break; \\\n        } \\\n        parentObject = AsemanQuickStyleAttachedProperty::findParent(parentObject); \\\n    }\n\n#define ASEMAN_WRITE_STYLE(PROPERTY, SIGNAL_NAME) \\\n    std::function<void(QObject *obj)> callback; \\\n    callback = [&callback](QObject *obj) { \\\n        for (auto c: obj->children()) { \\\n            auto attached = qobject_cast<AsemanQuickStyleAttachedProperty*>(qmlAttachedPropertiesObject<AsemanQuickStyleProperty>(c, false)); \\\n            if (!attached) { \\\n                callback(c); \\\n                continue; \\\n            } \\\n            if (!attached->PROPERTY.has_value()) { \\\n                Q_EMIT attached->SIGNAL_NAME(); \\\n                callback(c); \\\n            } \\\n        } \\\n    }; \\\n    callback(AsemanQuickStyleAttachedProperty::findParent(this));\n\nQHash<QString, QHash<QString, QString>> AsemanQuickStyleAttachedProperty::mThemePaths;\nstd::optional<QStringList> AsemanQuickStyleAttachedProperty::mGlobalFontFamilies;\nstd::optional<qint32> AsemanQuickStyleAttachedProperty::mGlobalFontPixelSize;\nQSet<AsemanQuickStyleAttachedProperty*> AsemanQuickStyleAttachedProperty::mObjects;\n\nAsemanQuickStyleAttachedProperty::AsemanQuickStyleAttachedProperty(QObject *parent)\n    : QObject(parent)\n{\n    reconnectParents();\n    mObjects.insert(this);\n}\n\nAsemanQuickStyleAttachedProperty::~AsemanQuickStyleAttachedProperty()\n{\n    mObjects.remove(this);\n}\n\nvoid AsemanQuickStyleAttachedProperty::invokeAllSignals()\n{\n    QMetaObject::invokeMethod(this, [this](){\n        Q_EMIT primaryColorChanged();\n        Q_EMIT primaryTextColorChanged();\n        Q_EMIT accentColorChanged();\n        Q_EMIT accentTextColorChanged();\n        Q_EMIT foregroundColorChanged();\n        Q_EMIT backgroundColorChanged();\n        Q_EMIT baseColorChanged();\n        Q_EMIT baseTextColorChanged();\n        Q_EMIT globalFontFamiliesChanged();\n        Q_EMIT globalFontPixelSizeChanged();\n        Q_EMIT styleNameChanged();\n        Q_EMIT stylesSearchPathChanged();\n    }, Qt::QueuedConnection);\n}\n\nQObject *AsemanQuickStyleAttachedProperty::findParent(const QObject *obj) const\n{\n    auto item = qobject_cast<const QQuickItem*>(obj);\n    if (item && item->parentItem())\n        return item->parentItem();\n\n    return obj->parent();\n}\n\nvoid AsemanQuickStyleAttachedProperty::reconnectParents()\n{\n    auto remianeds = mConnectedParents;\n    auto parentItem = qobject_cast<QQuickItem*>(parent());\n\n    while (parentItem)\n    {\n        if (!mConnectedParents.contains(parentItem))\n        {\n            connect(parentItem, &QQuickItem::parentChanged, this, &AsemanQuickStyleAttachedProperty::reconnectParents, Qt::QueuedConnection);\n            connect(parentItem, &QObject::destroyed, this, [this, parentItem](){\n                mConnectedParents.remove(parentItem);\n            });\n            mConnectedParents.insert(parentItem);\n        }\n\n        remianeds.remove(parentItem);\n        parentItem = qobject_cast<QQuickItem*>(findParent(parentItem));\n    }\n\n    for (auto obj: remianeds)\n    {\n        mConnectedParents.remove(obj);\n        obj->disconnect(this);\n    }\n\n    invokeAllSignals();\n}\n\nvoid AsemanQuickStyleAttachedProperty::resetGlobalFont()\n{\n    auto font = qApp->font();\n    if (mGlobalFontFamilies.has_value())\n    {\n        const auto families = mGlobalFontFamilies.value();\n        if (families.size() >= 1)\n            font.setFamily(families.first());\n        else\n            font.setFamily(QString());\n        font.setFamilies(families);\n    }\n    if (mGlobalFontPixelSize.has_value())\n        font.setPixelSize(mGlobalFontPixelSize.value());\n\n    qApp->setFont(font);\n}\n\nqreal AsemanQuickStyleAttachedProperty::radius() const\n{\n    return mRadius.value_or(-1);\n}\n\nvoid AsemanQuickStyleAttachedProperty::setRadius(qreal newRadius)\n{\n    if (mRadius.has_value() && qFuzzyCompare(mRadius.value(), newRadius))\n        return;\n    mRadius = newRadius;\n    ASEMAN_WRITE_STYLE(mRadius, radiusChanged);\n    Q_EMIT radiusChanged();\n}\n\nqint32 AsemanQuickStyleAttachedProperty::globalFontPixelSize() const\n{\n    return mGlobalFontPixelSize.value_or(12);\n}\n\nvoid AsemanQuickStyleAttachedProperty::setGlobalFontPixelSize(qint32 newGlobalFontPixelSize)\n{\n    if (mGlobalFontPixelSize == newGlobalFontPixelSize)\n        return;\n    mGlobalFontPixelSize = newGlobalFontPixelSize;\n    resetGlobalFont();\n    for (auto c: mObjects)\n        Q_EMIT c->globalFontPixelSizeChanged();\n}\n\nQStringList AsemanQuickStyleAttachedProperty::stylesSearchPath() const\n{\n    ASEMAN_READ_STYLE(mStylesSearchPath);\n    return res.value_or(QStringList());\n}\n\nvoid AsemanQuickStyleAttachedProperty::setStylesSearchPath(const QStringList &newStylesSearchPath)\n{\n    if (mStylesSearchPath == newStylesSearchPath)\n        return;\n    mStylesSearchPath = newStylesSearchPath;\n    ASEMAN_WRITE_STYLE(mStylesSearchPath, stylesSearchPathChanged);\n    Q_EMIT stylesSearchPathChanged();\n}\n\nQString AsemanQuickStyleAttachedProperty::getStylePath(const QStringList &searchPaths, const QString &styleName)\n{\n    const auto searchPaths_str = searchPaths.join('\\n');\n    if (mThemePaths.value(searchPaths_str).contains(styleName))\n        return mThemePaths.value(searchPaths_str).value(styleName);\n\n    QString selectedPath;\n    for (const auto &path: searchPaths)\n    {\n        auto files = QDir(path).entryList(QDir::Dirs | QDir::NoDotAndDotDot);\n        if (files.contains(styleName))\n        {\n            selectedPath = path;\n            if (path.right(1) != '/')\n                selectedPath += '/';\n            selectedPath += styleName;\n            break;\n        }\n    }\n    if (selectedPath.left(2) == QStringLiteral(\":/\"))\n        selectedPath = QStringLiteral(\"qrc\") + selectedPath;\n\n    mThemePaths[searchPaths_str][styleName] = selectedPath;\n    return selectedPath;\n}\n\nQUrl AsemanQuickStyleAttachedProperty::styleUrl() const\n{\n    auto paths = stylesSearchPath();\n    if (paths.isEmpty())\n        paths = QStringList({\":/AsemanQml/Controls/Beta/styles/\"});\n\n    auto name = styleName();\n    if (name.isEmpty())\n        name = \"simple\";\n\n    return getStylePath(paths, name);\n}\n\nQString AsemanQuickStyleAttachedProperty::styleName() const\n{\n    ASEMAN_READ_STYLE(mStyleName);\n    return res.value_or(QString());\n}\n\nvoid AsemanQuickStyleAttachedProperty::setStyleName(const QString &newStyleName)\n{\n    if (mStyleName == newStyleName)\n        return;\n    mStyleName = newStyleName;\n    ASEMAN_WRITE_STYLE(mStyleName, styleNameChanged);\n    Q_EMIT styleNameChanged();\n}\n\nQStringList AsemanQuickStyleAttachedProperty::globalFontFamilies() const\n{\n    return mGlobalFontFamilies.value_or(QStringList());\n}\n\nvoid AsemanQuickStyleAttachedProperty::setGlobalFontFamilies(const QStringList &newGlobalFontFamilies)\n{\n    if (mGlobalFontFamilies == newGlobalFontFamilies)\n        return;\n\n    mGlobalFontFamilies = newGlobalFontFamilies;\n    resetGlobalFont();\n    for (auto c: mObjects)\n        Q_EMIT c->globalFontFamiliesChanged();\n}\n\nQColor AsemanQuickStyleAttachedProperty::accentColor() const\n{\n    ASEMAN_READ_STYLE(mAccentColor);\n    return res.value_or(QColor());\n}\n\nvoid AsemanQuickStyleAttachedProperty::setAccentColor(const QColor &newHighlightColor)\n{\n    if (mAccentColor == newHighlightColor)\n        return;\n    mAccentColor = newHighlightColor;\n    ASEMAN_WRITE_STYLE(mAccentColor, accentColorChanged);\n    Q_EMIT accentColorChanged();\n}\n\nQColor AsemanQuickStyleAttachedProperty::accentTextColor() const\n{\n    ASEMAN_READ_STYLE(mAccentTextColor);\n    return res.value_or(QColor());\n}\n\nvoid AsemanQuickStyleAttachedProperty::setAccentTextColor(const QColor &newHighlightTextColor)\n{\n    if (mAccentTextColor == newHighlightTextColor)\n        return;\n    mAccentTextColor = newHighlightTextColor;\n    ASEMAN_WRITE_STYLE(mAccentTextColor, accentTextColorChanged);\n    Q_EMIT accentTextColorChanged();\n}\n\nQColor AsemanQuickStyleAttachedProperty::foregroundColor() const\n{\n    ASEMAN_READ_STYLE(mForegroundColor);\n    return res.value_or(QColor());\n}\n\nvoid AsemanQuickStyleAttachedProperty::setForegroundColor(const QColor &newForegroundColor)\n{\n    if (mForegroundColor == newForegroundColor)\n        return;\n    mForegroundColor = newForegroundColor;\n    ASEMAN_WRITE_STYLE(mForegroundColor, foregroundColorChanged);\n    Q_EMIT foregroundColorChanged();\n}\n\nQColor AsemanQuickStyleAttachedProperty::backgroundColor() const\n{\n    ASEMAN_READ_STYLE(mBackgroundColor);\n    return res.value_or(QColor());\n}\n\nvoid AsemanQuickStyleAttachedProperty::setBackgroundColor(const QColor &newBackgroundColor)\n{\n    if (mBackgroundColor == newBackgroundColor)\n        return;\n    mBackgroundColor = newBackgroundColor;\n    ASEMAN_WRITE_STYLE(mBackgroundColor, backgroundColorChanged);\n    Q_EMIT backgroundColorChanged();\n}\n\nQColor AsemanQuickStyleAttachedProperty::primaryColor() const\n{\n    ASEMAN_READ_STYLE(mPrimaryColor);\n    return res.value_or(QColor());\n}\n\nvoid AsemanQuickStyleAttachedProperty::setPrimaryColor(const QColor &newPrimaryColor)\n{\n    if (mPrimaryColor == newPrimaryColor)\n        return;\n    mPrimaryColor = newPrimaryColor;\n    ASEMAN_WRITE_STYLE(mPrimaryColor, primaryColorChanged);\n    Q_EMIT primaryColorChanged();\n}\n\nQColor AsemanQuickStyleAttachedProperty::primaryTextColor() const\n{\n    ASEMAN_READ_STYLE(mPrimaryTextColor);\n    return res.value_or(QColor());\n}\n\nvoid AsemanQuickStyleAttachedProperty::setPrimaryTextColor(const QColor &newPrimaryTextColor)\n{\n    if (mPrimaryTextColor == newPrimaryTextColor)\n        return;\n    mPrimaryTextColor = newPrimaryTextColor;\n    ASEMAN_WRITE_STYLE(mPrimaryTextColor, primaryTextColorChanged);\n    Q_EMIT primaryTextColorChanged();\n}\n\nQColor AsemanQuickStyleAttachedProperty::baseColor() const\n{\n    ASEMAN_READ_STYLE(mBaseColor);\n    return res.value_or(QColor());\n}\n\nvoid AsemanQuickStyleAttachedProperty::setBaseColor(const QColor &newBaseColor)\n{\n    if (mBaseColor == newBaseColor)\n        return;\n    mBaseColor = newBaseColor;\n    ASEMAN_WRITE_STYLE(mBaseColor, baseColorChanged);\n    Q_EMIT baseColorChanged();\n}\n\nQColor AsemanQuickStyleAttachedProperty::baseTextColor() const\n{\n    ASEMAN_READ_STYLE(mBaseTextColor);\n    return res.value_or(QColor());\n}\n\nvoid AsemanQuickStyleAttachedProperty::setBaseTextColor(const QColor &newBaseTextColor)\n{\n    if (mBaseTextColor == newBaseTextColor)\n        return;\n    mBaseTextColor = newBaseTextColor;\n    ASEMAN_WRITE_STYLE(mBaseTextColor, baseTextColorChanged);\n    Q_EMIT baseTextColorChanged();\n}\n\nAsemanQuickStyleAttachedProperty *AsemanQuickStyleProperty::qmlAttachedProperties(QObject *object)\n{\n    auto res = new AsemanQuickStyleAttachedProperty(object);\n\n    auto style = qobject_cast<AsemanQuickAbstractStyle*>(object);\n    if (style)\n    {\n        connect(res, &AsemanQuickStyleAttachedProperty::globalFontFamiliesChanged\n                , style, &AsemanQuickAbstractStyle::fontChanged);\n        connect(res, &AsemanQuickStyleAttachedProperty::globalFontPixelSizeChanged\n                , style, &AsemanQuickAbstractStyle::fontChanged);\n    }\n\n    return res;\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickstyleattachedproperty.h",
    "content": "#ifndef ASEMANQUICKSTYLEATTACHEDPROPERTY_H\n#define ASEMANQUICKSTYLEATTACHEDPROPERTY_H\n\n#include <QObject>\n#include <QtQml>\n#include <QStringList>\n#include <QColor>\n#include <QQuickItem>\n\n#include <optional>\n\nclass AsemanQuickStyleAttachedProperty : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QStringList globalFontFamilies READ globalFontFamilies WRITE setGlobalFontFamilies NOTIFY globalFontFamiliesChanged)\n    Q_PROPERTY(QColor accentColor READ accentColor WRITE setAccentColor NOTIFY accentColorChanged)\n    Q_PROPERTY(QColor accentTextColor READ accentTextColor WRITE setAccentTextColor NOTIFY accentTextColorChanged)\n    Q_PROPERTY(QColor foregroundColor READ foregroundColor WRITE setForegroundColor NOTIFY foregroundColorChanged)\n    Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor NOTIFY backgroundColorChanged)\n    Q_PROPERTY(QColor primaryColor READ primaryColor WRITE setPrimaryColor NOTIFY primaryColorChanged)\n    Q_PROPERTY(QColor primaryTextColor READ primaryTextColor WRITE setPrimaryTextColor NOTIFY primaryTextColorChanged)\n    Q_PROPERTY(QColor baseColor READ baseColor WRITE setBaseColor NOTIFY baseColorChanged)\n    Q_PROPERTY(QColor baseTextColor READ baseTextColor WRITE setBaseTextColor NOTIFY baseTextColorChanged)\n    Q_PROPERTY(QString styleName READ styleName WRITE setStyleName NOTIFY styleNameChanged)\n    Q_PROPERTY(QStringList stylesSearchPath READ stylesSearchPath WRITE setStylesSearchPath NOTIFY stylesSearchPathChanged)\n    Q_PROPERTY(qint32 globalFontPixelSize READ globalFontPixelSize WRITE setGlobalFontPixelSize NOTIFY globalFontPixelSizeChanged)\n    Q_PROPERTY(qreal radius READ radius WRITE setRadius NOTIFY radiusChanged)\n    Q_PROPERTY(bool hasRadius READ hasRadius NOTIFY radiusChanged)\n    Q_PROPERTY(QUrl styleUrl READ styleUrl NOTIFY styleNameChanged)\n\npublic:\n    AsemanQuickStyleAttachedProperty(QObject *parent = nullptr);\n    virtual ~AsemanQuickStyleAttachedProperty();\n\n    QStringList globalFontFamilies() const;\n    void setGlobalFontFamilies(const QStringList &newGlobalFontFamilies);\n\n    QColor accentColor() const;\n    void setAccentColor(const QColor &newHighlightColor);\n\n    QColor accentTextColor() const;\n    void setAccentTextColor(const QColor &newHighlightTextColor);\n\n    QColor foregroundColor() const;\n    void setForegroundColor(const QColor &newForegroundColor);\n\n    QColor backgroundColor() const;\n    void setBackgroundColor(const QColor &newBackgroundColor);\n\n    QColor primaryColor() const;\n    void setPrimaryColor(const QColor &newPrimaryColor);\n\n    QColor primaryTextColor() const;\n    void setPrimaryTextColor(const QColor &newPrimaryTextColor);\n\n    QColor baseColor() const;\n    void setBaseColor(const QColor &newBaseColor);\n\n    QColor baseTextColor() const;\n    void setBaseTextColor(const QColor &newBaseTextColor);\n\n    QString styleName() const;\n    void setStyleName(const QString &newStyleName);\n\n    QStringList stylesSearchPath() const;\n    void setStylesSearchPath(const QStringList &newStylesSearchPath);\n\n    static QString getStylePath(const QStringList &searchPaths, const QString &styleName);\n    QUrl styleUrl() const;\n\n    qint32 globalFontPixelSize() const;\n    void setGlobalFontPixelSize(qint32 newGlobalFontPixelSize);\n\n    qreal radius() const;\n    void setRadius(qreal newRadius);\n    bool hasRadius() const {\n        return mRadius.has_value() || mRadius.value() < 0;\n    }\n\nQ_SIGNALS:\n    void globalFontFamiliesChanged();\n    void accentColorChanged();\n    void accentTextColorChanged();\n    void foregroundColorChanged();\n    void backgroundColorChanged();\n    void primaryColorChanged();\n    void primaryTextColorChanged();\n    void baseColorChanged();\n    void baseTextColorChanged();\n    void styleNameChanged();\n    void stylesSearchPathChanged();\n    void styleUrlChanged();\n    void globalFontPixelSizeChanged();\n    void radiusChanged();\n\nprotected:\n    void invokeAllSignals();\n    QObject *findParent(const QObject *obj) const;\n\n    void reconnectParents();\n    void resetGlobalFont();\n\nprivate:\n    static std::optional<QStringList> mGlobalFontFamilies;\n    static std::optional<qint32> mGlobalFontPixelSize;\n\n    std::optional<QString> mStyleName;\n    std::optional<QStringList> mStylesSearchPath;\n\n    std::optional<QColor> mPrimaryColor;\n    std::optional<QColor> mPrimaryTextColor;\n    std::optional<QColor> mAccentColor;\n    std::optional<QColor> mAccentTextColor;\n    std::optional<QColor> mForegroundColor;\n    std::optional<QColor> mBackgroundColor;\n    std::optional<QColor> mBaseColor;\n    std::optional<QColor> mBaseTextColor;\n\n    std::optional<qreal> mRadius;\n\n    QSet<QQuickItem*> mConnectedParents;\n    static QHash<QString, QHash<QString, QString>> mThemePaths;\n    static QSet<AsemanQuickStyleAttachedProperty*> mObjects;\n};\n\nclass AsemanQuickStyleProperty : public QObject\n{\n    Q_OBJECT\npublic:\n    static AsemanQuickStyleAttachedProperty *qmlAttachedProperties(QObject *object);\n};\n\nQML_DECLARE_TYPEINFO(AsemanQuickStyleProperty, QML_HAS_ATTACHED_PROPERTIES)\n\n#endif // ASEMANQUICKSTYLEATTACHEDPROPERTY_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickstyleditem.cpp",
    "content": "#include \"asemanquickstyleattachedproperty.h\"\n#include \"asemanquickstyleditem.h\"\n\n#include <QQmlContext>\n#include <QtQml>\n\nQHash<QQmlEngine*, QHash<QString, QQmlComponent*>> AsemanQuickStyledItem::mStyleComponentObjects;\n\nAsemanQuickStyledItem::AsemanQuickStyledItem(QQuickItem *parent)\n    : QQuickItem(parent)\n{\n    mStyleItem = new AsemanQuickAbstractStyle(this);\n}\n\nAsemanQuickStyledItem::~AsemanQuickStyledItem()\n{\n}\n\nQQmlComponent *AsemanQuickStyledItem::styleComponent() const\n{\n    return mStyleComponent;\n}\n\nvoid AsemanQuickStyledItem::setStyleComponent(QQmlComponent *newStyleComponent)\n{\n    if (mStyleComponent == newStyleComponent)\n        return;\n\n    mStyleComponent = newStyleComponent;\n    setupStyleItem();\n    Q_EMIT styleComponentChanged();\n}\n\nvoid AsemanQuickStyledItem::reposItems()\n{\n    if (mStyleItem)\n    {\n        mStyleItem->setX(0);\n        mStyleItem->setY(0);\n        mStyleItem->setWidth(mSourceItem? mSourceItem->width() : width());\n        mStyleItem->setHeight(mSourceItem? mSourceItem->height() : height());\n    }\n}\n\nvoid AsemanQuickStyledItem::reinitImplicitSizes()\n{\n    if (mStyleItem && mSourceItem)\n    {\n        mSourceItem->setImplicitWidth(mStyleItem->implicitWidth());\n        mSourceItem->setImplicitHeight(mStyleItem->implicitHeight());\n    }\n}\n\nvoid AsemanQuickStyledItem::reloadStyleTheme()\n{\n    if (mStyleFileName.isEmpty())\n        return;\n    if (!parentItem())\n        return;\n\n    auto attached = qobject_cast<AsemanQuickStyleAttachedProperty*>(qmlAttachedPropertiesObject<AsemanQuickStyleProperty>(this, true));\n\n    auto url = attached->styleUrl();\n    const auto path = url.toString() + '/' + mStyleFileName;\n    if (path != mLastStylePath)\n    {\n        mLastStylePath = path;\n        if (!url.isEmpty())\n        {\n            auto engine = qmlEngine(this);\n            if (engine)\n            {\n                auto &component = mStyleComponentObjects[engine][path];\n                if (!component)\n                {\n                    component = new QQmlComponent(engine, QUrl(path), engine);\n                    connect(component, &QObject::destroyed, [engine, path](){\n                        mStyleComponentObjects[engine].remove(path);\n                        if (mStyleComponentObjects.value(engine).isEmpty())\n                            mStyleComponentObjects.remove(engine);\n                    });\n                }\n                if (component->isError())\n                {\n                    qDebug() << component->errorString().toStdString().c_str();\n                    delete component;\n                    component = nullptr;\n                }\n                else\n                {\n                    mFileStyleComponent = component;\n                    setupStyleItem();\n                }\n            }\n        }\n        else\n            qmlWarning(this) << \"Could not find style \" << mStyleFileName;\n    }\n}\n\nvoid AsemanQuickStyledItem::setupStyleItem()\n{\n    if (mStyleItem)\n    {\n        delete mStyleItem;\n        mStyleItem = nullptr;\n    }\n\n    if (!mSourceItem)\n        return;\n\n    const auto component = (mStyleComponent? mStyleComponent : mFileStyleComponent);\n    if (!component || !component->isReady())\n        return;\n\n    auto context = qmlContext(this);\n    auto newContext = new QQmlContext(context, this);\n    newContext->setContextProperty(\"control\", mSourceItem);\n\n    QVariantMap properties = {\n        {\"parent\", QVariant::fromValue<QObject*>(this)}\n    };\n\n    auto obj = component->createWithInitialProperties(properties, newContext);\n    mStyleItem = qobject_cast<AsemanQuickAbstractStyle*>(obj);\n    if (mStyleItem)\n    {\n        connect(mStyleItem, &QQuickItem::implicitWidthChanged, this, &AsemanQuickStyledItem::reinitImplicitSizes);\n        connect(mStyleItem, &QQuickItem::implicitHeightChanged, this, &AsemanQuickStyledItem::reinitImplicitSizes);\n        reinitImplicitSizes();\n        reposItems();\n    }\n    else\n        delete obj;\n\n    Q_EMIT styleItemChanged();\n}\n\nQQuickItem *AsemanQuickStyledItem::sourceItem() const\n{\n    return mSourceItem;\n}\n\nvoid AsemanQuickStyledItem::setSourceItem(QQuickItem *newSourceItem)\n{\n    if (mSourceItem == newSourceItem)\n        return;\n    if (mSourceItem)\n    {\n        disconnect(mSourceItem, &AsemanQuickStyledItem::widthChanged, this, &AsemanQuickStyledItem::reposItems);\n        disconnect(mSourceItem, &AsemanQuickStyledItem::heightChanged, this, &AsemanQuickStyledItem::reposItems);\n        disconnect(mSourceItem, &QQuickItem::parentChanged, this, &AsemanQuickStyledItem::reloadStyleTheme);\n    }\n    mSourceItem = newSourceItem;\n    if (mSourceItem)\n    {\n        connect(mSourceItem, &AsemanQuickStyledItem::widthChanged, this, &AsemanQuickStyledItem::reposItems);\n        connect(mSourceItem, &AsemanQuickStyledItem::heightChanged, this, &AsemanQuickStyledItem::reposItems);\n        connect(mSourceItem, &QQuickItem::parentChanged, this, &AsemanQuickStyledItem::reloadStyleTheme);\n        reposItems();\n    }\n\n    setupStyleItem();\n    Q_EMIT sourceItemChanged();\n}\n\nAsemanQuickAbstractStyle *AsemanQuickStyledItem::styleItem() const\n{\n    return mStyleItem;\n}\n\nQString AsemanQuickStyledItem::styleFileName() const\n{\n    return mStyleFileName;\n}\n\nvoid AsemanQuickStyledItem::setStyleFileName(const QString &newStyleFileName)\n{\n    if (mStyleFileName == newStyleFileName)\n        return;\n    mStyleFileName = newStyleFileName;\n    reloadStyleTheme();\n    Q_EMIT styleFileNameChanged();\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/asemanquickstyleditem.h",
    "content": "#ifndef ASEMANQUICKSTYLEDITEM_H\n#define ASEMANQUICKSTYLEDITEM_H\n\n#include <QQuickItem>\n#include <QQmlComponent>\n#include <QPointer>\n#include <QUrl>\n\n#include \"asemanquickabstractstyle.h\"\n\nclass AsemanQuickStyledItem : public QQuickItem\n{\n    Q_OBJECT\n    Q_PROPERTY(QQuickItem *sourceItem READ sourceItem WRITE setSourceItem NOTIFY sourceItemChanged)\n    Q_PROPERTY(QQmlComponent *styleComponent READ styleComponent WRITE setStyleComponent NOTIFY styleComponentChanged)\n    Q_PROPERTY(QString styleFileName READ styleFileName WRITE setStyleFileName NOTIFY styleFileNameChanged)\n    Q_PROPERTY(AsemanQuickAbstractStyle *styleItem READ styleItem NOTIFY styleItemChanged)\n\npublic:\n    AsemanQuickStyledItem(QQuickItem *parent = nullptr);\n    virtual ~AsemanQuickStyledItem();\n\n    QQmlComponent *styleComponent() const;\n    void setStyleComponent(QQmlComponent *newStyleComponent);\n\n    QString styleFileName() const;\n    void setStyleFileName(const QString &newStyleFileName);\n\n    AsemanQuickAbstractStyle *styleItem() const;\n\n    QQuickItem *sourceItem() const;\n    void setSourceItem(QQuickItem *newSourceItem);\n\nQ_SIGNALS:\n    void styleComponentChanged();\n    void styleFileNameChanged();\n    void styleItemChanged();\n    void sourceItemChanged();\n\nprotected:\n    void reposItems();\n    void reinitImplicitSizes();\n    void reloadStyleTheme();\n    void setupStyleItem();\n\nprivate:\n    QPointer<QQuickItem> mSourceItem;\n    QPointer<QQmlComponent> mStyleComponent;\n    QPointer<QQmlComponent> mFileStyleComponent;\n    QString mStyleFileName;\n    AsemanQuickAbstractStyle *mStyleItem = nullptr;\n    QString mLastStylePath;\n\n    static QHash<QQmlEngine*, QHash<QString, QQmlComponent*>> mStyleComponentObjects;\n};\n\n#endif // ASEMANQUICKSTYLEDITEM_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/beta.pri",
    "content": "INCLUDEPATH += $$PWD\nQT += qml quick\n\nHEADERS += \\\n    $$PWD/asemanquickabstractbutton.h \\\n    $$PWD/asemanquickabstractstyle.h \\\n    $$PWD/asemanquickboxsize.h \\\n    $$PWD/asemanquickcontrolitem.h \\\n    $$PWD/asemanquickmainpalette.h \\\n    $$PWD/asemanquickradiobuttoncontrol.h \\\n    $$PWD/asemanquickradiobuttongroup.h \\\n    $$PWD/asemanquicksceneitem.h \\\n    $$PWD/asemanquickscrollviewcore.h \\\n    $$PWD/asemanquickstyleattachedproperty.h \\\n    $$PWD/asemanquickstyleditem.h\n\nSOURCES += \\\n    $$PWD/asemanquickabstractbutton.cpp \\\n    $$PWD/asemanquickabstractstyle.cpp \\\n    $$PWD/asemanquickboxsize.cpp \\\n    $$PWD/asemanquickcontrolitem.cpp \\\n    $$PWD/asemanquickmainpalette.cpp \\\n    $$PWD/asemanquickradiobuttoncontrol.cpp \\\n    $$PWD/asemanquickradiobuttongroup.cpp \\\n    $$PWD/asemanquicksceneitem.cpp \\\n    $$PWD/asemanquickscrollviewcore.cpp \\\n    $$PWD/asemanquickstyleattachedproperty.cpp \\\n    $$PWD/asemanquickstyleditem.cpp\n\nstatic: !linux: !win32: DEFINES += ASEMAN_STATIC_BUILD\n\nASEMAN_QML_BETA_FILES = $$files($$PWD/*.qml) $$PWD/qmldir\nASEMAN_QML_BETA_PRIVATES = $$files($$PWD/private/*)\nASEMAN_QML_BETA_RESOURCES = $$files($$PWD/styles/simple/*)\n\nINCLUDED_BETA_RESOURCE_FILES = \\\n    $$ASEMAN_QML_BETA_FILES \\\n    $$ASEMAN_QML_BETA_PRIVATES \\\n    $$ASEMAN_QML_BETA_RESOURCES\n\nasemancontrolsbeta.files = $$INCLUDED_BETA_RESOURCE_FILES\nasemancontrolsbeta.prefix = /AsemanQml/\n\ncontains(DEFINES, QT_ASEMAN_EMBEDDED) {\n    RESOURCES += $$PWD/qmake_asemancontrolsbeta.qrc\n} else {\n    RESOURCES += asemancontrolsbeta\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/controls_beta.pri",
    "content": "INCLUDEPATH += $$PWD\nQT += qml quick\n\nHEADERS += \\\n    $$PWD/asemanquickabstractbutton.h \\\n    $$PWD/asemanquickabstractstyle.h \\\n    $$PWD/asemanquickboxsize.h \\\n    $$PWD/asemanquickcolumnlayout.h \\\n    $$PWD/asemanquickcontrolitem.h \\\n    $$PWD/asemanquicklayout.h \\\n    $$PWD/asemanquickmainpalette.h \\\n    $$PWD/asemanquickradiobuttoncontrol.h \\\n    $$PWD/asemanquickradiobuttongroup.h \\\n    $$PWD/asemanquickrowlayout.h \\\n    $$PWD/asemanquicksceneitem.h \\\n    $$PWD/asemanquickscrollviewcore.h \\\n    $$PWD/asemanquickstyleattachedproperty.h \\\n    $$PWD/asemanquickstyleditem.h \\\n    $$PWD/asemanqttoolsitemcontrolsbeta.h \\\n    $$PWD/controlsbetaplugin.h\n\n\nSOURCES += \\\n    $$PWD/asemanquickabstractbutton.cpp \\\n    $$PWD/asemanquickabstractstyle.cpp \\\n    $$PWD/asemanquickboxsize.cpp \\\n    $$PWD/asemanquickcolumnlayout.cpp \\\n    $$PWD/asemanquickcontrolitem.cpp \\\n    $$PWD/asemanquicklayout.cpp \\\n    $$PWD/asemanquickmainpalette.cpp \\\n    $$PWD/asemanquickradiobuttoncontrol.cpp \\\n    $$PWD/asemanquickradiobuttongroup.cpp \\\n    $$PWD/asemanquickrowlayout.cpp \\\n    $$PWD/asemanquicksceneitem.cpp \\\n    $$PWD/asemanquickscrollviewcore.cpp \\\n    $$PWD/asemanquickstyleattachedproperty.cpp \\\n    $$PWD/asemanquickstyleditem.cpp \\\n    $$PWD/asemanqttoolsitemcontrolsbeta.cpp \\\n    $$PWD/controlsbetaplugin.cpp\n\nstatic: !linux: !win32: DEFINES += ASEMAN_STATIC_BUILD\n\nASEMAN_QML_FILES = $$files($$PWD/Beta/*.*) $$PWD/Beta/qmldir\nASEMAN_QML_PRIVATES = $$files($$PWD/Beta/Private/*)\nASEMAN_QML_RESOURCES = $$files($$PWD/Beta/styles/simple/*)\n\nINCLUDED_RESOURCE_FILES = \\\n    $$ASEMAN_QML_FILES \\\n    $$ASEMAN_QML_PRIVATES \\\n    $$ASEMAN_QML_RESOURCES\n\nasemancontrols_beta.files = $$INCLUDED_RESOURCE_FILES\nasemancontrols_beta.prefix = /AsemanQml/Controls/\n\ncontains(DEFINES, QT_ASEMAN_EMBEDDED) {\n    RESOURCES += $$PWD/qmake_asemancontrols_beta.qrc\n} else {\n    RESOURCES += asemancontrols_beta\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/controls_beta.pro",
    "content": "TARGET  = asemanqmlcontrolsbeta\nTARGETPATH = AsemanQml/Controls/Beta\nIMPORT_VERSION = 3.0\n\nQT += asemanqml asemancore\ninclude(controls_beta.pri)\n\nload(qml_plugin)\n"
  },
  {
    "path": "src/asemanqml/controls_beta/controlsbetaplugin.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"controlsbetaplugin.h\"\n#include \"asemanqttoolsitemcontrolsbeta.h\"\n\n#include <QDebug>\n#include <QDir>\n#include <QStringList>\n#include <QtQml>\n\n#ifdef QT_ASEMAN_EMBEDDED\nbool asemanqml_controls_beta_plugin_registered = AsemanControlsBetaPlugin::registerStaticTypes(\"AsemanQml.Controls.Beta\");\n#endif\n\nbool AsemanControlsBetaPlugin::registerStaticTypes(const char *uri)\n{\n    Q_INIT_RESOURCE(qmake_asemancontrols_beta);\n    AsemanQtToolsItemControlsBeta::registerTypes(uri);\n    AsemanQtToolsItemControlsBeta::registerFiles(QStringLiteral(\":/AsemanQml/Controls/Beta\"), uri);\n    return true;\n}\n\nvoid AsemanControlsBetaPlugin::registerTypes(const char *uri)\n{\n    AsemanControlsBetaPlugin::registerStaticTypes(uri);\n}\n\nvoid AsemanControlsBetaPlugin::initializeEngine(QQmlEngine *engine, const char *uri)\n{\n    QQmlExtensionPlugin::initializeEngine(engine, uri);\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/controlsbetaplugin.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANCONTROLSBETAPLUGIN_H\n#define ASEMANCONTROLSBETAPLUGIN_H\n\n#include <QQmlExtensionPlugin>\n\nclass AsemanControlsBetaPlugin : public QQmlExtensionPlugin\n{\n    Q_OBJECT\n\n#ifndef QT_ASEMAN_EMBEDDED\n    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)\n#endif\n\npublic:\n    static bool registerStaticTypes(const char *uri);\n    void registerTypes(const char *uri);\n    void initializeEngine(QQmlEngine *engine, const char *uri);\n};\n\n#endif // ASEMANCONTROLSBETAPLUGIN_H\n"
  },
  {
    "path": "src/asemanqml/controls_beta/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Controls.Beta 3.0'\n\nModule {\n    dependencies: [\"QtQuick 2.0\"]\n    Component {\n        name: \"AsemanQuickAbstractStyle\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Controls.Beta/AbstractStyle 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"padding\"; type: \"AsemanQuickBoxSize\"; isPointer: true }\n        Property { name: \"font\"; type: \"QFont\" }\n        Property { name: \"extra\"; type: \"QVariantMap\" }\n    }\n    Component {\n        name: \"AsemanQuickBoxSize\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Controls.Beta/BoxSize 3.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        Property { name: \"left\"; type: \"int\" }\n        Property { name: \"top\"; type: \"int\" }\n        Property { name: \"right\"; type: \"int\" }\n        Property { name: \"bottom\"; type: \"int\" }\n    }\n    Component {\n        name: \"AsemanQuickColumnLayout\"\n        defaultProperty: \"data\"\n        prototype: \"AsemanQuickLayout\"\n        exports: [\"AsemanQml.Controls.Beta/ColumnLayout 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"spacing\"; type: \"double\" }\n    }\n    Component {\n        name: \"AsemanQuickControlItem\"\n        defaultProperty: \"data\"\n        prototype: \"AsemanQuickStyledItem\"\n        exports: [\"AsemanQml.Controls.Beta/Control 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"nextTabOrder\"; type: \"AsemanQuickControlItem\"; isPointer: true }\n        Property { name: \"focusedInUsingKeyboard\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"focusableUsingKeyboard\"; type: \"bool\" }\n        Property { name: \"focusable\"; type: \"bool\" }\n        Method { name: \"focusNextItem\" }\n        Method { name: \"focusPreviousItem\" }\n    }\n    Component {\n        name: \"AsemanQuickLayout\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Controls.Beta/Layout 3.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        attachedType: \"AsemanQuickLayoutProperty\"\n        Method { name: \"reload\" }\n    }\n    Component {\n        name: \"AsemanQuickLayoutProperty\"\n        prototype: \"QObject\"\n        Property { name: \"fillWidth\"; type: \"bool\" }\n        Property { name: \"fillHeight\"; type: \"bool\" }\n        Property { name: \"preferredWidth\"; type: \"double\" }\n        Property { name: \"preferredHeight\"; type: \"double\" }\n        Property { name: \"leftMargin\"; type: \"double\" }\n        Property { name: \"topMargin\"; type: \"double\" }\n        Property { name: \"rightMargin\"; type: \"double\" }\n        Property { name: \"bottomMargin\"; type: \"double\" }\n        Property { name: \"alignment\"; type: \"int\" }\n        Signal { name: \"changed\" }\n    }\n    Component {\n        name: \"AsemanQuickMainPalette\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Controls.Beta/MainPalette 3.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"Theme\"\n            values: {\n                \"Auto\": 0,\n                \"Light\": 1,\n                \"Dark\": 2\n            }\n        }\n        Property { name: \"theme\"; type: \"int\" }\n        Property { name: \"highlight\"; type: \"QColor\" }\n        Property { name: \"highlightText\"; type: \"QColor\" }\n        Property { name: \"foreground\"; type: \"QColor\" }\n        Property { name: \"background\"; type: \"QColor\" }\n        Property { name: \"base\"; type: \"QColor\" }\n        Property { name: \"baseText\"; type: \"QColor\" }\n    }\n    Component {\n        name: \"AsemanQuickRadioButtonControl\"\n        defaultProperty: \"data\"\n        prototype: \"AsemanQuickControlItem\"\n        exports: [\"AsemanQml.Controls.Beta/RadioControl 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"checked\"; type: \"bool\" }\n    }\n    Component {\n        name: \"AsemanQuickRadioButtonGroup\"\n        defaultProperty: \"items\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Controls.Beta/RadioButtonGroup 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"items\"; type: \"AsemanQuickRadioButtonControl\"; isList: true; isReadonly: true }\n        Method {\n            name: \"addButton\"\n            Parameter { name: \"radio\"; type: \"AsemanQuickRadioButtonControl\"; isPointer: true }\n        }\n        Method {\n            name: \"removeButton\"\n            Parameter { name: \"radio\"; type: \"AsemanQuickRadioButtonControl\"; isPointer: true }\n        }\n    }\n    Component {\n        name: \"AsemanQuickRadioButtonGroupAttachedCreator\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Controls.Beta/ButtonGroup 3.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        attachedType: \"AsemanQuickRadioButtonGroupAttachedProperty\"\n    }\n    Component {\n        name: \"AsemanQuickRadioButtonGroupAttachedProperty\"\n        prototype: \"QObject\"\n        Property { name: \"group\"; type: \"AsemanQuickRadioButtonGroup\"; isPointer: true }\n    }\n    Component {\n        name: \"AsemanQuickRowLayout\"\n        defaultProperty: \"data\"\n        prototype: \"AsemanQuickLayout\"\n        exports: [\"AsemanQml.Controls.Beta/RowLayout 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"layoutDirection\"; type: \"int\" }\n        Property { name: \"spacing\"; type: \"double\" }\n    }\n    Component {\n        name: \"AsemanQuickSceneItem\"\n        defaultProperty: \"data\"\n        prototype: \"AsemanQuickStyledItem\"\n        exports: [\"AsemanQml.Controls.Beta/Scene 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"font\"; type: \"QFont\" }\n    }\n    Component {\n        name: \"AsemanQuickScrollViewCore\"\n        defaultProperty: \"flickArea\"\n        prototype: \"AsemanQuickControlItem\"\n        exports: [\"AsemanQml.Controls.Beta/ScrollViewCore 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"flickArea\"; type: \"QQuickItem\"; isPointer: true }\n    }\n    Component {\n        name: \"AsemanQuickStyleAttachedProperty\"\n        prototype: \"QObject\"\n        Property { name: \"globalFontFamilies\"; type: \"QStringList\" }\n        Property { name: \"accentColor\"; type: \"QColor\" }\n        Property { name: \"accentTextColor\"; type: \"QColor\" }\n        Property { name: \"foregroundColor\"; type: \"QColor\" }\n        Property { name: \"backgroundColor\"; type: \"QColor\" }\n        Property { name: \"primaryColor\"; type: \"QColor\" }\n        Property { name: \"primaryTextColor\"; type: \"QColor\" }\n        Property { name: \"baseColor\"; type: \"QColor\" }\n        Property { name: \"baseTextColor\"; type: \"QColor\" }\n        Property { name: \"styleName\"; type: \"string\" }\n        Property { name: \"stylesSearchPath\"; type: \"QStringList\" }\n        Property { name: \"globalFontPixelSize\"; type: \"int\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"hasRadius\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"styleUrl\"; type: \"QUrl\"; isReadonly: true }\n    }\n    Component {\n        name: \"AsemanQuickStyleProperty\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Controls.Beta/Style 3.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        attachedType: \"AsemanQuickStyleAttachedProperty\"\n    }\n    Component {\n        name: \"AsemanQuickStyledItem\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Controls.Beta/StyledItem 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"sourceItem\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"styleComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property {\n            name: \"styleItem\"\n            type: \"AsemanQuickAbstractStyle\"\n            isReadonly: true\n            isPointer: true\n        }\n    }\n    Component {\n        prototype: \"AsemanApplicationItem\"\n        name: \"AsemanQml.Controls.Beta/AsemanApplication 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/AsemanApplication 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n    }\n    Component {\n        prototype: \"QQuickWindowQmlImpl\"\n        name: \"AsemanQml.Controls.Beta/AsemanWindow 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/AsemanWindow 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"backController\"; type: \"bool\" }\n        Property { name: \"try_close\"; type: \"bool\" }\n        Property { name: \"viewport\"; type: \"Viewport_QMLTYPE_1\"; isReadonly: true; isPointer: true }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Signal { name: \"closeRequest\" }\n        Method { name: \"tryClose\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/BottomDrawer 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/BottomDrawer 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"delegate\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"sceneComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"opened\"; type: \"bool\" }\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"openToPrimaryViewport\"; type: \"bool\" }\n        Method { name: \"open\"; type: \"QVariant\" }\n        Method { name: \"close\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/BusyIndicator 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/BusyIndicator 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"running\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/Button 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Button 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"icon\"; type: \"string\" }\n        Property { name: \"font\"; type: \"QFont\" }\n        Property { name: \"iconPixelSize\"; type: \"double\" }\n        Property { name: \"highlighted\"; type: \"bool\" }\n        Property { name: \"flat\"; type: \"bool\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/CheckBox 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/CheckBox 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"checked\"; type: \"bool\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n        Signal { name: \"toggled\" }\n        Method { name: \"toggle\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/CheckBoxDelegate 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/CheckBoxDelegate 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"checked\"; type: \"bool\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n        Signal { name: \"toggled\" }\n        Method { name: \"toggle\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/ComboBox 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/ComboBox 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"delegateStyleFileName\"; type: \"string\" }\n        Property { name: \"textRole\"; type: \"string\" }\n        Property { name: \"displayText\"; type: \"string\" }\n        Property { name: \"currentText\"; type: \"string\"; isReadonly: true }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"flat\"; type: \"bool\" }\n        Property { name: \"model\"; type: \"QVariant\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Property { name: \"popup\"; type: \"MenuPopup_QMLTYPE_20\"; isReadonly: true; isPointer: true }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal {\n            name: \"activated\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/ComboBoxDelegate 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/ComboBoxDelegate 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"selected\"; type: \"bool\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/Dialog 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Dialog 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"delegate\"\n        Property { name: \"sceneStyleComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"sceneStyleFileName\"; type: \"string\" }\n        Property { name: \"title\"; type: \"string\" }\n        Property { name: \"leftPadding\"; type: \"QVariant\" }\n        Property { name: \"rightPadding\"; type: \"QVariant\" }\n        Property { name: \"topPadding\"; type: \"QVariant\" }\n        Property { name: \"bottomPadding\"; type: \"QVariant\" }\n        Property { name: \"buttons\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Signal { name: \"closed\" }\n        Signal { name: \"rejected\" }\n        Signal { name: \"accepted\" }\n        Method { name: \"reject\"; type: \"QVariant\" }\n        Method { name: \"accept\"; type: \"QVariant\" }\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"sceneComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"opened\"; type: \"bool\" }\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"openToPrimaryViewport\"; type: \"bool\" }\n        Method { name: \"open\"; type: \"QVariant\" }\n        Method { name: \"close\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickSceneItem\"\n        name: \"AsemanQml.Controls.Beta/DialogScene 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/DialogScene 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"leftPadding\"; type: \"double\" }\n        Property { name: \"rightPadding\"; type: \"double\" }\n        Property { name: \"topPadding\"; type: \"double\" }\n        Property { name: \"bottomPadding\"; type: \"double\" }\n        Property { name: \"title\"; type: \"string\" }\n        Property { name: \"buttons\"; type: \"QVariant\" }\n        Property { name: \"item\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"scene\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/FloatPage 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/FloatPage 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"delegate\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"sceneComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"opened\"; type: \"bool\" }\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"openToPrimaryViewport\"; type: \"bool\" }\n        Method { name: \"open\"; type: \"QVariant\" }\n        Method { name: \"close\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/Footer 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Footer 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"list\"\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Property { name: \"interactive\"; type: \"bool\" }\n        Property { name: \"list\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/FooterButton 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/FooterButton 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"icon\"; type: \"string\" }\n        Property { name: \"iconPixelSize\"; type: \"double\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/Header 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Header 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"title\"; type: \"string\" }\n        Property { name: \"scene\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/HeaderMenuButton 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/HeaderMenuButton 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"buttonColor\"; type: \"QColor\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n    }\n    Component {\n        prototype: \"QQuickText\"\n        name: \"AsemanQml.Controls.Beta/Icon 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Icon 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/ItemDelegate 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/ItemDelegate 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"scene\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hoverEnabled\"; type: \"bool\" }\n        Property { name: \"pressAndHoldInterval\"; type: \"int\" }\n        Property { name: \"acceptedButtons\"; type: \"int\" }\n        Signal {\n            name: \"clicked\"\n            Parameter { name: \"mouse\"; type: \"QVariant\" }\n        }\n        Signal {\n            name: \"pressAndHold\"\n            Parameter { name: \"mouse\"; type: \"QVariant\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickText\"\n        name: \"AsemanQml.Controls.Beta/Label 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Label 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/Menu 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Menu 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"sceneData\"\n        Property { name: \"sceneData\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"sceneComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"opened\"; type: \"bool\" }\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"openToPrimaryViewport\"; type: \"bool\" }\n        Method { name: \"open\"; type: \"QVariant\" }\n        Method { name: \"close\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/MenuButton 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/MenuButton 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"icon\"; type: \"string\" }\n        Property { name: \"iconPixelSize\"; type: \"double\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/MenuIcon 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/MenuIcon 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"_mirror\"; type: \"bool\"; isReadonly: true }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/MenuPopup 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/MenuPopup 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"delegate\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"sceneComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"opened\"; type: \"bool\" }\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"openToPrimaryViewport\"; type: \"bool\" }\n        Method { name: \"open\"; type: \"QVariant\" }\n        Method { name: \"close\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickSceneItem\"\n        name: \"AsemanQml.Controls.Beta/Page 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Page 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"title\"; type: \"string\" }\n        Property { name: \"header\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"footer\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"scene\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/ProgressBar 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/ProgressBar 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"from\"; type: \"double\" }\n        Property { name: \"to\"; type: \"double\" }\n        Property { name: \"value\"; type: \"double\" }\n        Property { name: \"indeterminate\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"AsemanQuickRadioButtonControl\"\n        name: \"AsemanQml.Controls.Beta/RadioButton 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/RadioButton 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n        Signal { name: \"toggled\" }\n        Method { name: \"toggle\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/ScrollBar 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/ScrollBar 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"flickArea\"; type: \"QQuickFlickable\"; isPointer: true }\n        Property { name: \"orientation\"; type: \"int\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"forceVisible\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"AsemanQuickScrollViewCore\"\n        name: \"AsemanQml.Controls.Beta/ScrollView 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/ScrollView 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"flickArea\"\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/Slider 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Slider 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"from\"; type: \"double\" }\n        Property { name: \"to\"; type: \"double\" }\n        Property { name: \"value\"; type: \"double\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Method { name: \"decrease\"; type: \"QVariant\" }\n        Method { name: \"increase\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/StackPage 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/StackPage 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"delegate\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"sceneComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"opened\"; type: \"bool\" }\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"openToPrimaryViewport\"; type: \"bool\" }\n        Method { name: \"open\"; type: \"QVariant\" }\n        Method { name: \"close\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/SwipeView 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/SwipeView 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"list\"\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Property { name: \"interactive\"; type: \"bool\" }\n        Property { name: \"list\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/Switch 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Switch 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"checked\"; type: \"bool\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n        Signal { name: \"toggled\" }\n        Method { name: \"toggle\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/SwitchDelegate 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/SwitchDelegate 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"checked\"; type: \"bool\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n        Signal { name: \"toggled\" }\n        Method { name: \"toggle\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/TabBar 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/TabBar 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"list\"\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Property { name: \"interactive\"; type: \"bool\" }\n        Property { name: \"list\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/TabButton 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/TabButton 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"icon\"; type: \"string\" }\n        Property { name: \"iconPixelSize\"; type: \"double\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n    }\n    Component {\n        prototype: \"QQuickTextEdit\"\n        name: \"AsemanQml.Controls.Beta/TextArea 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/TextArea 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"placeholderText\"; type: \"string\" }\n        Signal {\n            name: \"contextMenuRequest\"\n            Parameter { name: \"x\"; type: \"double\" }\n            Parameter { name: \"y\"; type: \"double\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickTextInput\"\n        name: \"AsemanQml.Controls.Beta/TextField 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/TextField 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"placeholderText\"; type: \"string\" }\n        Signal {\n            name: \"contextMenuRequest\"\n            Parameter { name: \"x\"; type: \"double\" }\n            Parameter { name: \"y\"; type: \"double\" }\n        }\n    }\n    Component {\n        prototype: \"AsemanViewport\"\n        name: \"AsemanQml.Controls.Beta/ViewportContainer 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/ViewportContainer 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"sceneItems\"\n        Property { name: \"sceneItems\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Property { name: \"androidStyle\"; type: \"bool\" }\n        Property { name: \"mainItem\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"currentItem\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"currentType\"; type: \"string\"; isReadonly: true }\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"list\"; type: \"QVariantList\" }\n        Method {\n            name: \"append\"\n            type: \"QVariant\"\n            Parameter { name: \"component\"; type: \"QVariant\" }\n            Parameter { name: \"properties\"; type: \"QVariant\" }\n            Parameter { name: \"type\"; type: \"QVariant\" }\n        }\n        Method { name: \"closeLast\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickWindowQmlImpl\"\n        name: \"AsemanQml.Controls.Beta/Window 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Window 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"backController\"; type: \"bool\" }\n        Property { name: \"try_close\"; type: \"bool\" }\n        Property { name: \"viewport\"; type: \"Viewport_QMLTYPE_1\"; isReadonly: true; isPointer: true }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Signal { name: \"closeRequest\" }\n        Method { name: \"tryClose\"; type: \"QVariant\" }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/controls_beta/qmake_asemancontrols_beta.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/AsemanQml/Controls\">\n        <file>Beta/Page.qml</file>\n        <file>Beta/qmldir</file>\n        <file>Beta/Label.qml</file>\n        <file>Beta/Button.qml</file>\n        <file>Beta/Icon.qml</file>\n        <file>Beta/styles/simple/ButtonStyle.qml</file>\n        <file>Beta/styles/simple/LabelStyle.qml</file>\n        <file>Beta/styles/simple/PageStyle.qml</file>\n        <file>Beta/styles/simple/IconStyle.qml</file>\n        <file>Beta/Header.qml</file>\n        <file>Beta/styles/simple/HeaderStyle.qml</file>\n        <file>Beta/styles/simple/FooterStyle.qml</file>\n        <file>Beta/Footer.qml</file>\n        <file>Beta/CheckBox.qml</file>\n        <file>Beta/styles/simple/CheckBoxStyle.qml</file>\n        <file>Beta/Switch.qml</file>\n        <file>Beta/styles/simple/SwitchStyle.qml</file>\n        <file>Beta/CheckBoxDelegate.qml</file>\n        <file>Beta/SwitchDelegate.qml</file>\n        <file>Beta/styles/simple/SwitchDelegateStyle.qml</file>\n        <file>Beta/styles/simple/CheckBoxDelegateStyle.qml</file>\n        <file>Beta/ItemDelegate.qml</file>\n        <file>Beta/styles/simple/ItemDelegateStyle.qml</file>\n        <file>Beta/TextField.qml</file>\n        <file>Beta/styles/simple/TextFieldStyle.qml</file>\n        <file>Beta/TextArea.qml</file>\n        <file>Beta/styles/simple/TextAreaStyle.qml</file>\n        <file>Beta/ProgressBar.qml</file>\n        <file>Beta/styles/simple/ProgressBarStyle.qml</file>\n        <file>Beta/Slider.qml</file>\n        <file>Beta/styles/simple/SliderStyle.qml</file>\n        <file>Beta/Window.qml</file>\n        <file>Beta/Dialog.qml</file>\n        <file>Beta/MenuPopup.qml</file>\n        <file>Beta/styles/simple/DialogStyle.qml</file>\n        <file>Beta/styles/simple/MenuPopupStyle.qml</file>\n        <file>Beta/StackPage.qml</file>\n        <file>Beta/styles/simple/StackPageStyle.qml</file>\n        <file>Beta/FloatPage.qml</file>\n        <file>Beta/styles/simple/FloatPageStyle.qml</file>\n        <file>Beta/BottomDrawer.qml</file>\n        <file>Beta/styles/simple/BottomDrawerStyle.qml</file>\n        <file>Beta/Private/AbstractViewportScene.qml</file>\n        <file>Beta/Private/FreeSizeViewportScene.qml</file>\n        <file>Beta/Private/FreeGeometryViewportScene.qml</file>\n        <file>Beta/Private/SnappedViewportScene.qml</file>\n        <file>Beta/Menu.qml</file>\n        <file>Beta/styles/simple/MenuStyle.qml</file>\n        <file>Beta/MenuButton.qml</file>\n        <file>Beta/styles/simple/MenuButtonStyle.qml</file>\n        <file>Beta/ComboBox.qml</file>\n        <file>Beta/styles/simple/ComboBoxStyle.qml</file>\n        <file>Beta/styles/simple/ComboBoxPopupStyle.qml</file>\n        <file>Beta/ComboBoxDelegate.qml</file>\n        <file>Beta/styles/simple/ComboBoxDelegateStyle.qml</file>\n        <file>Beta/RowLayout.qml</file>\n        <file>Beta/ColumnLayout.qml</file>\n        <file>Beta/RadioButton.qml</file>\n        <file>Beta/styles/simple/RadioButtonStyle.qml</file>\n        <file>Beta/SwipeView.qml</file>\n        <file>Beta/styles/simple/SwipeViewStyle.qml</file>\n        <file>Beta/TabBar.qml</file>\n        <file>Beta/styles/simple/TabBarStyle.qml</file>\n        <file>Beta/TabButton.qml</file>\n        <file>Beta/styles/simple/TabButtonStyle.qml</file>\n        <file>Beta/styles/simple/FastDropShadow.qml</file>\n        <file>Beta/FooterButton.qml</file>\n        <file>Beta/styles/simple/FooterButtonStyle.qml</file>\n        <file>Beta/BusyIndicator.qml</file>\n        <file>Beta/styles/simple/BusyIndicatorStyle.qml</file>\n        <file>Beta/ScrollView.qml</file>\n        <file>Beta/ScrollBar.qml</file>\n        <file>Beta/styles/simple/ScrollBarStyle.qml</file>\n        <file>Beta/styles/simple/ScrollViewStyle.qml</file>\n        <file>Beta/DialogScene.qml</file>\n        <file>Beta/styles/simple/DialogSceneStyle.qml</file>\n        <file>Beta/MenuIcon.qml</file>\n        <file>Beta/HeaderMenuButton.qml</file>\n        <file>Beta/ViewportContainer.qml</file>\n        <file>Beta/AsemanApplication.qml</file>\n        <file>Beta/AsemanWindow.qml</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "src/asemanqml/controls_beta/qmldir",
    "content": "module AsemanQml.Controls.Beta\nclassname AsemanControlsBetaPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlcontrolsbeta\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemangraphicaleffectsplugin.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemgraphicaleffects.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemangraphicaleffectsplugin.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemgraphicaleffects.cpp\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/qmake_asemangraphicaleffects.qrc\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt5/Colorize.qml",
    "content": "import QtGraphicalEffects 1.0 as QGE\n\nQGE.Colorize {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt5/Desaturate.qml",
    "content": "import QtGraphicalEffects 1.0 as QGE\n\nQGE.Desaturate {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt5/DropShadow.qml",
    "content": "import QtGraphicalEffects 1.0 as QGE\n\nQGE.DropShadow {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt5/FastBlur.qml",
    "content": "import QtGraphicalEffects 1.0 as QGE\n\nQGE.FastBlur {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt5/LevelAdjust.qml",
    "content": "import QtGraphicalEffects 1.0 as QGE\n\nQGE.LevelAdjust {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt5/OpacityMask.qml",
    "content": "import QtGraphicalEffects 1.0 as QGE\n\nQGE.OpacityMask {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt5/RadialGradient.qml",
    "content": "import QtGraphicalEffects 1.0 as QGE\n\nQGE.RadialGradient {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt5/ThresholdMask.qml",
    "content": "import QtGraphicalEffects 1.0 as QGE\n\nQGE.ThresholdMask {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt5/qmldir",
    "content": "module AsemanQml.GraphicalEffects\nColorize 2.0 Colorize.qml\nDropShadow 2.0 DropShadow.qml\nFastBlur 2.0 FastBlur.qml\nOpacityMask 2.0 OpacityMask.qml\nThresholdMask 2.0 ThresholdMask.qml\nLevelAdjust 2.0 LevelAdjust.qml\nRadialGradient 2.0 RadialGradient.qml\nDesaturate 2.0 Desaturate.qml\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt6/Colorize.qml",
    "content": "import Qt5Compat.GraphicalEffects 6.0 as QGE\n\nQGE.Colorize {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt6/Desaturate.qml",
    "content": "import Qt5Compat.GraphicalEffects 6.0 as QGE\n\nQGE.Desaturate {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt6/DropShadow.qml",
    "content": "import Qt5Compat.GraphicalEffects 6.0 as QGE\n\nQGE.DropShadow {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt6/FastBlur.qml",
    "content": "import Qt5Compat.GraphicalEffects 6.0 as QGE\n\nQGE.FastBlur {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt6/LevelAdjust.qml",
    "content": "import Qt5Compat.GraphicalEffects 6.0 as QGE\n\nQGE.LevelAdjust {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt6/OpacityMask.qml",
    "content": "import Qt5Compat.GraphicalEffects 6.0 as QGE\n\nQGE.OpacityMask {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt6/RadialGradient.qml",
    "content": "import Qt5Compat.GraphicalEffects 6.0 as QGE\n\nQGE.RadialGradient {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt6/ThresholdMask.qml",
    "content": "import Qt5Compat.GraphicalEffects 6.0 as QGE\n\nQGE.ThresholdMask {}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/GraphicalEffects/Qt6/qmldir",
    "content": "module AsemanQml.GraphicalEffects\nColorize 2.0 Colorize.qml\nDropShadow 2.0 DropShadow.qml\nFastBlur 2.0 FastBlur.qml\nOpacityMask 2.0 OpacityMask.qml\nThresholdMask 2.0 ThresholdMask.qml\nLevelAdjust 2.0 LevelAdjust.qml\nRadialGradient 2.0 RadialGradient.qml\nDesaturate 2.0 Desaturate.qml\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/asemangraphicaleffectsplugin.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemangraphicaleffectsplugin.h\"\n\n#include \"asemanqttoolsitemgraphicaleffects.h\"\n\n#include <QDebug>\n#include <QDir>\n#include <QStringList>\n#include <QtQml>\n\n#ifdef QT_ASEMAN_EMBEDDED\nbool asemanqml_graphicaleffects_plugin_registered = AsemanGraphicalEffectsPlugin::registerStaticTypes(\"AsemanQml.GraphicalEffects\");\n#endif\n\nbool AsemanGraphicalEffectsPlugin::registerStaticTypes(const char *uri)\n{\n    Q_INIT_RESOURCE(qmake_asemangraphicaleffects);\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n    AsemanQtToolsItemGraphicalEffects::registerFiles(QStringLiteral(\":/AsemanQml/GraphicalEffects/Qt5\"), uri);\n#else\n    AsemanQtToolsItemGraphicalEffects::registerFiles(QStringLiteral(\":/AsemanQml/GraphicalEffects/Qt6\"), uri);\n#endif\n    return true;\n}\n\nvoid AsemanGraphicalEffectsPlugin::registerTypes(const char *uri)\n{\n    AsemanGraphicalEffectsPlugin::registerStaticTypes(uri);\n}\n\nvoid AsemanGraphicalEffectsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)\n{\n    QQmlExtensionPlugin::initializeEngine(engine, uri);\n    AsemanQtTools::initializeEngine(engine, uri);\n}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/asemangraphicaleffectsplugin.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANGRAPHICALEFFECTSPLUGIN_H\n#define ASEMANGRAPHICALEFFECTSPLUGIN_H\n\n#include <QQmlExtensionPlugin>\n\nclass AsemanGraphicalEffectsPlugin : public QQmlExtensionPlugin\n{\n    Q_OBJECT\n\n#ifndef QT_ASEMAN_EMBEDDED\n    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)\n#endif\n\npublic:\n    static bool registerStaticTypes(const char *uri);\n\n    void registerTypes(const char *uri);\n    void initializeEngine(QQmlEngine *engine, const char *uri);\n};\n\n#endif // ASEMANGRAPHICALEFFECTSPLUGIN_H\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/asemanqttoolsitemgraphicaleffects.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtToolsItemGraphicalEffects is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtToolsItemGraphicalEffects is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanqttoolsitemgraphicaleffects.h\"\n\n#include <qqml.h>\n#include <QHash>\n#include <QSet>\n#include <QPointer>\n#include <QFile>\n#include <QDir>\n\nstatic QStringList aseman_qt_tools_indexCache;\nstatic QString aseman_qt_tools_destination;\n\nvoid AsemanQtToolsItemGraphicalEffects::registerTypes(const char *uri, bool exportMode)\n{\n    static QSet<QByteArray> register_list;\n    if (register_list.contains(uri) && !exportMode)\n        return;\n\n    register_list.insert(uri);\n}\n\nvoid AsemanQtToolsItemGraphicalEffects::registerFiles(const QString &filesLocation, const char *uri)\n{\n    QFile file(filesLocation + QStringLiteral(\"/qmldir\"));\n    if(file.open(QFile::ReadOnly))\n    {\n        QStringList lines = QString::fromUtf8(file.readAll()).split(QStringLiteral(\"\\n\"), Qt::SkipEmptyParts);\n        file.close();\n\n        for(const QString &l: lines)\n        {\n            QStringList parts = l.trimmed().split(QStringLiteral(\" \"), Qt::SkipEmptyParts);\n            bool singleton = false;\n            if(parts.count() && parts.first() == \"singleton\")\n                singleton = parts.takeFirst().count();\n            if(parts.length() != 3)\n                continue;\n\n            QStringList version = parts.at(1).split(QStringLiteral(\".\"), Qt::SkipEmptyParts);\n            if(version.count() != 2)\n                continue;\n\n            if(singleton)\n                qmlRegisterSingletonType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                         uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n            else\n                qmlRegisterType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n        }\n    }\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemGraphicalEffects::registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemGraphicalEffects::registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportModel<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemGraphicalEffects::registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterSingletonType<T>(uri, versionMajor, versionMinor, typeName, callback);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemGraphicalEffects::registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(qmlName));\n    else\n        return qmlRegisterUncreatableType<T>(uri, versionMajor, versionMinor, qmlName, reason);\n    return 0;\n}\n\n\nvoid AsemanQtToolsItemGraphicalEffects::exportDocuments(const QString &destination)\n{\n    aseman_qt_tools_destination = destination;\n\n    QDir().mkpath(aseman_qt_tools_destination);\n    aseman_qt_tools_indexCache.clear();\n\n    AsemanQtToolsItemGraphicalEffects::registerTypes(\"AsemanToolsItem\", true);\n\n    QString index = QStringLiteral(\"# AsemanToolsItem Documents\\n\\n\");\n    index += QStringLiteral(\"### [Getting Started](gettingstarted.md)\\n\\n\");\n    index += QStringLiteral(\"### How to import:\\n\\n\");\n    index += QStringLiteral(\"```c++\\nimport AsemanQml.Base 2.0\\n```\\n\\nor\\n\\n\"\n             \"```c++\\nimport AsemanQml.Base 2.0 as Aseman\\n```\\n\\n\");\n    index += QStringLiteral(\"### Types\\n\\nHere are all components of the AsemanToolsItem:\\n\\n\");\n    for(const QString cmpnt: aseman_qt_tools_indexCache)\n    {\n        if(cmpnt == QStringLiteral(\"MimeData\"))\n            index += QStringLiteral(\"\\n##### Normal types\\n\\n\");\n        if(cmpnt == QStringLiteral(\"MixedListModel\"))\n            index += QStringLiteral(\"\\n##### GraphicalEffects\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Devices\"))\n            index += QStringLiteral(\"\\n##### Singletons\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Screen\"))\n            index += QStringLiteral(\"\\n##### Uncreatable types\\n\\n\");\n        index += QStringLiteral(\" * [%1](%2.md)\\n\").arg(cmpnt).arg(cmpnt.toLower());\n    }\n\n    QString path = aseman_qt_tools_destination + \"/start.md\";\n    aseman_qt_tools_destination.clear();\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return;\n\n    file.write(index.toUtf8());\n    file.close();\n}\n\nQString AsemanQtToolsItemGraphicalEffects::fixType(const QString &type)\n{\n    if(type == QStringLiteral(\"QSizeF\") || type == QStringLiteral(\"QSize\"))\n        return QStringLiteral(\"size\");\n    if(type == QStringLiteral(\"QPoint\") || type == QStringLiteral(\"QPointF\"))\n        return QStringLiteral(\"point\");\n    if(type == QStringLiteral(\"QUrl\"))\n        return QStringLiteral(\"url\");\n    if(type == QStringLiteral(\"QString\"))\n        return QStringLiteral(\"string\");\n    if(type == QStringLiteral(\"QByteArray\"))\n        return QStringLiteral(\"byte\");\n    if(type == QStringLiteral(\"bool\"))\n        return QStringLiteral(\"boolean\");\n    if(type == QStringLiteral(\"double\") || type == QStringLiteral(\"qreal\"))\n        return QStringLiteral(\"real\");\n    if(type == QStringLiteral(\"QVariant\"))\n        return QStringLiteral(\"variant\");\n    if(type == QStringLiteral(\"QJSValue\"))\n        return QStringLiteral(\"function(){[code]}\");\n    if(type == QStringLiteral(\"QVariantMap\"))\n        return QStringLiteral(\"map\");\n    if(type == QStringLiteral(\"QVariantList\"))\n        return QStringLiteral(\"list&lt;variant&gt;\");\n    if(type == QStringLiteral(\"QStringList\"))\n        return QStringLiteral(\"list&lt;string&gt;\");\n    if(type == QStringLiteral(\"QList<qint32>\"))\n        return QStringLiteral(\"list&lt;int&gt;\");\n    if(type.contains(QStringLiteral(\"*\")))\n    {\n        if(type == QStringLiteral(\"QObject*\"))\n            return QStringLiteral(\"object\");\n        if(type.contains(QStringLiteral(\"Telegram\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Telegram\"));\n            return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n        }\n        if(type.contains(QStringLiteral(\"Object\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Object\"));\n            return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                    .arg(name).arg(name.toLower());\n        }\n        if(type == QStringLiteral(\"QQmlComponent*\"))\n            return QStringLiteral(\"Component\");\n        if(type == QStringLiteral(\"QQuickItem\"))\n            return QStringLiteral(\"Item\");\n    }\n    if(type.contains(QStringLiteral(\"Telegram\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Telegram\"));\n        return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n    }\n    if(type == QStringLiteral(\"QQuickItem\"))\n        return QStringLiteral(\"Item\");\n    if(type == QStringLiteral(\"QObject\"))\n        return QStringLiteral(\"object\");\n    if(type.contains(QStringLiteral(\"Object\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Object\"));\n        return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                .arg(name).arg(name.toLower());\n    }\n    return type;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemGraphicalEffects::exportItem(const QString &module, int major, int minor, const QString &component, bool store)\n{\n    QString result;\n    aseman_qt_tools_indexCache << component;\n\n    QMetaObject meta = T::staticMetaObject;\n    QString inherits = fixType(QString::fromUtf8(meta.superClass()? meta.superClass()->className() : \"\"));\n    bool isModel = component.toLower().contains(QStringLiteral(\"model\"));\n\n    result += QStringLiteral(\"# %1\\n\\n\").arg(component);\n\n    QString headers;\n    headers += QStringLiteral(\" * [Component details](#component-details)\\n\");\n\n    QString details = QStringLiteral(\"\\n### Component details:\\n\\n\");\n    details += QStringLiteral(\"|Detail|Value|\\n\"\n                       \"|------|-----|\\n\");\n    details += QStringLiteral(\"|%1|%2 %3.%4|\\n\").arg(QStringLiteral(\"Import\")).arg(module).arg(major).arg(minor);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Component\")).arg(component);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"C++ class\")).arg(QString::fromUtf8(meta.className()));\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Inherits\")).arg(inherits);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Model\")).arg(QString::fromUtf8(isModel?\"Yes\":\"No\"));\n\n    QString resultProperties;\n    QStringList propertiesSignals;\n    for(int i=0; i<meta.propertyCount(); i++)\n    {\n        QMetaProperty property = meta.property(i);\n        const QString &propertyName = QString::fromUtf8(property.name());\n        const QString &propertyType = fixType(QString::fromUtf8(property.typeName()));\n        propertiesSignals << QString::fromUtf8(property.notifySignal().name());\n\n        QString text = QStringLiteral(\"* <font color='#074885'><b>%1</b></font>: %2\").arg(propertyName).arg(propertyType);\n        if(!property.isWritable())\n            text += QStringLiteral(\" (readOnly)\");\n\n        text += QStringLiteral(\"\\n\");\n        if(meta.propertyOffset()<=i)\n            resultProperties += text;\n    }\n\n    QString enumResults;\n    for(int i=meta.enumeratorOffset(); i<meta.enumeratorCount(); i++)\n    {\n        QMetaEnum enumerator = meta.enumerator(i);\n        const QString &enumName = QString::fromUtf8(enumerator.name());\n\n        enumResults += QStringLiteral(\"\\n##### %1\\n\\n\").arg(enumName);\n        enumResults += QStringLiteral(\"|Key|Value|\\n\"\n                               \"|---|-----|\\n\");\n\n        for(int j=0; j<enumerator.keyCount(); j++)\n            enumResults += QStringLiteral(\"|%1|%2|\\n\").arg(QString::fromUtf8(enumerator.key(j))).arg(enumerator.value(j));\n    }\n\n    QString resultSlots;\n    QString resultSignals;\n    for(int i=meta.methodOffset(); i<meta.methodCount(); i++)\n    {\n        QMetaMethod method = meta.method(i);\n        if(method.access() != QMetaMethod::Public)\n            continue;\n\n        const QString &methodName = QString::fromUtf8(method.name());\n        if(propertiesSignals.contains(methodName))\n            continue;\n\n        const QString &methodType = fixType(QString::fromUtf8(method.typeName()));\n\n        QString args;\n        const QList<QByteArray> &paramNames = method.parameterNames();\n        const QList<QByteArray> &paramTypes = method.parameterTypes();\n        for(int j=0; j<paramNames.count(); j++)\n        {\n            if(j != 0)\n                args += QStringLiteral(\", \");\n\n            args += fixType(QString::fromUtf8(paramTypes[j])) + QStringLiteral(\" \") + paramNames[j];\n        }\n\n        QString text = QStringLiteral(\" * %1 <font color='#074885'><b>%2</b></font>(%3)\\n\").arg(methodType).arg(methodName).arg(args);\n        switch(static_cast<int>(method.methodType()))\n        {\n        case QMetaMethod::Slot:\n            resultSlots += text;\n            break;\n        case QMetaMethod::Signal:\n            resultSignals += text;\n            break;\n        }\n    }\n\n    if(!resultProperties.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Normal Properties](#normal-properties)\\n\");\n        resultProperties = QStringLiteral(\"\\n### Normal Properties\\n\\n\") + resultProperties;\n    }\n    if(!enumResults.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Enumerator](#enumerator)\\n\");\n        enumResults = QStringLiteral(\"\\n### Enumerator\\n\\n\") + enumResults;\n    }\n    if(!resultSlots.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Methods](#methods)\\n\");\n        resultSlots = QStringLiteral(\"\\n### Methods\\n\\n\") + resultSlots;\n    }\n    if(!resultSignals.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Signals](#Q_SIGNALS)\\n\");\n        resultSignals = QStringLiteral(\"\\n### Signals\\n\\n\") + resultSignals;\n    }\n    if(isModel)\n        headers += QStringLiteral(\" * [Roles](#roles)\\n\");\n\n    result += headers + QStringLiteral(\"\\n\");\n    result += details + QStringLiteral(\"\\n\");\n    result += resultProperties + QStringLiteral(\"\\n\");\n    result += resultSlots + QStringLiteral(\"\\n\");\n    result += resultSignals + QStringLiteral(\"\\n\");\n    result += enumResults + QStringLiteral(\"\\n\");\n\n    if(!store)\n        return result;\n\n    QString path = aseman_qt_tools_destination + QStringLiteral(\"/\") + component.toLower() + QStringLiteral(\".md\");\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemGraphicalEffects::exportModel(const QString &module, int major, int minor, const QString &component)\n{\n    QString result = exportItem<T>(module, major, minor, component, false);\n    T *model = new T();\n\n    QHash<qint32,QByteArray> roleNames = model->roleNames();\n    QMap<qint32,QByteArray> rolesMap;\n    QHashIterator<qint32,QByteArray> i(roleNames);\n    while(i.hasNext())\n    {\n        i.next();\n        rolesMap[i.key()] = i.value();\n    }\n\n    result += QStringLiteral(\"\\n### Roles\\n\\n\");\n    Q_FOREACH(const QByteArray &name, rolesMap)\n        result += QStringLiteral(\" * model.<font color='#074885'>%1</font>\\n\").arg(QString::fromUtf8(name));\n\n    delete model;\n\n    QString path = aseman_qt_tools_destination + \"/\" + component.toLower() + \".md\";\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/asemanqttoolsitemgraphicaleffects.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQTTOOLSITEMGRAPHICALEFFECTS_H\n#define ASEMANQTTOOLSITEMGRAPHICALEFFECTS_H\n\n#include <QtGlobal>\n#include <QString>\n\n#include <asemanqttools.h>\n\nclass QObject;\nclass QQmlEngine;\nclass QJSEngine;\nclass AsemanQtToolsItemGraphicalEffects: public AsemanQtTools\n{\npublic:\n    static void registerTypes(const char *uri, bool exportMode = false);\n    static void registerFiles(const QString &filesLocation, const char *uri);\n\n    template<typename T>\n    static int registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template<typename T>\n    static int registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template <typename T>\n    static int registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName,\n                                 QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode);\n\n    template<typename T>\n    static int registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason, bool exportMode);\n\n    static void exportDocuments(const QString &destination);\n\nprotected:\n    template<typename T>\n    static QString exportItem(const QString &module, int major, int minor, const QString &component, bool store = true);\n    template<typename T>\n    static QString exportModel(const QString &module, int major, int minor, const QString &component);\n\n    static QString fixType(const QString &type);\n};\n\n#endif // ASEMANQTTOOLSITEMGRAPHICALEFFECTS_H\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/graphicaleffects.pri",
    "content": "INCLUDEPATH += $$PWD\nQT += core gui quick\n\nHEADERS += \\\n    $$PWD/asemangraphicaleffectsplugin.h \\\n    $$PWD/asemanqttoolsitemgraphicaleffects.h\n\nSOURCES += \\\n    $$PWD/asemangraphicaleffectsplugin.cpp \\\n    $$PWD/asemanqttoolsitemgraphicaleffects.cpp\n\nstatic: !linux: !win32: DEFINES += ASEMAN_STATIC_BUILD\n\ngreaterThan(QT_MAJOR_VERSION, 5) {\n    ASEMAN_QML_FILES = $$files($$PWD/GraphicalEffects/Qt6/*.*) $$PWD/GraphicalEffects/Qt6/qmldir\n} else {\n    ASEMAN_QML_FILES = $$files($$PWD/GraphicalEffects/Qt5/*.*) $$PWD/GraphicalEffects/Qt5/qmldir\n}\n\nINCLUDED_RESOURCE_FILES = \\\n    $$ASEMAN_QML_FILES\n\nasemangraphicaleffects.files = $$INCLUDED_RESOURCE_FILES\nasemangraphicaleffects.prefix = /AsemanQml/\n\ncontains(DEFINES, QT_ASEMAN_EMBEDDED) {\n    RESOURCES += $$PWD/qmake_asemangraphicaleffects.qrc\n} else {\n    RESOURCES += asemangraphicaleffects\n}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/graphicaleffects.pro",
    "content": "TARGET  = asemanqmlgraphicalffects\nTARGETPATH = AsemanQml/GraphicalEffects\nIMPORT_VERSION = 2.0\n\nQT += asemanqml asemangui asemancore\ninclude(graphicaleffects.pri)\n\nload(qml_plugin)\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.GraphicalEffects 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.0\"]\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.GraphicalEffects/Colorize 2.0\"\n        exports: [\"AsemanQml.GraphicalEffects/Colorize 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"source\"; type: \"QVariant\" }\n        Property { name: \"hue\"; type: \"double\" }\n        Property { name: \"saturation\"; type: \"double\" }\n        Property { name: \"lightness\"; type: \"double\" }\n        Property { name: \"cached\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.GraphicalEffects/DropShadow 2.0\"\n        exports: [\"AsemanQml.GraphicalEffects/DropShadow 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"fast\"; type: \"bool\" }\n        Property { name: \"source\"; type: \"QVariant\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"samples\"; type: \"int\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"horizontalOffset\"; type: \"double\" }\n        Property { name: \"verticalOffset\"; type: \"double\" }\n        Property { name: \"spread\"; type: \"double\" }\n        Property { name: \"cached\"; type: \"bool\" }\n        Property { name: \"transparentBorder\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.GraphicalEffects/FastBlur 2.0\"\n        exports: [\"AsemanQml.GraphicalEffects/FastBlur 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"source\"; type: \"QVariant\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"transparentBorder\"; type: \"bool\" }\n        Property { name: \"cached\"; type: \"bool\" }\n        Property { name: \"__internalBlurVertexShader\"; type: \"string\" }\n        Property { name: \"__internalBlurFragmentShader\"; type: \"string\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.GraphicalEffects/OpacityMask 2.0\"\n        exports: [\"AsemanQml.GraphicalEffects/OpacityMask 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"source\"; type: \"QVariant\" }\n        Property { name: \"maskSource\"; type: \"QVariant\" }\n        Property { name: \"cached\"; type: \"bool\" }\n        Property { name: \"invert\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.GraphicalEffects/ThresholdMask 2.0\"\n        exports: [\"AsemanQml.GraphicalEffects/ThresholdMask 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"source\"; type: \"QVariant\" }\n        Property { name: \"maskSource\"; type: \"QVariant\" }\n        Property { name: \"threshold\"; type: \"double\" }\n        Property { name: \"spread\"; type: \"double\" }\n        Property { name: \"cached\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.GraphicalEffects/RadialGradient 2.0\"\n        exports: [\"AsemanQml.GraphicalEffects/RadialGradient 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"source\"; type: \"QVariant\" }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/qmake_asemangraphicaleffects.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/AsemanQml\">\n        <file>GraphicalEffects/Qt5/Colorize.qml</file>\n        <file>GraphicalEffects/Qt5/DropShadow.qml</file>\n        <file>GraphicalEffects/Qt5/FastBlur.qml</file>\n        <file>GraphicalEffects/Qt5/OpacityMask.qml</file>\n        <file>GraphicalEffects/Qt5/qmldir</file>\n        <file>GraphicalEffects/Qt5/ThresholdMask.qml</file>\n        <file>GraphicalEffects/Qt5/LevelAdjust.qml</file>\n        <file>GraphicalEffects/Qt5/RadialGradient.qml</file>\n        <file>GraphicalEffects/Qt5/Desaturate.qml</file>\n        <file>GraphicalEffects/Qt6/Colorize.qml</file>\n        <file>GraphicalEffects/Qt6/DropShadow.qml</file>\n        <file>GraphicalEffects/Qt6/FastBlur.qml</file>\n        <file>GraphicalEffects/Qt6/OpacityMask.qml</file>\n        <file>GraphicalEffects/Qt6/qmldir</file>\n        <file>GraphicalEffects/Qt6/ThresholdMask.qml</file>\n        <file>GraphicalEffects/Qt6/LevelAdjust.qml</file>\n        <file>GraphicalEffects/Qt6/RadialGradient.qml</file>\n        <file>GraphicalEffects/Qt6/Desaturate.qml</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "src/asemanqml/graphicaleffects/qmldir",
    "content": "module AsemanQml.GraphicalEffects\nclassname AsemanGraphicalEffectsPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlgraphicalffects\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Awesome/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Awesome 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.8\"]\n    Component {\n        prototype: \"QObject\"\n        name: \"AsemanQml.Awesome/Awesome 2.0\"\n        exports: [\"AsemanQml.Awesome/Awesome 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        isCreatable: false\n        isSingleton: true\n        defaultProperty: \"items\"\n        Property { name: \"family\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_500px\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_accessible_ico\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_accusoft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_acquisitions_incorporated\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_address_book\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_address_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_adjust\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_adn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_adobe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_adversal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_affiliatetheme\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_air_freshener\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_algolia\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_align_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_align_justify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_align_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_align_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_alipay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_allergies\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_amazon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_amazon_pay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ambulance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_american_sign_language_interpreting\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_amilia\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_anchor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_android\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angellist\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_double_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_double_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_double_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_double_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angle_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angrycreative\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_angular\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ankh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_app_store\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_app_store_ios\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_apper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_apple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_apple_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_apple_pay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_archive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_archway\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_alt_circle_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_alt_circle_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_alt_circle_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_alt_circle_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_circle_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_circle_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_circle_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_circle_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrow_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrows_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrows_alt_h\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_arrows_alt_v\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_artstation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_assistive_listening_systems\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_asterisk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_asymmetrik\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_at\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_atlas\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_atlassian\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_atom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_audible\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_audio_description\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_autoprefixer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_avianex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_aviato\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_award\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_aws\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_baby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_baby_carriage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_backspace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_backward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bacon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_balance_scale\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ban\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_band_aid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bandcamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_barcode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bars\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_baseball_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_basketball_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_battery_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_battery_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_battery_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_battery_quarter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_battery_three_quarters\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_beer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_behance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_behance_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bell_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bezier_curve\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bible\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bicycle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bimobject\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_binoculars\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_biohazard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_birthday_cake\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bitbucket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bitcoin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_black_tie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_blackberry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_blender\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_blender_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_blind\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_blog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_blogger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_blogger_b\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bluetooth_b\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bolt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bomb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bong\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_book\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_book_dead\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_book_medical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_book_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_book_reader\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bookmark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bowling_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_box_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_boxes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_braille\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_brain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bread_slice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_briefcase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_briefcase_medical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_broadcast_tower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_broom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_brush\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_btc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bug\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_building\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bullhorn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bullseye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_burn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_buromobelexperte\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_bus_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_business_time\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_buysellads\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calculator\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar_day\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar_times\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_calendar_week\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_camera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_camera_retro\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_campground\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_canadian_maple_leaf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_candy_cane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cannabis\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_capsules\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_car\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_car_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_car_battery\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_car_crash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_car_side\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_square_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_square_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_square_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_square_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_caret_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_carrot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cart_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cart_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cash_register\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_amazon_pay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_amex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_apple_pay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_diners_club\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_discover\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_jcb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_mastercard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_paypal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_stripe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cc_visa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_centercode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_centos\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_certificate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chair\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chalkboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chalkboard_teacher\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_charging_station\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chart_area\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chart_bar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chart_line\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chart_pie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_check_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_check_double\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_check_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cheese\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess_bishop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess_board\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess_king\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess_knight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess_pawn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess_queen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chess_rook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_circle_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_circle_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_circle_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_circle_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chevron_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_child\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_chrome\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_church\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_circle_notch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_city\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_clinic_medical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_clipboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_clipboard_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_clipboard_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_clone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_closed_captioning\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_download_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_meatball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_moon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_moon_rain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_rain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_showers_heavy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_sun\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_sun_rain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloud_upload_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloudscale\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloudsmith\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cloudversify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cocktail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_code\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_code_branch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_codepen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_codiepie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_coffee\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cogs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_coins\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_columns\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comment_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comment_dollar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comment_dots\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comment_medical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comment_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comments\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_comments_dollar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_compact_disc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_compass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_compress\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_compress_arrows_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_concierge_bell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_confluence\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_connectdevelop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_contao\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cookie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cookie_bite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_copy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_copyright\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_couch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cpanel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_by\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_nc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_nc_eu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_nc_jp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_nd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_pd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_pd_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_remix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_sa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_sampling\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_sampling_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_share\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_creative_commons_zero\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_credit_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_critical_role\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_crop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_crop_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cross\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_crosshairs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_crow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_crown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_crutch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_css3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_css3_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cube\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cubes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cut\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_cuttlefish\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_d_and_d\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_d_and_d_beyond\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dashcube\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_database\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_deaf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_delicious\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_democrat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_deploydog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_deskpro\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_desktop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dev\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_deviantart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dharmachakra\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dhl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_diagnoses\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_diaspora\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_d20\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_d6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_five\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_four\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_one\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_six\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_three\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dice_two\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_digg\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_digital_ocean\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_digital_tachograph\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_directions\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_discord\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_discourse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_divide\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dizzy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dna\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dochub\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_docker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dollar_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dolly\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dolly_flatbed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_donate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_door_closed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_door_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dot_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_draft2digital\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_drafting_compass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dragon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_draw_polygon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dribbble\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dribbble_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dropbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_drum\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_drum_steelpan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_drumstick_bite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_drupal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dumbbell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dumpster\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dumpster_fire\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dungeon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_dyalog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_earlybirds\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ebay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_edge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_egg\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_eject\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_elementor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ellipsis_h\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ellipsis_v\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ello\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ember\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_empire\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_envelope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_envelope_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_envelope_open_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_envelope_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_envira\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_equals\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_eraser\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_erlang\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ethereum\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ethernet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_etsy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_euro_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_exchange_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_exclamation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_exclamation_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_exclamation_triangle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_expand\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_expand_arrows_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_expeditedssl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_external_link_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_external_link_square_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_eye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_eye_dropper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_eye_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_facebook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_facebook_f\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_facebook_messenger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_facebook_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fantasy_flight_games\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fast_backward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fast_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fax\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_feather\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_feather_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fedex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fedora\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_female\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fighter_jet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_figma\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_archive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_audio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_code\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_contract\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_csv\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_excel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_import\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_invoice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_invoice_dollar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_medical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_medical_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_pdf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_powerpoint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_prescription\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_signature\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_file_word\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fill_drip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_film\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_filter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fingerprint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fire\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fire_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fire_extinguisher\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_firefox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_first_aid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_first_order\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_first_order_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_firstdraft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fish\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fist_raised\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_flag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_flag_checkered\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_flag_usa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_flask\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_flickr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_flipboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_flushed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fly\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_folder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_folder_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_folder_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_folder_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_font\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_font_awesome\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_font_awesome_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_font_awesome_flag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_font_awesome_logo_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fonticons\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fonticons_fi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_football_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fort_awesome\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fort_awesome_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_forumbee\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_foursquare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_free_code_camp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_freebsd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_frog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_frown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_frown_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_fulcrum\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_funnel_dollar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_futbol\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_galactic_republic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_galactic_senate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gamepad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gas_pump\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gavel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gem\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_genderless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_get_pocket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gg\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gg_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ghost\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gift\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gifts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_git\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_git_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_github\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_github_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_github_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gitkraken\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gitlab\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gitter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_glass_cheers\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_glass_martini\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_glass_martini_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_glass_whiskey\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_glasses\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_glide\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_glide_g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_globe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_globe_africa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_globe_americas\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_globe_asia\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_globe_europe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gofore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_golf_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_goodreads\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_goodreads_g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_google\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_google_drive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_google_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_google_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_google_plus_g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_google_plus_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_google_wallet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gopuram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_graduation_cap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gratipay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grav\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_greater_than\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_greater_than_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grimace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_beam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_beam_sweat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_hearts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_squint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_squint_tears\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_stars\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_tears\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_tongue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_tongue_squint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_tongue_wink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grin_wink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grip_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grip_lines\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grip_lines_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grip_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gripfire\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_grunt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_guitar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_gulp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_h_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hacker_news\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hacker_news_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hackerrank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hamburger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hammer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hamsa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_holding\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_holding_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_holding_usd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_lizard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_middle_finger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_paper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_peace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_point_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_point_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_point_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_point_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_pointer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_rock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_scissors\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hand_spock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hands\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hands_helping\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_handshake\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hanukiah\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hard_hat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hashtag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hat_wizard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_haykal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hdd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_heading\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_headphones\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_headphones_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_headset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_heart_broken\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_heartbeat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_helicopter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_highlighter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hiking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hippo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hips\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hire_a_helper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_history\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hockey_puck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_holly_berry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_home\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hooli\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hornbill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_horse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_horse_head\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hospital\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hospital_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hospital_symbol\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hot_tub\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hotdog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hotel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hotjar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hourglass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hourglass_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hourglass_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hourglass_start\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_house_damage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_houzz\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hryvnia\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_html5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_hubspot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_i_cursor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ice_cream\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_icicles\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_id_badge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_id_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_id_card_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_igloo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_images\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_imdb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_inbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_indent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_industry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_infinity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_info\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_info_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_instagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_intercom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_internet_explorer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_invision\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ioxhost\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_italic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_itunes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_itunes_note\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_java\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_jedi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_jedi_order\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_jenkins\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_jira\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_joget\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_joint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_joomla\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_journal_whills\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_js\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_js_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_jsfiddle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kaaba\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kaggle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_keybase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_keyboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_keycdn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_khanda\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kickstarter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kickstarter_k\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kiss\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kiss_beam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kiss_wink_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_kiwi_bird\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_korvue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_landmark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_language\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laptop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laptop_code\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laptop_medical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laravel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lastfm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lastfm_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laugh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laugh_beam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laugh_squint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_laugh_wink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_layer_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_leaf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_leanpub\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lemon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_less\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_less_than\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_less_than_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_level_down_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_level_up_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_life_ring\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lightbulb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_line\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_link\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_linkedin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_linkedin_in\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_linode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_linux\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lira_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_list_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_list_ol\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_list_ul\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_location_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lock_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_long_arrow_alt_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_long_arrow_alt_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_long_arrow_alt_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_long_arrow_alt_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_low_vision\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_luggage_cart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_lyft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_magento\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_magic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_magnet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mail_bulk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mailchimp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_male\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mandalorian\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_map\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_map_marked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_map_marked_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_map_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_map_marker_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_map_pin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_map_signs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_markdown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mars\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mars_double\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mars_stroke\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mars_stroke_h\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mars_stroke_v\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mask\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mastodon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_maxcdn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_medal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_medapps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_medium_m\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_medkit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_medrt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_meetup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_megaport\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_meh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_meh_blank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_meh_rolling_eyes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_memory\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mendeley\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_menorah\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mercury\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_meteor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_microchip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_microphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_microphone_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_microphone_alt_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_microphone_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_microscope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_microsoft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_minus_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_minus_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mitten\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mixcloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mizuni\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mobile\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mobile_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_modx\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_monero\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_money_bill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_money_bill_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_money_bill_wave\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_money_bill_wave_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_money_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_money_check_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_monument\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_moon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mortar_pestle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mosque\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_motorcycle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mountain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mouse_pointer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_mug_hot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_napster\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_neos\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_network_wired\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_neuter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_newspaper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_nimblr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_nintendo_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_node\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_node_js\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_not_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_notes_medical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_npm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ns8\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_nutritionix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_object_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_object_ungroup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_odnoklassniki\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_odnoklassniki_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_oil_can\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_old_republic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_om\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_opencart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_openid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_opera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_optin_monster\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_osi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_otter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_outdent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_page4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pagelines\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pager\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paint_brush\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paint_roller\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_palette\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_palfed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pallet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paper_plane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paperclip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_parachute_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paragraph\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_parking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_passport\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pastafarianism\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paste\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_patreon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pause\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pause_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paw\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_paypal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_peace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pen_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pen_fancy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pen_nib\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pen_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pencil_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pencil_ruler\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_penny_arcade\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_people_carry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pepper_hot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_percent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_percentage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_periscope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_person_booth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_phabricator\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_phoenix_framework\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_phoenix_squadron\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_phone_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_phone_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_phone_volume\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_php\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pied_piper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pied_piper_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pied_piper_hat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pied_piper_pp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_piggy_bank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pills\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pinterest\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pinterest_p\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pinterest_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pizza_slice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_place_of_worship\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_plane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_plane_arrival\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_plane_departure\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_play_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_playstation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_plug\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_plus_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_plus_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_podcast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_poll\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_poll_h\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_poo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_poo_storm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_poop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pound_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_power_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pray\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_praying_hands\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_prescription\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_prescription_bottle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_prescription_bottle_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_print\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_procedures\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_product_hunt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_project_diagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_pushed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_puzzle_piece\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_python\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_qq\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_qrcode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_question\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_question_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_quidditch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_quinscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_quora\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_quote_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_quote_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_quran\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_r_project\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_radiation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_radiation_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rainbow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_random\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_raspberry_pi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ravelry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_react\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_reacteurope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_readme\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rebel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_receipt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_recycle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_red_river\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_reddit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_reddit_alien\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_reddit_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_redhat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_redo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_redo_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_registered\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_renren\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_reply\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_reply_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_replyd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_republican\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_researchgate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_resolving\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_restroom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_retweet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rev\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ribbon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ring\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_road\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_robot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rocket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rocketchat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rockrms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_route\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rss\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rss_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ruble_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ruler\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ruler_combined\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ruler_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ruler_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_running\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_rupee_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sad_cry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sad_tear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_safari\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_satellite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_satellite_dish\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_save\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_schlix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_school\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_screwdriver\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_scribd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_scroll\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sd_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_search_dollar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_search_location\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_search_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_search_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_searchengin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_seedling\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sellcast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sellsy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_server\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_servicestack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shapes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_share\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_share_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_share_alt_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_share_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shekel_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shield_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ship\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shipping_fast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shirtsinbulk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shoe_prints\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shopping_bag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shopping_basket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shopping_cart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shopware\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_shuttle_van\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sign_in_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sign_language\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sign_out_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_signal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_signature\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sim_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_simplybuilt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sistrix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sitemap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sith\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_skating\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sketch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_skiing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_skiing_nordic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_skull\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_skull_crossbones\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_skyatlas\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_skype\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_slack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_slack_hash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sleigh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sliders_h\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_slideshare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_smile\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_smile_beam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_smile_wink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_smog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_smoking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_smoking_ban\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_snapchat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_snapchat_ghost\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_snapchat_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_snowboarding\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_snowflake\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_snowman\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_snowplow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_socks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_solar_panel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_alpha_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_alpha_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_amount_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_amount_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_numeric_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_numeric_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sort_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_soundcloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sourcetree\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_spa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_space_shuttle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_speakap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_spider\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_spinner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_splotch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_spotify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_spray_can\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_square_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_square_root_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_squarespace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stack_exchange\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stack_overflow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_star_and_crescent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_star_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_star_half_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_star_of_david\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_star_of_life\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_staylinked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_steam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_steam_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_steam_symbol\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_step_backward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_step_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stethoscope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sticker_mule\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sticky_note\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stop_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stopwatch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_store\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_store_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_strava\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stream\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_street_view\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_strikethrough\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stripe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stripe_s\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stroopwafel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_studiovinari\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stumbleupon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_stumbleupon_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_subscript\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_subway\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_suitcase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_suitcase_rolling\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sun\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_superpowers\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_superscript\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_supple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_surprise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_suse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_swatchbook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_swimmer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_swimming_pool\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_synagogue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sync\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_sync_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_syringe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_table\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_table_tennis\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tablet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tablet_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tablets\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tachometer_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tags\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tasks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_taxi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_teamspeak\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_teeth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_teeth_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_telegram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_telegram_plane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_temperature_high\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_temperature_low\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tencent_weibo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tenge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_terminal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_text_height\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_text_width\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_th\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_th_large\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_th_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_the_red_yeti\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_theater_masks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_themeco\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_themeisle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thermometer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thermometer_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thermometer_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thermometer_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thermometer_quarter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thermometer_three_quarters\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_think_peaks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thumbs_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thumbs_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_thumbtack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ticket_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_times\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_times_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tint_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tired\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_toggle_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_toggle_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_toilet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_toilet_paper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_toolbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tools\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_torah\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_torii_gate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tractor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trade_federation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trademark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_traffic_light\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_train\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_transgender\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_transgender_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trash_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trash_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trash_restore_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tree\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trello\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tripadvisor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_trophy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_truck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_truck_loading\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_truck_monster\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_truck_moving\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_truck_pickup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tshirt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tumblr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tumblr_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_tv\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_twitch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_twitter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_twitter_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_typo3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_uber\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ubuntu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_uikit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_umbrella\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_umbrella_beach\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_underline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_undo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_undo_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_uniregistry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_universal_access\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_university\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_unlink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_unlock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_unlock_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_untappd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ups\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_usb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_alt_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_astronaut\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_cog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_friends\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_graduate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_injured\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_md\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_ninja\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_nurse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_secret\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_shield\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_tag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_tie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_user_times\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_users\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_users_cog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_usps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_ussunnah\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_utensil_spoon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_utensils\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vaadin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vector_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_venus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_venus_double\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_venus_mars\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_viacoin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_viadeo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_viadeo_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vial\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vials\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_viber\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_video_slash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vihara\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vimeo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vimeo_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vimeo_v\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vnv\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_volleyball_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_volume_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_volume_mute\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_volume_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_volume_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vote_yea\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vr_cardboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_vuejs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_walking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wallet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_warehouse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_water\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_weebly\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_weibo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_weight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_weight_hanging\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_weixin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_whatsapp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_whatsapp_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wheelchair\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_whmcs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wifi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wikipedia_w\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wind\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_window_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_window_maximize\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_window_minimize\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_window_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_windows\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wine_bottle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wine_glass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wine_glass_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wizards_of_the_coast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wolf_pack_battalion\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_won_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wordpress\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wordpress_simple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wpbeginner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wpexplorer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wpforms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wpressr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_wrench\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_x_ray\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_xbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_xing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_xing_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_y_combinator\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yahoo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yandex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yandex_international\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yarn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yelp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yen_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yin_yang\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_yoast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_youtube\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_youtube_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fa_zhihu\"; type: \"string\"; isReadonly: true }\n        Method { name: \"init\"; type: \"QVariant\" }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Awesome/qmldir",
    "content": "module AsemanQml.Awesome\nclassname AsemanAwesomePlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlawesome\n\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Base/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Base 2.0'\n\nModule {\n    dependencies: [\n        \"QtGraphicalEffects 1.12\",\n        \"QtQml 2.7\",\n        \"QtQml.Models 2.2\",\n        \"QtQml.WorkerScript 2.15\",\n        \"QtQuick 2.9\",\n        \"QtQuick.Controls 2.5\",\n        \"QtQuick.Controls.Fusion 2.15\",\n        \"QtQuick.Controls.Fusion.impl 2.15\",\n        \"QtQuick.Controls.IOSStyle 2.12\",\n        \"QtQuick.Controls.IOSStyle.impl 2.12\",\n        \"QtQuick.Controls.Imagine 2.15\",\n        \"QtQuick.Controls.Imagine.impl 2.15\",\n        \"QtQuick.Controls.Material 2.15\",\n        \"QtQuick.Controls.Material.impl 2.15\",\n        \"QtQuick.Controls.Styles 1.4\",\n        \"QtQuick.Controls.Styles.Plasma 2.0\",\n        \"QtQuick.Controls.Universal 2.15\",\n        \"QtQuick.Controls.Universal.impl 2.15\",\n        \"QtQuick.Controls.impl 2.15\",\n        \"QtQuick.Extras 1.4\",\n        \"QtQuick.Layouts 1.4\",\n        \"QtQuick.Templates 2.5\",\n        \"QtQuick.Window 2.6\",\n        \"org.kde.kconfig 1.0\",\n        \"org.kde.kirigami 2.9\",\n        \"org.kde.kquickcontrolsaddons 2.0\",\n        \"org.kde.plasma.components 3.0\",\n        \"org.kde.plasma.core 2.0\",\n        \"org.kde.plasma.extras 2.0\"\n    ]\n    Component {\n        name: \"AsemanApplication\"\n        prototype: \"QObject\"\n        Enum {\n            name: \"ApplicationType\"\n            values: {\n                \"NoneApplication\": 0,\n                \"GuiApplication\": 1,\n                \"CoreApplication\": 2\n            }\n        }\n        Enum {\n            name: \"ApplicationState\"\n            values: {\n                \"ApplicationSuspended\": 0,\n                \"ApplicationHidden\": 1,\n                \"ApplicationInactive\": 2,\n                \"ApplicationActive\": 4\n            }\n        }\n        Property { name: \"homePath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"startPath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"appPath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"appFilePath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"logPath\"; type: \"string\" }\n        Property { name: \"confsPath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"tempPath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"backupsPath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"cameraPath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"appType\"; type: \"int\"; isReadonly: true }\n        Property { name: \"isDebug\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"globalFont\"; type: \"QFont\" }\n        Property { name: \"applicationName\"; type: \"string\" }\n        Property { name: \"applicationVersion\"; type: \"string\" }\n        Property { name: \"organizationName\"; type: \"string\" }\n        Property { name: \"organizationDomain\"; type: \"string\" }\n        Property { name: \"applicationAbout\"; type: \"string\" }\n        Property { name: \"qpaNoTextHandles\"; type: \"bool\" }\n        Property { name: \"windowIcon\"; type: \"QUrl\" }\n        Property { name: \"applicationState\"; type: \"int\"; isReadonly: true }\n        Property { name: \"applicationDisplayName\"; type: \"string\" }\n        Property { name: \"platformName\"; type: \"string\"; isReadonly: true }\n        Property { name: \"quitOnLastWindowClosed\"; type: \"bool\" }\n        Signal { name: \"fakeSignal\" }\n        Signal { name: \"globalFontFamilyChanged\" }\n        Signal { name: \"globalMonoFontFamilyChanged\" }\n        Signal { name: \"languageUpdated\" }\n        Signal { name: \"backRequest\" }\n        Signal { name: \"clickedOnDock\" }\n        Signal { name: \"lastWindowClosed\" }\n        Method { name: \"refreshTranslations\" }\n        Method { name: \"back\" }\n        Method { name: \"exec\"; type: \"int\" }\n        Method {\n            name: \"exit\"\n            Parameter { name: \"retcode\"; type: \"int\" }\n        }\n        Method { name: \"exit\" }\n        Method {\n            name: \"sleep\"\n            Parameter { name: \"ms\"; type: \"qulonglong\" }\n        }\n        Method {\n            name: \"setSetting\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"readSetting\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"defaultValue\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"readSetting\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanApplicationItem\"\n        defaultProperty: \"items\"\n        prototype: \"AsemanApplication\"\n        exports: [\"AsemanQml.Base/AsemanApplicationBase 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"StatusBarStyles\"\n            values: {\n                \"StatusBarStyleLight\": 0,\n                \"StatusBarStyleDark\": 1,\n                \"StatusBarStyleAuto\": 2\n            }\n        }\n        Property { name: \"proxy\"; type: \"AsemanNetworkProxy\"; isPointer: true }\n        Property { name: \"applicationId\"; type: \"string\" }\n        Property { name: \"isRunning\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"statusBarStyle.qml\"; type: \"int\" }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Signal {\n            name: \"messageReceived\"\n            Parameter { name: \"msg\"; type: \"string\" }\n        }\n        Method {\n            name: \"sendMessage\"\n            Parameter { name: \"msg\"; type: \"string\" }\n        }\n        Method {\n            name: \"checkPermissions\"\n            type: \"bool\"\n            Parameter { name: \"persmission\"; type: \"string\" }\n        }\n        Method {\n            name: \"requestPermissions\"\n            type: \"QVariantMap\"\n            Parameter { name: \"persmissions\"; type: \"QStringList\" }\n            Parameter { name: \"callback\"; type: \"QJSValue\" }\n        }\n    }\n    Component {\n        name: \"AsemanApplicationSingleton\"\n        defaultProperty: \"items\"\n        prototype: \"AsemanApplicationItem\"\n        exports: [\"AsemanQml.Base/AsemanApp 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n    }\n    Component {\n        name: \"AsemanAutoStartManager\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/AutoStartManager 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"command\"; type: \"string\" }\n        Property { name: \"comment\"; type: \"string\" }\n        Property { name: \"source\"; type: \"string\" }\n        Property { name: \"name\"; type: \"string\" }\n        Property { name: \"type\"; type: \"string\" }\n        Property { name: \"active\"; type: \"bool\" }\n        Method { name: \"refresh\" }\n        Method { name: \"save\" }\n    }\n    Component {\n        name: \"AsemanBackHandler\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/BackHandler 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Property { name: \"topHandlerObject\"; type: \"QObject\"; isReadonly: true; isPointer: true }\n        Property { name: \"topHandlerMethod\"; type: \"QJSValue\"; isReadonly: true }\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Signal { name: \"topHandlerChanged\" }\n        Signal { name: \"backFinished\" }\n        Method {\n            name: \"pushHandler\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"jsv\"; type: \"QJSValue\" }\n        }\n        Method {\n            name: \"pushDownHandler\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"jsv\"; type: \"QJSValue\" }\n        }\n        Method {\n            name: \"removeHandler\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n        }\n        Method { name: \"tryPopHandler\"; type: \"QObject*\" }\n        Method { name: \"forcePopHandler\"; type: \"QObject*\" }\n        Method { name: \"clear\" }\n        Method { name: \"back\"; type: \"bool\" }\n    }\n    Component {\n        name: \"AsemanCalendarConverter\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/CalendarConv 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Property { name: \"calendar\"; type: \"int\" }\n        Property { name: \"calendarIDs\"; type: \"QStringList\"; isReadonly: true }\n        Property { name: \"currentDays\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentYear\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentMonth\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentDay\"; type: \"int\"; isReadonly: true }\n        Signal { name: \"fakeSignal\" }\n        Method {\n            name: \"calendarName\"\n            type: \"string\"\n            Parameter { name: \"t\"; type: \"int\" }\n        }\n        Method {\n            name: \"convertIntToStringDate\"\n            type: \"string\"\n            Parameter { name: \"d\"; type: \"qlonglong\" }\n        }\n        Method {\n            name: \"convertIntToFullStringDate\"\n            type: \"string\"\n            Parameter { name: \"d\"; type: \"qlonglong\" }\n        }\n        Method {\n            name: \"convertIntToNumStringDate\"\n            type: \"string\"\n            Parameter { name: \"d\"; type: \"qlonglong\" }\n        }\n        Method {\n            name: \"translateInt\"\n            type: \"string\"\n            Parameter { name: \"d\"; type: \"qlonglong\" }\n        }\n        Method {\n            name: \"convertIntToStringDate\"\n            type: \"string\"\n            Parameter { name: \"d\"; type: \"qlonglong\" }\n            Parameter { name: \"format\"; type: \"string\" }\n        }\n        Method {\n            name: \"convertDateToGragorian\"\n            type: \"QDate\"\n            Parameter { name: \"year\"; type: \"qlonglong\" }\n            Parameter { name: \"month\"; type: \"int\" }\n            Parameter { name: \"day\"; type: \"int\" }\n        }\n        Method {\n            name: \"fromMSecSinceEpoch\"\n            type: \"string\"\n            Parameter { name: \"t\"; type: \"qlonglong\" }\n        }\n        Method {\n            name: \"convertDateTimeToString\"\n            type: \"string\"\n            Parameter { name: \"dt\"; type: \"QDateTime\" }\n        }\n        Method {\n            name: \"convertDateTimeToString\"\n            type: \"string\"\n            Parameter { name: \"dt\"; type: \"QDateTime\" }\n            Parameter { name: \"format\"; type: \"string\" }\n        }\n        Method {\n            name: \"convertDateTimeToLittleString\"\n            type: \"string\"\n            Parameter { name: \"dt\"; type: \"QDate\" }\n        }\n        Method {\n            name: \"daysOfMonth\"\n            type: \"int\"\n            Parameter { name: \"year\"; type: \"qlonglong\" }\n            Parameter { name: \"month\"; type: \"int\" }\n        }\n        Method {\n            name: \"monthName\"\n            type: \"string\"\n            Parameter { name: \"month\"; type: \"int\" }\n        }\n        Method {\n            name: \"combineDateAndTime\"\n            type: \"QDateTime\"\n            Parameter { name: \"date\"; type: \"QDate\" }\n            Parameter { name: \"time\"; type: \"QTime\" }\n        }\n        Method {\n            name: \"dateMonth\"\n            type: \"int\"\n            Parameter { name: \"date\"; type: \"QDate\" }\n        }\n        Method {\n            name: \"dateDay\"\n            type: \"int\"\n            Parameter { name: \"date\"; type: \"QDate\" }\n        }\n        Method {\n            name: \"dateYear\"\n            type: \"qlonglong\"\n            Parameter { name: \"date\"; type: \"QDate\" }\n        }\n        Method {\n            name: \"convertDaysToDate\"\n            type: \"QDate\"\n            Parameter { name: \"days\"; type: \"int\" }\n        }\n        Method {\n            name: \"convertDateToDays\"\n            type: \"int\"\n            Parameter { name: \"date\"; type: \"QDate\" }\n        }\n        Method {\n            name: \"fromTime_t\"\n            type: \"QDateTime\"\n            Parameter { name: \"sec\"; type: \"uint\" }\n        }\n    }\n    Component {\n        name: \"AsemanDelegateSwitch\"\n        defaultProperty: \"components\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Base/DelegateSwitch 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"components\"; type: \"QQmlComponent\"; isList: true; isReadonly: true }\n        Property { name: \"current\"; type: \"int\" }\n        Property { name: \"item\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n    }\n    Component {\n        name: \"AsemanDesktopTools\"\n        prototype: \"QObject\"\n        exports: [\n            \"AsemanQml.Base/AsemanDesktopTools 2.0\",\n            \"AsemanQml.Base/Desktop 2.0\"\n        ]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0, 0]\n        Enum {\n            name: \"DesktopSession\"\n            values: {\n                \"Unknown\": 0,\n                \"Gnome\": 1,\n                \"GnomeFallBack\": 2,\n                \"Unity\": 3,\n                \"Kde\": 4,\n                \"Plasma\": 5,\n                \"Windows\": 6,\n                \"Mac\": 7\n            }\n        }\n        Enum {\n            name: \"YesOrNoType\"\n            values: {\n                \"Warning\": 0,\n                \"Question\": 1,\n                \"Information\": 2,\n                \"Critical\": 3\n            }\n        }\n        Property { name: \"titleBarColor\"; type: \"QColor\"; isReadonly: true }\n        Property { name: \"titleBarTransparentColor\"; type: \"QColor\"; isReadonly: true }\n        Property { name: \"titleBarTextColor\"; type: \"QColor\"; isReadonly: true }\n        Property { name: \"titleBarIsDark\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"desktopSession\"; type: \"int\"; isReadonly: true }\n        Property { name: \"fontFamilies\"; type: \"QStringList\"; isReadonly: true }\n        Property { name: \"menuStyle.qml\"; type: \"string\" }\n        Property { name: \"currentMenuObject\"; type: \"QObject\"; isReadonly: true; isPointer: true }\n        Property { name: \"tooltip\"; type: \"string\" }\n        Signal { name: \"fakeSignal\" }\n        Method {\n            name: \"getOpenFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"filter\"; type: \"string\" }\n            Parameter { name: \"startPath\"; type: \"string\" }\n        }\n        Method {\n            name: \"getOpenFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"filter\"; type: \"string\" }\n        }\n        Method {\n            name: \"getOpenFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n        }\n        Method {\n            name: \"getOpenFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        }\n        Method { name: \"getOpenFileName\"; type: \"string\" }\n        Method {\n            name: \"getOpenFileNames\"\n            type: \"QStringList\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"filter\"; type: \"string\" }\n            Parameter { name: \"startPath\"; type: \"string\" }\n        }\n        Method {\n            name: \"getOpenFileNames\"\n            type: \"QStringList\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"filter\"; type: \"string\" }\n        }\n        Method {\n            name: \"getOpenFileNames\"\n            type: \"QStringList\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n        }\n        Method {\n            name: \"getOpenFileNames\"\n            type: \"QStringList\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        }\n        Method { name: \"getOpenFileNames\"; type: \"QStringList\" }\n        Method {\n            name: \"getSaveFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"filter\"; type: \"string\" }\n            Parameter { name: \"startPath\"; type: \"string\" }\n        }\n        Method {\n            name: \"getSaveFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"filter\"; type: \"string\" }\n        }\n        Method {\n            name: \"getSaveFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n        }\n        Method {\n            name: \"getSaveFileName\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        }\n        Method { name: \"getSaveFileName\"; type: \"string\" }\n        Method {\n            name: \"getExistingDirectory\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"startPath\"; type: \"string\" }\n        }\n        Method {\n            name: \"getExistingDirectory\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n        }\n        Method {\n            name: \"getExistingDirectory\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        }\n        Method { name: \"getExistingDirectory\"; type: \"string\" }\n        Method {\n            name: \"getFont\"\n            type: \"QFont\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"font\"; type: \"QFont\" }\n        }\n        Method {\n            name: \"getFont\"\n            type: \"QFont\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n        }\n        Method {\n            name: \"getFont\"\n            type: \"QFont\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        }\n        Method { name: \"getFont\"; type: \"QFont\" }\n        Method {\n            name: \"getColor\"\n            type: \"QColor\"\n            Parameter { name: \"color\"; type: \"QColor\" }\n        }\n        Method { name: \"getColor\"; type: \"QColor\" }\n        Method {\n            name: \"getText\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n            Parameter { name: \"defaultText\"; type: \"string\" }\n        }\n        Method {\n            name: \"getText\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n        }\n        Method {\n            name: \"getText\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n        }\n        Method {\n            name: \"getText\"\n            type: \"string\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        }\n        Method { name: \"getText\"; type: \"string\" }\n        Method {\n            name: \"showMenu\"\n            type: \"int\"\n            Parameter { name: \"actions\"; type: \"QVariantList\" }\n            Parameter { name: \"point\"; type: \"QPoint\" }\n        }\n        Method {\n            name: \"showMenu\"\n            type: \"int\"\n            Parameter { name: \"actions\"; type: \"QVariantList\" }\n        }\n        Method {\n            name: \"yesOrNo\"\n            type: \"bool\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"int\" }\n        }\n        Method {\n            name: \"yesOrNo\"\n            type: \"bool\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n        }\n        Method {\n            name: \"showMessage\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"int\" }\n        }\n        Method {\n            name: \"showMessage\"\n            Parameter { name: \"window\"; type: \"QWindow\"; isPointer: true }\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanDevices\"\n        prototype: \"QObject\"\n        Property { name: \"isMobile\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isTablet\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isLargeTablet\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isTouchDevice\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isDesktop\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isMacX\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isWindows\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isWindows8\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isLinux\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isAndroid\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isIOS\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isUbuntuTouch\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isWindowsPhone\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"screen\"; type: \"QObject\"; isReadonly: true; isPointer: true }\n        Property { name: \"cameraIsAvailable\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"lcdPhysicalSize\"; type: \"double\"; isReadonly: true }\n        Property { name: \"lcdPhysicalWidth\"; type: \"double\"; isReadonly: true }\n        Property { name: \"lcdPhysicalHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"lcdDpiX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"lcdDpiY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"platformVersion\"; type: \"string\"; isReadonly: true }\n        Property { name: \"platformType\"; type: \"string\"; isReadonly: true }\n        Property { name: \"platformName\"; type: \"string\"; isReadonly: true }\n        Property { name: \"platformKernel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"platformKernelVersion\"; type: \"string\"; isReadonly: true }\n        Property { name: \"platformCpuArchitecture\"; type: \"string\"; isReadonly: true }\n        Property { name: \"screenSize\"; type: \"QSize\"; isReadonly: true }\n        Property { name: \"keyboardHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"localFilesPrePath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"densityDpi\"; type: \"int\"; isReadonly: true }\n        Property { name: \"density\"; type: \"double\"; isReadonly: true }\n        Property { name: \"deviceDensity\"; type: \"double\"; isReadonly: true }\n        Property { name: \"fontDensity\"; type: \"double\"; isReadonly: true }\n        Property { name: \"transparentStatusBar\"; type: \"bool\" }\n        Property { name: \"transparentNavigationBar\"; type: \"bool\" }\n        Property { name: \"standardTitleBarHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"statusBarHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"navigationBarHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"clipboard\"; type: \"string\" }\n        Property { name: \"clipboardUrl\"; type: \"QList<QUrl>\" }\n        Property { name: \"keyboard\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"cameraLocation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"picturesLocation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"musicsLocation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"documentsLocation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"downloadsLocation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"resourcePath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"libsPath\"; type: \"string\"; isReadonly: true }\n        Property { name: \"deviceName\"; type: \"string\"; isReadonly: true }\n        Property { name: \"deviceId\"; type: \"string\"; isReadonly: true }\n        Property { name: \"deviceShortId\"; type: \"string\"; isReadonly: true }\n        Property { name: \"qtVersion\"; type: \"string\"; isReadonly: true }\n        Property { name: \"qtMajorVersion\"; type: \"double\"; isReadonly: true }\n        Property { name: \"fontScale\"; type: \"double\" }\n        Property { name: \"deviceDetails\"; type: \"QVariantMap\"; isReadonly: true }\n        Signal {\n            name: \"incomingShare\"\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"msg\"; type: \"string\" }\n        }\n        Signal {\n            name: \"incomingImage\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Signal {\n            name: \"selectImageResult\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Signal { name: \"activityPaused\" }\n        Signal { name: \"activityResumed\" }\n        Signal { name: \"platformChanged\" }\n        Signal { name: \"geometryChanged\" }\n        Method { name: \"hideKeyboard\" }\n        Method { name: \"showKeyboard\" }\n        Method { name: \"triggerVibrateFeedback\" }\n        Method {\n            name: \"share\"\n            Parameter { name: \"subject\"; type: \"string\" }\n            Parameter { name: \"message\"; type: \"string\" }\n        }\n        Method {\n            name: \"openFile\"\n            type: \"bool\"\n            Parameter { name: \"address\"; type: \"string\" }\n        }\n        Method {\n            name: \"shareFile\"\n            type: \"bool\"\n            Parameter { name: \"address\"; type: \"string\" }\n        }\n        Method {\n            name: \"callNumber\"\n            Parameter { name: \"number\"; type: \"string\" }\n        }\n        Method {\n            name: \"setClipboard\"\n            Parameter { name: \"text\"; type: \"string\" }\n        }\n        Method {\n            name: \"setClipboardData\"\n            Parameter { name: \"mime\"; type: \"AsemanMimeData\"; isPointer: true }\n        }\n        Method {\n            name: \"getLastImages\"\n            type: \"QStringList\"\n            Parameter { name: \"offset\"; type: \"int\" }\n            Parameter { name: \"count\"; type: \"int\" }\n        }\n        Method {\n            name: \"setupImEventFilter\"\n            Parameter { name: \"object\"; type: \"QObject\"; isPointer: true }\n        }\n        Method {\n            name: \"setupWindowColor\"\n            Parameter { name: \"color\"; type: \"QColor\" }\n        }\n        Method { name: \"startCameraPicture\"; type: \"string\" }\n        Method { name: \"getOpenPictures\"; type: \"bool\" }\n        Method {\n            name: \"setFlag\"\n            Parameter { name: \"flag\"; type: \"int\" }\n            Parameter { name: \"state\"; type: \"bool\" }\n        }\n        Method {\n            name: \"setFlag\"\n            Parameter { name: \"flag\"; type: \"int\" }\n        }\n        Method {\n            name: \"flag\"\n            type: \"bool\"\n            Parameter { name: \"flag\"; type: \"int\" }\n        }\n    }\n    Component {\n        name: \"AsemanDevicesItem\"\n        prototype: \"AsemanDevices\"\n        exports: [\"AsemanQml.Base/Devices 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Signal {\n            name: \"incomingImage\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Signal {\n            name: \"selectImageResult\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method { name: \"getOpenPictures\"; type: \"bool\" }\n        Method {\n            name: \"getContactList\"\n            type: \"QVariantList\"\n            Parameter { name: \"asyncCallback\"; type: \"QJSValue\" }\n        }\n        Method {\n            name: \"saveToGallery\"\n            type: \"bool\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanDownloader\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/Downloader 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"recievedBytes\"; type: \"qlonglong\"; isReadonly: true }\n        Property { name: \"totalBytes\"; type: \"qlonglong\"; isReadonly: true }\n        Property { name: \"destination\"; type: \"string\" }\n        Property { name: \"path\"; type: \"string\" }\n        Property { name: \"downloaderId\"; type: \"int\" }\n        Property { name: \"ignoreSslErrors\"; type: \"bool\" }\n        Property { name: \"downloading\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"header\"; type: \"QVariantMap\" }\n        Signal {\n            name: \"error\"\n            Parameter { name: \"error\"; type: \"QStringList\" }\n        }\n        Signal {\n            name: \"finished\"\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n        Signal {\n            name: \"finishedWithId\"\n            Parameter { name: \"id\"; type: \"int\" }\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n        Signal { name: \"failed\" }\n        Method { name: \"start\" }\n        Method { name: \"stop\" }\n    }\n    Component {\n        name: \"AsemanDragArea\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Base/MouseDragArea 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"orientation\"; type: \"int\" }\n        Property { name: \"minimum\"; type: \"int\" }\n        Property { name: \"mouseX\"; type: \"int\"; isReadonly: true }\n        Property { name: \"mouseY\"; type: \"int\"; isReadonly: true }\n        Signal { name: \"positionChanged\" }\n        Signal { name: \"pressed\" }\n        Signal { name: \"released\" }\n    }\n    Component {\n        name: \"AsemanDragObject\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/DragObject 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"mimeData\"; type: \"AsemanMimeData\"; isPointer: true }\n        Property { name: \"dropAction\"; type: \"int\" }\n        Property { name: \"source\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"image\"; type: \"QUrl\" }\n        Property { name: \"hotSpot\"; type: \"QPoint\" }\n        Property { name: \"imageData\"; type: \"QImage\" }\n        Property { name: \"dragging\"; type: \"bool\"; isReadonly: true }\n        Method { name: \"start\"; type: \"int\" }\n    }\n    Component {\n        name: \"AsemanEncrypter\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/Encrypter 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"key\"; type: \"string\" }\n        Method {\n            name: \"encrypt\"\n            type: \"QByteArray\"\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n        Method {\n            name: \"decrypt\"\n            type: \"QByteArray\"\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n    }\n    Component {\n        name: \"AsemanFileDownloaderQueue\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/FileDownloaderQueue 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"capacity\"; type: \"int\" }\n        Property { name: \"destination\"; type: \"string\" }\n        Signal {\n            name: \"finished\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n        }\n        Signal {\n            name: \"progressChanged\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n            Parameter { name: \"percent\"; type: \"double\" }\n        }\n        Method {\n            name: \"download\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n            Parameter { name: \"header\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"download\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanFileDownloaderQueueItem\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/FileDownloaderQueueItem 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"source\"; type: \"string\" }\n        Property { name: \"fileName\"; type: \"string\" }\n        Property { name: \"header\"; type: \"QVariantMap\" }\n        Property { name: \"ignoreSslErrors\"; type: \"bool\" }\n        Property { name: \"percent\"; type: \"double\"; isReadonly: true }\n        Property { name: \"downloaderQueue\"; type: \"AsemanFileDownloaderQueue\"; isPointer: true }\n        Property { name: \"result\"; type: \"string\"; isReadonly: true }\n    }\n    Component {\n        name: \"AsemanFileResourceManager\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/FileResourceManager 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"root\"; type: \"string\" }\n        Method {\n            name: \"insert\"\n            Parameter { name: \"file\"; type: \"string\" }\n            Parameter { name: \"callback\"; type: \"QJSValue\" }\n        }\n        Method {\n            name: \"remove\"\n            type: \"bool\"\n            Parameter { name: \"id\"; type: \"string\" }\n        }\n        Method {\n            name: \"get\"\n            type: \"string\"\n            Parameter { name: \"id\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanGlobalTranslations\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/Translations 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Property { name: \"refresher\"; type: \"string\"; isReadonly: true }\n        Signal { name: \"refreshed\" }\n    }\n    Component {\n        name: \"AsemanHashObject\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/HashObject 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"values\"; type: \"QVariantList\"; isReadonly: true }\n        Property { name: \"keys\"; type: \"QStringList\"; isReadonly: true }\n        Method {\n            name: \"insert\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"insertMulti\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"remove\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"remove\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"key\"\n            type: \"QVariant\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"keys\"\n            type: \"QStringList\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method { name: \"uniqueKeys\"; type: \"QStringList\" }\n        Method { name: \"keys\"; type: \"QStringList\" }\n        Method {\n            name: \"value\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"values\"\n            type: \"QVariantList\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"contains\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"contains\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method { name: \"clear\" }\n        Method { name: \"count\"; type: \"int\" }\n        Method { name: \"toMap\"; type: \"QVariantMap\" }\n    }\n    Component {\n        name: \"AsemanHostChecker\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/HostChecker 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"host\"; type: \"string\" }\n        Property { name: \"port\"; type: \"int\" }\n        Property { name: \"interval\"; type: \"int\" }\n        Property { name: \"available\"; type: \"bool\"; isReadonly: true }\n    }\n    Component {\n        name: \"AsemanImageColorAnalizor\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/ImageColorAnalizor 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"Method\"\n            values: {\n                \"Normal\": 0,\n                \"MoreSaturation\": 1\n            }\n        }\n        Property { name: \"source\"; type: \"QUrl\" }\n        Property { name: \"color\"; type: \"QColor\"; isReadonly: true }\n        Property { name: \"method\"; type: \"int\" }\n    }\n    Component {\n        name: \"AsemanItemGrabber\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/ItemGrabber 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"item\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"suffix\"; type: \"string\" }\n        Property { name: \"fileName\"; type: \"string\" }\n        Signal {\n            name: \"saved\"\n            Parameter { name: \"dest\"; type: \"string\" }\n        }\n        Signal { name: \"failed\" }\n        Method {\n            name: \"save\"\n            Parameter { name: \"dest\"; type: \"string\" }\n            Parameter { name: \"size\"; type: \"QSize\" }\n        }\n    }\n    Component {\n        name: \"AsemanKeyHandler\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/KeyHandler 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"window\"; type: \"QObject\"; isPointer: true }\n        Property { name: \"modifiers\"; type: \"int\"; isReadonly: true }\n        Property { name: \"scanCode\"; type: \"int\" }\n        Property { name: \"key\"; type: \"int\" }\n        Signal {\n            name: \"pressed\"\n            Parameter { name: \"modifiers\"; type: \"int\" }\n            Parameter { name: \"key\"; type: \"int\" }\n            Parameter { name: \"scanCode\"; type: \"int\" }\n        }\n        Signal {\n            name: \"released\"\n            Parameter { name: \"modifiers\"; type: \"int\" }\n            Parameter { name: \"key\"; type: \"int\" }\n            Parameter { name: \"scanCode\"; type: \"int\" }\n        }\n    }\n    Component {\n        name: \"AsemanListObject\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/ListObject 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"list\"; type: \"QVariantList\" }\n        Method {\n            name: \"removeAll\"\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"removeOne\"\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"removeAt\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n        Method { name: \"takeLast\"; type: \"QVariant\" }\n        Method { name: \"takeFirst\"; type: \"QVariant\" }\n        Method {\n            name: \"takeAt\"\n            type: \"QVariant\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n        Method { name: \"clear\" }\n        Method { name: \"last\"; type: \"QVariant\" }\n        Method { name: \"first\"; type: \"QVariant\" }\n        Method {\n            name: \"insert\"\n            Parameter { name: \"index\"; type: \"int\" }\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"append\"\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"prepend\"\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"replace\"\n            Parameter { name: \"index\"; type: \"int\" }\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"swap\"\n            Parameter { name: \"idx0\"; type: \"int\" }\n            Parameter { name: \"idx1\"; type: \"int\" }\n        }\n        Method { name: \"count\"; type: \"int\" }\n        Method { name: \"isEmpty\"; type: \"bool\" }\n        Method {\n            name: \"at\"\n            type: \"QVariant\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n        Method {\n            name: \"indexOf\"\n            type: \"int\"\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"fromList\"\n            Parameter { name: \"list\"; type: \"QVariantList\" }\n        }\n        Method { name: \"toList\"; type: \"QVariantList\" }\n        Method {\n            name: \"contains\"\n            type: \"bool\"\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method { name: \"sort\" }\n    }\n    Component {\n        name: \"AsemanMapObject\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/MapObject 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"values\"; type: \"QVariantList\"; isReadonly: true }\n        Property { name: \"keys\"; type: \"QStringList\"; isReadonly: true }\n        Method {\n            name: \"insert\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"insertMulti\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"remove\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"remove\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"key\"\n            type: \"QVariant\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"keys\"\n            type: \"QStringList\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method { name: \"uniqueKeys\"; type: \"QStringList\" }\n        Method { name: \"keys\"; type: \"QStringList\" }\n        Method {\n            name: \"value\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"values\"\n            type: \"QVariantList\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"containt\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"containt\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"contains\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"contains\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method { name: \"clear\" }\n        Method { name: \"count\"; type: \"int\" }\n        Method { name: \"toMap\"; type: \"QVariantMap\" }\n    }\n    Component {\n        name: \"AsemanMimeApps\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/MimeApps 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Method {\n            name: \"openFiles\"\n            Parameter { name: \"app\"; type: \"string\" }\n            Parameter { name: \"files\"; type: \"QStringList\" }\n        }\n        Method {\n            name: \"appsOfMime\"\n            type: \"QStringList\"\n            Parameter { name: \"mime\"; type: \"string\" }\n        }\n        Method {\n            name: \"appsOfFile\"\n            type: \"QStringList\"\n            Parameter { name: \"file\"; type: \"string\" }\n        }\n        Method {\n            name: \"appName\"\n            type: \"string\"\n            Parameter { name: \"app\"; type: \"string\" }\n        }\n        Method {\n            name: \"appIcon\"\n            type: \"string\"\n            Parameter { name: \"app\"; type: \"string\" }\n        }\n        Method {\n            name: \"appGenericName\"\n            type: \"string\"\n            Parameter { name: \"app\"; type: \"string\" }\n        }\n        Method {\n            name: \"appComment\"\n            type: \"string\"\n            Parameter { name: \"app\"; type: \"string\" }\n        }\n        Method {\n            name: \"appPath\"\n            type: \"string\"\n            Parameter { name: \"app\"; type: \"string\" }\n        }\n        Method {\n            name: \"appCommand\"\n            type: \"string\"\n            Parameter { name: \"app\"; type: \"string\" }\n        }\n        Method {\n            name: \"appMimes\"\n            type: \"QStringList\"\n            Parameter { name: \"app\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanMimeData\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/MimeData 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"html\"; type: \"string\" }\n        Property { name: \"urls\"; type: \"QList<QUrl>\" }\n        Property { name: \"dataMap\"; type: \"QVariantMap\" }\n        Property { name: \"formats\"; type: \"QStringList\"; isReadonly: true }\n        Method { name: \"fetchClipboard\" }\n        Method {\n            name: \"getDataAsString\"\n            type: \"string\"\n            Parameter { name: \"type\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanMouseEventListener\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Base/MouseEventListener 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"mouseX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"mouseY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"mousePosition\"; type: \"QPointF\"; isReadonly: true }\n        Signal { name: \"mousePressed\" }\n        Signal { name: \"mouseReleased\" }\n        Method { name: \"ignoreEvent\" }\n        Method { name: \"acceptEvent\" }\n    }\n    Component {\n        name: \"AsemanNetworkManager\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/NetworkManager 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"defaultNetworkIdentifier\"; type: \"string\"; isReadonly: true }\n        Property { name: \"configurations\"; type: \"QVariantMap\"; isReadonly: true }\n        Property {\n            name: \"defaultNetwork\"\n            type: \"AsemanNetworkManagerItem\"\n            isReadonly: true\n            isPointer: true\n        }\n        Property { name: \"interval\"; type: \"int\" }\n    }\n    Component {\n        name: \"AsemanNetworkManagerItem\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/NetworkManagerItem 2.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        Property { name: \"bearerType\"; type: \"int\"; isReadonly: true }\n        Property { name: \"bearerTypeFamily\"; type: \"int\"; isReadonly: true }\n        Property { name: \"bearerTypeName\"; type: \"string\"; isReadonly: true }\n        Property { name: \"children\"; type: \"QList<AsemanNetworkManagerItem*>\"; isReadonly: true }\n        Property { name: \"identifier\"; type: \"string\"; isReadonly: true }\n        Property { name: \"isRoamingAvailable\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isValid\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"name\"; type: \"string\"; isReadonly: true }\n        Property { name: \"purpose\"; type: \"int\"; isReadonly: true }\n        Property { name: \"state\"; type: \"int\"; isReadonly: true }\n        Property { name: \"type\"; type: \"int\"; isReadonly: true }\n    }\n    Component {\n        name: \"AsemanNetworkProxy\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/NetworkProxy 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"ProxyType\"\n            values: {\n                \"DefaultProxy\": 0,\n                \"Socks5Proxy\": 1,\n                \"NoProxy\": 2,\n                \"HttpProxy\": 3,\n                \"HttpCachingProxy\": 4,\n                \"FtpCachingProxy\": 5\n            }\n        }\n        Property { name: \"type\"; type: \"int\" }\n        Property { name: \"hostName\"; type: \"string\" }\n        Property { name: \"port\"; type: \"int\" }\n        Property { name: \"user\"; type: \"string\" }\n        Property { name: \"password\"; type: \"string\" }\n    }\n    Component {\n        name: \"AsemanNetworkSleepManager\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/NetworkSleepManager 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"host\"; type: \"string\" }\n        Property { name: \"port\"; type: \"int\" }\n        Property { name: \"interval\"; type: \"int\" }\n        Property { name: \"networkManager\"; type: \"bool\" }\n        Property { name: \"available\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"wake\" }\n        Signal { name: \"sleep\" }\n    }\n    Component {\n        name: \"AsemanProcess\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/Process 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"arguments\"; type: \"QStringList\" }\n        Property { name: \"command\"; type: \"string\" }\n        Property { name: \"running\"; type: \"bool\"; isReadonly: true }\n        Signal {\n            name: \"standardOutput\"\n            Parameter { name: \"output\"; type: \"string\" }\n        }\n        Signal {\n            name: \"errorOutput\"\n            Parameter { name: \"output\"; type: \"string\" }\n        }\n        Method { name: \"start\" }\n        Method { name: \"terminate\" }\n    }\n    Component {\n        name: \"AsemanProxyComponent\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/ProxyComponent 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"source\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"object\"; type: \"QObject\"; isReadonly: true; isPointer: true }\n    }\n    Component {\n        name: \"AsemanQmlImage\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickPaintedItem\"\n        exports: [\"AsemanQml.Base/AsemanImage 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"FillMode\"\n            values: {\n                \"Stretch\": 0,\n                \"PreserveAspectFit\": 1,\n                \"PreserveAspectCrop\": 2,\n                \"Tile\": 3\n            }\n        }\n        Property { name: \"source\"; type: \"QUrl\" }\n        Property { name: \"fillMode\"; type: \"int\" }\n        Property { name: \"asynchronous\"; type: \"bool\" }\n        Property { name: \"autoTransform\"; type: \"bool\" }\n        Property { name: \"cache\"; type: \"bool\" }\n        Property { name: \"horizontalAlignment\"; type: \"int\" }\n        Property { name: \"verticalAlignment\"; type: \"int\" }\n        Property { name: \"mipmap\"; type: \"bool\" }\n        Property { name: \"mirror\"; type: \"bool\" }\n        Property { name: \"paintedWidth\"; type: \"double\"; isReadonly: true }\n        Property { name: \"paintedHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"progress\"; type: \"double\"; isReadonly: true }\n        Property { name: \"smooth\"; type: \"bool\" }\n        Property { name: \"sourceSize\"; type: \"QSize\"; isReadonly: true }\n        Signal { name: \"paintedSizeChanged\" }\n        Method { name: \"refresh\" }\n    }\n    Component {\n        name: \"AsemanQtLogger\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/Logger 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Property { name: \"path\"; type: \"string\"; isReadonly: true }\n        Method {\n            name: \"debug\"\n            Parameter { name: \"var\"; type: \"QVariant\" }\n        }\n        Method { name: \"start\" }\n    }\n    Component {\n        name: \"AsemanQuickObject\"\n        defaultProperty: \"items\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/AsemanObject 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        name: \"AsemanQuickViewWrapper\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/View 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Property { name: \"reverseScroll\"; type: \"bool\" }\n        Property { name: \"statusBarHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"navigationBarHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"root\"; type: \"QObject\"; isPointer: true }\n        Property { name: \"focusedText\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"offlineStoragePath\"; type: \"string\" }\n        Property { name: \"flickVelocity\"; type: \"double\"; isReadonly: true }\n        Property { name: \"window\"; type: \"QWindow\"; isReadonly: true; isPointer: true }\n        Signal { name: \"fullscreenChanged\" }\n        Signal { name: \"backControllerChanged\" }\n        Signal { name: \"fakeSignal\" }\n        Signal { name: \"closeRequest\" }\n        Method { name: \"discardFocusedText\" }\n        Method {\n            name: \"registerWindow\"\n            Parameter { name: \"window\"; type: \"QQuickWindow\"; isPointer: true }\n        }\n    }\n    Component {\n        name: \"AsemanSettings\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/Settings 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"category\"; type: \"string\" }\n        Property { name: \"source\"; type: \"string\" }\n        Signal { name: \"valueChanged\" }\n        Method {\n            name: \"setValue\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"value\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n            Parameter { name: \"defaultValue\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"value\"\n            type: \"QVariant\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method {\n            name: \"remove\"\n            Parameter { name: \"key\"; type: \"string\" }\n        }\n        Method { name: \"keys\"; type: \"QStringList\" }\n    }\n    Component {\n        name: \"AsemanSystemTray\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/SystemTray 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"ActivateReason\"\n            values: {\n                \"ActivateUnknown\": 0,\n                \"ActivateContext\": 1,\n                \"ActivateDoubleClick\": 2,\n                \"ActivateTrigger\": 3,\n                \"ActivateMiddleClick\": 4\n            }\n        }\n        Property { name: \"visible\"; type: \"bool\" }\n        Property { name: \"icon\"; type: \"QUrl\" }\n        Property { name: \"badgeCount\"; type: \"int\" }\n        Property { name: \"badgeFillColor\"; type: \"QColor\" }\n        Property { name: \"badgeStrokeColor\"; type: \"QColor\" }\n        Property { name: \"badgeTextColor\"; type: \"QColor\" }\n        Property { name: \"menu\"; type: \"QStringList\" }\n        Signal {\n            name: \"activated\"\n            Parameter { name: \"reason\"; type: \"int\" }\n        }\n        Signal {\n            name: \"menuTriggered\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n    }\n    Component {\n        name: \"AsemanTextTools\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/TextTools 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Method {\n            name: \"htmlWidth\"\n            type: \"double\"\n            Parameter { name: \"html\"; type: \"string\" }\n        }\n        Method {\n            name: \"directionOf\"\n            type: \"Qt::LayoutDirection\"\n            Parameter { name: \"str\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanTitleBarColorGrabber\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/TitleBarColorGrabber 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        Property { name: \"autoRefresh\"; type: \"bool\" }\n        Property { name: \"defaultColor\"; type: \"QColor\" }\n        Property { name: \"color\"; type: \"QColor\"; isReadonly: true }\n        Method { name: \"refresh\" }\n    }\n    Component {\n        name: \"AsemanTools\"\n        prototype: \"QObject\"\n        Enum {\n            name: \"HashMethod\"\n            values: {\n                \"Md5\": 0,\n                \"Sha224\": 1,\n                \"Sha256\": 2,\n                \"Sha384\": 3,\n                \"Sha512\": 4,\n                \"Sha3_224\": 5,\n                \"Sha3_256\": 6,\n                \"Sha3_384\": 7,\n                \"Sha3_512\": 8\n            }\n        }\n        Method {\n            name: \"debug\"\n            Parameter { name: \"var\"; type: \"QVariant\" }\n        }\n        Method { name: \"currentDate\"; type: \"QDateTime\" }\n        Method {\n            name: \"dateToMSec\"\n            type: \"string\"\n            Parameter { name: \"dt\"; type: \"QDateTime\" }\n        }\n        Method {\n            name: \"mSecToDate\"\n            type: \"QDateTime\"\n            Parameter { name: \"ms\"; type: \"string\" }\n        }\n        Method {\n            name: \"dateToSec\"\n            type: \"qlonglong\"\n            Parameter { name: \"dt\"; type: \"QDateTime\" }\n        }\n        Method {\n            name: \"dateFromSec\"\n            type: \"QDateTime\"\n            Parameter { name: \"date\"; type: \"qlonglong\" }\n        }\n        Method {\n            name: \"daysToDate\"\n            type: \"QDateTime\"\n            Parameter { name: \"date\"; type: \"int\" }\n        }\n        Method {\n            name: \"dateToString\"\n            type: \"string\"\n            Parameter { name: \"dt\"; type: \"QDateTime\" }\n            Parameter { name: \"format\"; type: \"string\" }\n        }\n        Method {\n            name: \"dateToString\"\n            type: \"string\"\n            Parameter { name: \"dt\"; type: \"QDateTime\" }\n        }\n        Method {\n            name: \"datefromString\"\n            type: \"QDateTime\"\n            Parameter { name: \"dt\"; type: \"string\" }\n            Parameter { name: \"format\"; type: \"string\" }\n        }\n        Method {\n            name: \"datefromString\"\n            type: \"QDateTime\"\n            Parameter { name: \"dt\"; type: \"string\" }\n        }\n        Method {\n            name: \"msecToTimeString\"\n            type: \"string\"\n            Parameter { name: \"msec\"; type: \"int\" }\n            Parameter { name: \"format\"; type: \"string\" }\n        }\n        Method {\n            name: \"msecToTimeString\"\n            type: \"string\"\n            Parameter { name: \"msec\"; type: \"int\" }\n        }\n        Method {\n            name: \"dateAddDays\"\n            type: \"QDate\"\n            Parameter { name: \"date\"; type: \"QDate\" }\n            Parameter { name: \"days\"; type: \"int\" }\n        }\n        Method {\n            name: \"toStringList\"\n            type: \"QStringList\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"toVariantMap\"\n            type: \"QVariantMap\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"toVariantList\"\n            type: \"QVariantList\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"byteArrayToString\"\n            type: \"string\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"compress\"\n            type: \"QByteArray\"\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n            Parameter { name: \"level\"; type: \"int\" }\n        }\n        Method {\n            name: \"compress\"\n            type: \"QByteArray\"\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n        Method {\n            name: \"uncompress\"\n            type: \"QByteArray\"\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n        Method {\n            name: \"bytesToVariant\"\n            type: \"QVariant\"\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n        Method {\n            name: \"variantToBytes\"\n            type: \"QByteArray\"\n            Parameter { name: \"var\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"fileName\"\n            type: \"string\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"fileSuffix\"\n            type: \"string\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"fileMime\"\n            type: \"string\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"fileParent\"\n            type: \"string\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"fileSize\"\n            type: \"string\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"readText\"\n            type: \"string\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"writeText\"\n            type: \"bool\"\n            Parameter { name: \"path\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n        }\n        Method {\n            name: \"fileExists\"\n            type: \"bool\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"filesOf\"\n            type: \"QStringList\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"imageSize\"\n            type: \"QSize\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"writeFile\"\n            type: \"bool\"\n            Parameter { name: \"path\"; type: \"string\" }\n            Parameter { name: \"data\"; type: \"QVariant\" }\n            Parameter { name: \"compress\"; type: \"bool\" }\n        }\n        Method {\n            name: \"writeFile\"\n            type: \"bool\"\n            Parameter { name: \"path\"; type: \"string\" }\n            Parameter { name: \"data\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"readFile\"\n            type: \"QByteArray\"\n            Parameter { name: \"path\"; type: \"string\" }\n            Parameter { name: \"uncompress\"; type: \"bool\" }\n        }\n        Method {\n            name: \"readFile\"\n            type: \"QByteArray\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"className\"\n            type: \"string\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n        }\n        Method {\n            name: \"stringLinks\"\n            type: \"QStringList\"\n            Parameter { name: \"str\"; type: \"string\" }\n        }\n        Method {\n            name: \"stringRemove\"\n            type: \"string\"\n            Parameter { name: \"str\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n            Parameter { name: \"regExp\"; type: \"bool\" }\n        }\n        Method {\n            name: \"stringRemove\"\n            type: \"string\"\n            Parameter { name: \"str\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n        }\n        Method {\n            name: \"stringReplace\"\n            type: \"string\"\n            Parameter { name: \"str\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n            Parameter { name: \"replace\"; type: \"string\" }\n            Parameter { name: \"regExp\"; type: \"bool\" }\n        }\n        Method {\n            name: \"stringReplace\"\n            type: \"string\"\n            Parameter { name: \"str\"; type: \"string\" }\n            Parameter { name: \"text\"; type: \"string\" }\n            Parameter { name: \"replace\"; type: \"string\" }\n        }\n        Method {\n            name: \"stringRegExp\"\n            type: \"QVariantList\"\n            Parameter { name: \"str\"; type: \"string\" }\n            Parameter { name: \"regExp\"; type: \"string\" }\n            Parameter { name: \"minimal\"; type: \"bool\" }\n        }\n        Method {\n            name: \"stringRegExp\"\n            type: \"QVariantList\"\n            Parameter { name: \"str\"; type: \"string\" }\n            Parameter { name: \"regExp\"; type: \"string\" }\n        }\n        Method {\n            name: \"stringToUrl\"\n            type: \"QUrl\"\n            Parameter { name: \"path\"; type: \"string\" }\n        }\n        Method {\n            name: \"urlToLocalPath\"\n            type: \"string\"\n            Parameter { name: \"url\"; type: \"QUrl\" }\n        }\n        Method { name: \"qtVersion\"; type: \"string\" }\n        Method { name: \"aboutAseman\"; type: \"string\" }\n        Method {\n            name: \"deleteItemDelay\"\n            Parameter { name: \"o\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"ms\"; type: \"int\" }\n        }\n        Method {\n            name: \"colorHue\"\n            type: \"double\"\n            Parameter { name: \"clr\"; type: \"QColor\" }\n        }\n        Method {\n            name: \"colorLightness\"\n            type: \"double\"\n            Parameter { name: \"clr\"; type: \"QColor\" }\n        }\n        Method {\n            name: \"colorSaturation\"\n            type: \"double\"\n            Parameter { name: \"clr\"; type: \"QColor\" }\n        }\n        Method {\n            name: \"mkDir\"\n            Parameter { name: \"dir\"; type: \"string\" }\n        }\n        Method {\n            name: \"colorHsl\"\n            type: \"QVariantMap\"\n            Parameter { name: \"clr\"; type: \"QColor\" }\n        }\n        Method {\n            name: \"createVideoThumbnail\"\n            type: \"bool\"\n            Parameter { name: \"video\"; type: \"string\" }\n            Parameter { name: \"output\"; type: \"string\" }\n            Parameter { name: \"ffmpegPath\"; type: \"string\" }\n        }\n        Method {\n            name: \"createVideoThumbnail\"\n            type: \"bool\"\n            Parameter { name: \"video\"; type: \"string\" }\n            Parameter { name: \"output\"; type: \"string\" }\n        }\n        Method {\n            name: \"translateNumbers\"\n            type: \"string\"\n            Parameter { name: \"input\"; type: \"string\" }\n        }\n        Method {\n            name: \"trNums\"\n            type: \"string\"\n            Parameter { name: \"input\"; type: \"string\" }\n        }\n        Method {\n            name: \"passToMd5\"\n            type: \"string\"\n            Parameter { name: \"pass\"; type: \"string\" }\n        }\n        Method {\n            name: \"md5\"\n            type: \"string\"\n            Parameter { name: \"str\"; type: \"string\" }\n        }\n        Method {\n            name: \"passToHash\"\n            type: \"string\"\n            Parameter { name: \"pass\"; type: \"string\" }\n            Parameter { name: \"method\"; type: \"int\" }\n        }\n        Method {\n            name: \"hash\"\n            type: \"string\"\n            Parameter { name: \"str\"; type: \"string\" }\n            Parameter { name: \"method\"; type: \"int\" }\n        }\n        Method { name: \"createUuid\"; type: \"string\" }\n        Method {\n            name: \"htmlToPlaintText\"\n            type: \"string\"\n            Parameter { name: \"html\"; type: \"string\" }\n        }\n        Method {\n            name: \"copyDirectory\"\n            Parameter { name: \"src\"; type: \"string\" }\n            Parameter { name: \"dst\"; type: \"string\" }\n        }\n        Method {\n            name: \"copy\"\n            type: \"bool\"\n            Parameter { name: \"src\"; type: \"string\" }\n            Parameter { name: \"dst\"; type: \"string\" }\n        }\n        Method {\n            name: \"rename\"\n            type: \"bool\"\n            Parameter { name: \"src\"; type: \"string\" }\n            Parameter { name: \"dst\"; type: \"string\" }\n        }\n        Method {\n            name: \"deleteFile\"\n            Parameter { name: \"file\"; type: \"string\" }\n        }\n        Method {\n            name: \"clearDirectory\"\n            Parameter { name: \"dir\"; type: \"string\" }\n        }\n        Method {\n            name: \"decodeJwt\"\n            type: \"QVariantMap\"\n            Parameter { name: \"token\"; type: \"string\" }\n        }\n        Method {\n            name: \"setProperty\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"property\"; type: \"string\" }\n            Parameter { name: \"v\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"property\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"property\"; type: \"string\" }\n        }\n        Method {\n            name: \"directionOf\"\n            type: \"Qt::LayoutDirection\"\n            Parameter { name: \"str\"; type: \"string\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n            Parameter { name: \"v3\"; type: \"QVariant\" }\n            Parameter { name: \"v4\"; type: \"QVariant\" }\n            Parameter { name: \"v5\"; type: \"QVariant\" }\n            Parameter { name: \"v6\"; type: \"QVariant\" }\n            Parameter { name: \"v7\"; type: \"QVariant\" }\n            Parameter { name: \"v8\"; type: \"QVariant\" }\n            Parameter { name: \"v9\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n            Parameter { name: \"v3\"; type: \"QVariant\" }\n            Parameter { name: \"v4\"; type: \"QVariant\" }\n            Parameter { name: \"v5\"; type: \"QVariant\" }\n            Parameter { name: \"v6\"; type: \"QVariant\" }\n            Parameter { name: \"v7\"; type: \"QVariant\" }\n            Parameter { name: \"v8\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n            Parameter { name: \"v3\"; type: \"QVariant\" }\n            Parameter { name: \"v4\"; type: \"QVariant\" }\n            Parameter { name: \"v5\"; type: \"QVariant\" }\n            Parameter { name: \"v6\"; type: \"QVariant\" }\n            Parameter { name: \"v7\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n            Parameter { name: \"v3\"; type: \"QVariant\" }\n            Parameter { name: \"v4\"; type: \"QVariant\" }\n            Parameter { name: \"v5\"; type: \"QVariant\" }\n            Parameter { name: \"v6\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n            Parameter { name: \"v3\"; type: \"QVariant\" }\n            Parameter { name: \"v4\"; type: \"QVariant\" }\n            Parameter { name: \"v5\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n            Parameter { name: \"v3\"; type: \"QVariant\" }\n            Parameter { name: \"v4\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n            Parameter { name: \"v3\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n            Parameter { name: \"v2\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n            Parameter { name: \"v1\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n            Parameter { name: \"v0\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"call\"\n            type: \"QVariant\"\n            Parameter { name: \"obj\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"member\"; type: \"string\" }\n            Parameter { name: \"type\"; type: \"Qt::ConnectionType\" }\n        }\n    }\n    Component {\n        name: \"AsemanToolsItem\"\n        prototype: \"AsemanTools\"\n        exports: [\"AsemanQml.Base/Tools 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Method {\n            name: \"variantToJson\"\n            type: \"string\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n            Parameter { name: \"compact\"; type: \"bool\" }\n        }\n        Method {\n            name: \"variantToJson\"\n            type: \"string\"\n            Parameter { name: \"value\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"jsonToVariant\"\n            type: \"QVariant\"\n            Parameter { name: \"json\"; type: \"string\" }\n        }\n        Method {\n            name: \"jsDelayCall\"\n            Parameter { name: \"ms\"; type: \"int\" }\n            Parameter { name: \"value\"; type: \"QJSValue\" }\n        }\n        Method {\n            name: \"imageResize\"\n            Parameter { name: \"path\"; type: \"string\" }\n            Parameter { name: \"size\"; type: \"QSize\" }\n            Parameter { name: \"dest\"; type: \"string\" }\n            Parameter { name: \"callback\"; type: \"QJSValue\" }\n        }\n        Method {\n            name: \"setInAppStoreProperty\"\n            Parameter { name: \"store\"; type: \"QObject\"; isPointer: true }\n            Parameter { name: \"propertyName\"; type: \"string\" }\n            Parameter { name: \"value\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanTranslationManager\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/TranslationManager 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"sourceDirectory\"; type: \"QUrl\" }\n        Property { name: \"localeName\"; type: \"string\" }\n        Property { name: \"fileName\"; type: \"string\" }\n        Property { name: \"delimiters\"; type: \"string\" }\n        Property { name: \"refresher\"; type: \"string\"; isReadonly: true }\n        Property { name: \"textDirection\"; type: \"int\"; isReadonly: true }\n        Property { name: \"translations\"; type: \"QVariantMap\"; isReadonly: true }\n        Signal { name: \"refreshed\" }\n    }\n    Component {\n        name: \"AsemanWindowDetails\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/WindowDetails 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"window\"; type: \"QWindow\"; isPointer: true }\n        Property { name: \"screen\"; type: \"QScreen\"; isReadonly: true; isPointer: true }\n    }\n    Component {\n        name: \"QScreen\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Base/Screen 2.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        Property { name: \"name\"; type: \"string\"; isReadonly: true }\n        Property { name: \"manufacturer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"model\"; type: \"string\"; isReadonly: true }\n        Property { name: \"serialNumber\"; type: \"string\"; isReadonly: true }\n        Property { name: \"depth\"; type: \"int\"; isReadonly: true }\n        Property { name: \"size\"; type: \"QSize\"; isReadonly: true }\n        Property { name: \"availableSize\"; type: \"QSize\"; isReadonly: true }\n        Property { name: \"virtualSize\"; type: \"QSize\"; isReadonly: true }\n        Property { name: \"availableVirtualSize\"; type: \"QSize\"; isReadonly: true }\n        Property { name: \"geometry\"; type: \"QRect\"; isReadonly: true }\n        Property { name: \"availableGeometry\"; type: \"QRect\"; isReadonly: true }\n        Property { name: \"virtualGeometry\"; type: \"QRect\"; isReadonly: true }\n        Property { name: \"availableVirtualGeometry\"; type: \"QRect\"; isReadonly: true }\n        Property { name: \"physicalSize\"; type: \"QSizeF\"; isReadonly: true }\n        Property { name: \"physicalDotsPerInchX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"physicalDotsPerInchY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"physicalDotsPerInch\"; type: \"double\"; isReadonly: true }\n        Property { name: \"logicalDotsPerInchX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"logicalDotsPerInchY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"logicalDotsPerInch\"; type: \"double\"; isReadonly: true }\n        Property { name: \"devicePixelRatio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"primaryOrientation\"; type: \"Qt::ScreenOrientation\"; isReadonly: true }\n        Property { name: \"orientation\"; type: \"Qt::ScreenOrientation\"; isReadonly: true }\n        Property { name: \"nativeOrientation\"; type: \"Qt::ScreenOrientation\"; isReadonly: true }\n        Property { name: \"refreshRate\"; type: \"double\"; isReadonly: true }\n        Signal {\n            name: \"geometryChanged\"\n            Parameter { name: \"geometry\"; type: \"QRect\" }\n        }\n        Signal {\n            name: \"availableGeometryChanged\"\n            Parameter { name: \"geometry\"; type: \"QRect\" }\n        }\n        Signal {\n            name: \"physicalSizeChanged\"\n            Parameter { name: \"size\"; type: \"QSizeF\" }\n        }\n        Signal {\n            name: \"physicalDotsPerInchChanged\"\n            Parameter { name: \"dpi\"; type: \"double\" }\n        }\n        Signal {\n            name: \"logicalDotsPerInchChanged\"\n            Parameter { name: \"dpi\"; type: \"double\" }\n        }\n        Signal {\n            name: \"virtualGeometryChanged\"\n            Parameter { name: \"rect\"; type: \"QRect\" }\n        }\n        Signal {\n            name: \"primaryOrientationChanged\"\n            Parameter { name: \"orientation\"; type: \"Qt::ScreenOrientation\" }\n        }\n        Signal {\n            name: \"orientationChanged\"\n            Parameter { name: \"orientation\"; type: \"Qt::ScreenOrientation\" }\n        }\n        Signal {\n            name: \"refreshRateChanged\"\n            Parameter { name: \"refreshRate\"; type: \"double\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickFlickable\"\n        name: \"AsemanQml.Base/AsemanFlickable 2.0\"\n        exports: [\"AsemanQml.Base/AsemanFlickable 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"flickableData\"\n        Property { name: \"allTimeMode\"; type: \"bool\" }\n        Property { name: \"tabBarRatio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"tabBarHeight\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"QQuickGridView\"\n        name: \"AsemanQml.Base/AsemanGridView 2.0\"\n        exports: [\"AsemanQml.Base/AsemanGridView 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"tabBarRatio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"tabBarHeight\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"QQuickListView\"\n        name: \"AsemanQml.Base/AsemanListView 2.0\"\n        exports: [\"AsemanQml.Base/AsemanListView 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"allTimeMode\"; type: \"bool\" }\n        Property { name: \"tabBarRatio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"tabBarHeight\"; type: \"double\" }\n        Property { name: \"tabBarMargin\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"AsemanQuickObject\"\n        name: \"AsemanQml.Base/BackAction 2.0\"\n        exports: [\"AsemanQml.Base/BackAction 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"active\"; type: \"bool\" }\n        Property { name: \"callback\"; type: \"QVariant\" }\n        Property { name: \"disableBack\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Base/CachedImage 2.0\"\n        exports: [\"AsemanQml.Base/CachedImage 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"cachedSource\"; type: \"string\"; isReadonly: true }\n        Property { name: \"fileName\"; type: \"string\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"source\"; type: \"string\" }\n        Property { name: \"header\"; type: \"QVariantMap\" }\n        Property { name: \"percent\"; type: \"double\"; isReadonly: true }\n        Property { name: \"fillMode\"; type: \"int\" }\n        Property { name: \"asynchronous\"; type: \"bool\" }\n        Property { name: \"ignoreSslErrors\"; type: \"bool\" }\n        Property { name: \"cache\"; type: \"bool\" }\n        Property { name: \"horizontalAlignment\"; type: \"int\" }\n        Property { name: \"mirror\"; type: \"bool\" }\n        Property { name: \"paintedHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"paintedWidth\"; type: \"double\"; isReadonly: true }\n        Property { name: \"progress\"; type: \"double\"; isReadonly: true }\n        Property { name: \"smooth\"; type: \"bool\" }\n        Property { name: \"sourceSize\"; type: \"QSize\" }\n        Property { name: \"status\"; type: \"int\"; isReadonly: true }\n        Property { name: \"verticalAlignment\"; type: \"int\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Base/CoverList 2.0\"\n        exports: [\"AsemanQml.Base/CoverList 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"itemsWidth\"; type: \"double\" }\n        Property { name: \"itemsPadding\"; type: \"double\" }\n        Property { name: \"originY\"; type: \"double\" }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"internalDelegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"model\"; type: \"QVariant\" }\n        Property { name: \"currentIndex\"; type: \"int\" }\n    }\n    Component {\n        prototype: \"AsemanQuickObject\"\n        name: \"AsemanQml.Base/CrashController 2.0\"\n        exports: [\"AsemanQml.Base/CrashController 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"logLockFile\"; type: \"string\" }\n        Signal { name: \"crashed\" }\n        Signal { name: \"safe\" }\n        Method { name: \"stopMonitoring\"; type: \"QVariant\" }\n        Method { name: \"startMonitoring\"; type: \"QVariant\" }\n        Method { name: \"unlock\"; type: \"QVariant\" }\n        Method { name: \"checkCrash\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickObject\"\n        name: \"AsemanQml.Base/DelayPropertySwitch 2.0\"\n        exports: [\"AsemanQml.Base/DelayPropertySwitch 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"switchProperty\"; type: \"QVariant\" }\n        Property { name: \"targetProperty\"; type: \"QVariant\" }\n        Property { name: \"delay\"; type: \"int\" }\n    }\n    Component {\n        prototype: \"QQuickGridView\"\n        name: \"AsemanQml.Base/FileSystemView 2.0\"\n        exports: [\"AsemanQml.Base/FileSystemView 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"itemsLabelColor\"; type: \"QColor\" }\n        Property { name: \"gridWidth\"; type: \"double\" }\n        Property { name: \"root\"; type: \"string\" }\n        Property { name: \"filters\"; type: \"QStringList\" }\n        Property { name: \"showDotAndDotDot\"; type: \"bool\" }\n        Signal {\n            name: \"clickedOnFile\"\n            Parameter { name: \"fileUrl\"; type: \"QVariant\" }\n        }\n        Method { name: \"back\"; type: \"QVariant\" }\n        Property { name: \"tabBarRatio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"tabBarHeight\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Base/MaterialFrame 2.0\"\n        exports: [\"AsemanQml.Base/MaterialFrame 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"shadowColor\"; type: \"QColor\" }\n    }\n    Component {\n        prototype: \"QQuickMouseArea\"\n        name: \"AsemanQml.Base/NullMouseArea 2.0\"\n        exports: [\"AsemanQml.Base/NullMouseArea 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n    }\n    Component {\n        prototype: \"AsemanQuickObject\"\n        name: \"AsemanQml.Base/PointMapListener 2.0\"\n        exports: [\"AsemanQml.Base/PointMapListener 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"source\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"dest\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"x\"; type: \"double\" }\n        Property { name: \"y\"; type: \"double\" }\n        Property { name: \"result\"; type: \"QPointF\"; isReadonly: true }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Base/RoundedImage 2.0\"\n        exports: [\"AsemanQml.Base/RoundedImage 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"asynchronous\"; type: \"bool\" }\n        Property { name: \"cache\"; type: \"bool\" }\n        Property { name: \"fillMode\"; type: \"int\" }\n        Property { name: \"horizontalAlignment\"; type: \"int\" }\n        Property { name: \"mirror\"; type: \"bool\" }\n        Property { name: \"paintedHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"paintedWidth\"; type: \"double\"; isReadonly: true }\n        Property { name: \"progress\"; type: \"double\"; isReadonly: true }\n        Property { name: \"smooth\"; type: \"bool\" }\n        Property { name: \"source\"; type: \"QUrl\" }\n        Property { name: \"sourceSize\"; type: \"QSize\" }\n        Property { name: \"status\"; type: \"int\"; isReadonly: true }\n        Property { name: \"verticalAlignment\"; type: \"int\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Base/RoundedItem 2.0\"\n        exports: [\"AsemanQml.Base/RoundedItem 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"sceneData\"\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"sceneData\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Base/SelectableList 2.0\"\n        exports: [\"AsemanQml.Base/SelectableList 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"items\"; type: \"QVariant\" }\n        Property { name: \"textsColor\"; type: \"QColor\" }\n        Property { name: \"splitersColor\"; type: \"QColor\" }\n        Property { name: \"itemsHeight\"; type: \"double\" }\n        Property { name: \"nameMethodObject\"; type: \"QVariant\" }\n        Property { name: \"nameMethodFunction\"; type: \"string\" }\n        Property { name: \"debugMode\"; type: \"bool\" }\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Method {\n            name: \"positionViewAtIndex\"\n            type: \"QVariant\"\n            Parameter { name: \"index\"; type: \"QVariant\" }\n            Parameter { name: \"force\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"itemName\"\n            type: \"QVariant\"\n            Parameter { name: \"index\"; type: \"QVariant\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Base/ShadowRectangle 2.0\"\n        exports: [\"AsemanQml.Base/ShadowRectangle 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"shadowSize\"; type: \"double\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"border\"; type: \"QQuickPen\"; isReadonly: true; isPointer: true }\n        Property { name: \"shadowOpacity\"; type: \"double\" }\n        Property { name: \"shadowRadius\"; type: \"double\" }\n        Property { name: \"visibleShadow\"; type: \"bool\" }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Base/qmldir",
    "content": "module AsemanQml.Base\nclassname AsemanQmlPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlbase\ndepends QtQuick 2.0\ndepends QtGraphicalEffects 1.0\ndepends QtQuick.Controls 2.0\ndepends QtQuick.Window 2.2\ndepends QtQuick.Layouts 1.2\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Controls/Beta/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Controls.Beta 3.0'\n\nModule {\n    dependencies: [\"QtQuick 2.0\"]\n    Component {\n        name: \"AsemanQuickAbstractStyle\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Controls.Beta/AbstractStyle 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"padding\"; type: \"AsemanQuickBoxSize\"; isPointer: true }\n        Property { name: \"font\"; type: \"QFont\" }\n        Property { name: \"extra\"; type: \"QVariantMap\" }\n    }\n    Component {\n        name: \"AsemanQuickBoxSize\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Controls.Beta/BoxSize 3.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        Property { name: \"left\"; type: \"int\" }\n        Property { name: \"top\"; type: \"int\" }\n        Property { name: \"right\"; type: \"int\" }\n        Property { name: \"bottom\"; type: \"int\" }\n    }\n    Component {\n        name: \"AsemanQuickColumnLayout\"\n        defaultProperty: \"data\"\n        prototype: \"AsemanQuickLayout\"\n        exports: [\"AsemanQml.Controls.Beta/ColumnLayout 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"spacing\"; type: \"double\" }\n    }\n    Component {\n        name: \"AsemanQuickControlItem\"\n        defaultProperty: \"data\"\n        prototype: \"AsemanQuickStyledItem\"\n        exports: [\"AsemanQml.Controls.Beta/Control 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"nextTabOrder\"; type: \"AsemanQuickControlItem\"; isPointer: true }\n        Property { name: \"focusedInUsingKeyboard\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"focusableUsingKeyboard\"; type: \"bool\" }\n        Property { name: \"focusable\"; type: \"bool\" }\n        Method { name: \"focusNextItem\" }\n        Method { name: \"focusPreviousItem\" }\n    }\n    Component {\n        name: \"AsemanQuickLayout\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Controls.Beta/Layout 3.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        attachedType: \"AsemanQuickLayoutProperty\"\n        Method { name: \"reload\" }\n    }\n    Component {\n        name: \"AsemanQuickLayoutProperty\"\n        prototype: \"QObject\"\n        Property { name: \"fillWidth\"; type: \"bool\" }\n        Property { name: \"fillHeight\"; type: \"bool\" }\n        Property { name: \"preferredWidth\"; type: \"double\" }\n        Property { name: \"preferredHeight\"; type: \"double\" }\n        Property { name: \"leftMargin\"; type: \"double\" }\n        Property { name: \"topMargin\"; type: \"double\" }\n        Property { name: \"rightMargin\"; type: \"double\" }\n        Property { name: \"bottomMargin\"; type: \"double\" }\n        Property { name: \"alignment\"; type: \"int\" }\n        Signal { name: \"changed\" }\n    }\n    Component {\n        name: \"AsemanQuickMainPalette\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Controls.Beta/MainPalette 3.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"Theme\"\n            values: {\n                \"Auto\": 0,\n                \"Light\": 1,\n                \"Dark\": 2\n            }\n        }\n        Property { name: \"theme\"; type: \"int\" }\n        Property { name: \"highlight\"; type: \"QColor\" }\n        Property { name: \"highlightText\"; type: \"QColor\" }\n        Property { name: \"foreground\"; type: \"QColor\" }\n        Property { name: \"background\"; type: \"QColor\" }\n        Property { name: \"base\"; type: \"QColor\" }\n        Property { name: \"baseText\"; type: \"QColor\" }\n    }\n    Component {\n        name: \"AsemanQuickRadioButtonControl\"\n        defaultProperty: \"data\"\n        prototype: \"AsemanQuickControlItem\"\n        exports: [\"AsemanQml.Controls.Beta/RadioControl 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"checked\"; type: \"bool\" }\n    }\n    Component {\n        name: \"AsemanQuickRadioButtonGroup\"\n        defaultProperty: \"items\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Controls.Beta/RadioButtonGroup 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"items\"; type: \"AsemanQuickRadioButtonControl\"; isList: true; isReadonly: true }\n        Method {\n            name: \"addButton\"\n            Parameter { name: \"radio\"; type: \"AsemanQuickRadioButtonControl\"; isPointer: true }\n        }\n        Method {\n            name: \"removeButton\"\n            Parameter { name: \"radio\"; type: \"AsemanQuickRadioButtonControl\"; isPointer: true }\n        }\n    }\n    Component {\n        name: \"AsemanQuickRadioButtonGroupAttachedCreator\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Controls.Beta/ButtonGroup 3.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        attachedType: \"AsemanQuickRadioButtonGroupAttachedProperty\"\n    }\n    Component {\n        name: \"AsemanQuickRadioButtonGroupAttachedProperty\"\n        prototype: \"QObject\"\n        Property { name: \"group\"; type: \"AsemanQuickRadioButtonGroup\"; isPointer: true }\n    }\n    Component {\n        name: \"AsemanQuickRowLayout\"\n        defaultProperty: \"data\"\n        prototype: \"AsemanQuickLayout\"\n        exports: [\"AsemanQml.Controls.Beta/RowLayout 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"layoutDirection\"; type: \"int\" }\n        Property { name: \"spacing\"; type: \"double\" }\n    }\n    Component {\n        name: \"AsemanQuickSceneItem\"\n        defaultProperty: \"data\"\n        prototype: \"AsemanQuickStyledItem\"\n        exports: [\"AsemanQml.Controls.Beta/Scene 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"font\"; type: \"QFont\" }\n    }\n    Component {\n        name: \"AsemanQuickScrollViewCore\"\n        defaultProperty: \"flickArea\"\n        prototype: \"AsemanQuickControlItem\"\n        exports: [\"AsemanQml.Controls.Beta/ScrollViewCore 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"flickArea\"; type: \"QQuickItem\"; isPointer: true }\n    }\n    Component {\n        name: \"AsemanQuickStyleAttachedProperty\"\n        prototype: \"QObject\"\n        Property { name: \"globalFontFamilies\"; type: \"QStringList\" }\n        Property { name: \"accentColor\"; type: \"QColor\" }\n        Property { name: \"accentTextColor\"; type: \"QColor\" }\n        Property { name: \"foregroundColor\"; type: \"QColor\" }\n        Property { name: \"backgroundColor\"; type: \"QColor\" }\n        Property { name: \"primaryColor\"; type: \"QColor\" }\n        Property { name: \"primaryTextColor\"; type: \"QColor\" }\n        Property { name: \"baseColor\"; type: \"QColor\" }\n        Property { name: \"baseTextColor\"; type: \"QColor\" }\n        Property { name: \"styleName\"; type: \"string\" }\n        Property { name: \"stylesSearchPath\"; type: \"QStringList\" }\n        Property { name: \"globalFontPixelSize\"; type: \"int\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"hasRadius\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"styleUrl\"; type: \"QUrl\"; isReadonly: true }\n    }\n    Component {\n        name: \"AsemanQuickStyleProperty\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Controls.Beta/Style 3.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        attachedType: \"AsemanQuickStyleAttachedProperty\"\n    }\n    Component {\n        name: \"AsemanQuickStyledItem\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Controls.Beta/StyledItem 3.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"sourceItem\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"styleComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property {\n            name: \"styleItem\"\n            type: \"AsemanQuickAbstractStyle\"\n            isReadonly: true\n            isPointer: true\n        }\n    }\n    Component {\n        prototype: \"AsemanApplicationItem\"\n        name: \"AsemanQml.Controls.Beta/AsemanApplication 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/AsemanApplication 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n    }\n    Component {\n        prototype: \"QQuickWindowQmlImpl\"\n        name: \"AsemanQml.Controls.Beta/AsemanWindow 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/AsemanWindow 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"backController\"; type: \"bool\" }\n        Property { name: \"try_close\"; type: \"bool\" }\n        Property { name: \"viewport\"; type: \"Viewport_QMLTYPE_1\"; isReadonly: true; isPointer: true }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Signal { name: \"closeRequest\" }\n        Method { name: \"tryClose\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/BottomDrawer 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/BottomDrawer 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"delegate\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"sceneComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"opened\"; type: \"bool\" }\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"openToPrimaryViewport\"; type: \"bool\" }\n        Method { name: \"open\"; type: \"QVariant\" }\n        Method { name: \"close\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/BusyIndicator 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/BusyIndicator 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"running\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/Button 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Button 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"icon\"; type: \"string\" }\n        Property { name: \"font\"; type: \"QFont\" }\n        Property { name: \"iconPixelSize\"; type: \"double\" }\n        Property { name: \"highlighted\"; type: \"bool\" }\n        Property { name: \"flat\"; type: \"bool\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/CheckBox 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/CheckBox 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"checked\"; type: \"bool\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n        Signal { name: \"toggled\" }\n        Method { name: \"toggle\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/CheckBoxDelegate 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/CheckBoxDelegate 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"checked\"; type: \"bool\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n        Signal { name: \"toggled\" }\n        Method { name: \"toggle\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/ComboBox 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/ComboBox 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"delegateStyleFileName\"; type: \"string\" }\n        Property { name: \"textRole\"; type: \"string\" }\n        Property { name: \"displayText\"; type: \"string\" }\n        Property { name: \"currentText\"; type: \"string\"; isReadonly: true }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"flat\"; type: \"bool\" }\n        Property { name: \"model\"; type: \"QVariant\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Property { name: \"popup\"; type: \"MenuPopup_QMLTYPE_20\"; isReadonly: true; isPointer: true }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal {\n            name: \"activated\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/ComboBoxDelegate 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/ComboBoxDelegate 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"selected\"; type: \"bool\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/Dialog 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Dialog 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"delegate\"\n        Property { name: \"sceneStyleComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"sceneStyleFileName\"; type: \"string\" }\n        Property { name: \"title\"; type: \"string\" }\n        Property { name: \"leftPadding\"; type: \"QVariant\" }\n        Property { name: \"rightPadding\"; type: \"QVariant\" }\n        Property { name: \"topPadding\"; type: \"QVariant\" }\n        Property { name: \"bottomPadding\"; type: \"QVariant\" }\n        Property { name: \"buttons\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Signal { name: \"closed\" }\n        Signal { name: \"rejected\" }\n        Signal { name: \"accepted\" }\n        Method { name: \"reject\"; type: \"QVariant\" }\n        Method { name: \"accept\"; type: \"QVariant\" }\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"sceneComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"opened\"; type: \"bool\" }\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"openToPrimaryViewport\"; type: \"bool\" }\n        Method { name: \"open\"; type: \"QVariant\" }\n        Method { name: \"close\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickSceneItem\"\n        name: \"AsemanQml.Controls.Beta/DialogScene 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/DialogScene 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"leftPadding\"; type: \"double\" }\n        Property { name: \"rightPadding\"; type: \"double\" }\n        Property { name: \"topPadding\"; type: \"double\" }\n        Property { name: \"bottomPadding\"; type: \"double\" }\n        Property { name: \"title\"; type: \"string\" }\n        Property { name: \"buttons\"; type: \"QVariant\" }\n        Property { name: \"item\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"scene\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/FloatPage 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/FloatPage 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"delegate\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"sceneComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"opened\"; type: \"bool\" }\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"openToPrimaryViewport\"; type: \"bool\" }\n        Method { name: \"open\"; type: \"QVariant\" }\n        Method { name: \"close\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/Footer 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Footer 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"list\"\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Property { name: \"interactive\"; type: \"bool\" }\n        Property { name: \"list\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/FooterButton 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/FooterButton 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"icon\"; type: \"string\" }\n        Property { name: \"iconPixelSize\"; type: \"double\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/Header 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Header 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"title\"; type: \"string\" }\n        Property { name: \"scene\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/HeaderMenuButton 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/HeaderMenuButton 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"buttonColor\"; type: \"QColor\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n    }\n    Component {\n        prototype: \"QQuickText\"\n        name: \"AsemanQml.Controls.Beta/Icon 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Icon 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/ItemDelegate 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/ItemDelegate 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"scene\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hoverEnabled\"; type: \"bool\" }\n        Property { name: \"pressAndHoldInterval\"; type: \"int\" }\n        Property { name: \"acceptedButtons\"; type: \"int\" }\n        Signal {\n            name: \"clicked\"\n            Parameter { name: \"mouse\"; type: \"QVariant\" }\n        }\n        Signal {\n            name: \"pressAndHold\"\n            Parameter { name: \"mouse\"; type: \"QVariant\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickText\"\n        name: \"AsemanQml.Controls.Beta/Label 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Label 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/Menu 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Menu 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"sceneData\"\n        Property { name: \"sceneData\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"sceneComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"opened\"; type: \"bool\" }\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"openToPrimaryViewport\"; type: \"bool\" }\n        Method { name: \"open\"; type: \"QVariant\" }\n        Method { name: \"close\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/MenuButton 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/MenuButton 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"icon\"; type: \"string\" }\n        Property { name: \"iconPixelSize\"; type: \"double\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/MenuIcon 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/MenuIcon 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"_mirror\"; type: \"bool\"; isReadonly: true }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/MenuPopup 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/MenuPopup 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"delegate\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"sceneComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"opened\"; type: \"bool\" }\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"openToPrimaryViewport\"; type: \"bool\" }\n        Method { name: \"open\"; type: \"QVariant\" }\n        Method { name: \"close\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickSceneItem\"\n        name: \"AsemanQml.Controls.Beta/Page 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Page 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"title\"; type: \"string\" }\n        Property { name: \"header\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"footer\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"scene\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/ProgressBar 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/ProgressBar 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"from\"; type: \"double\" }\n        Property { name: \"to\"; type: \"double\" }\n        Property { name: \"value\"; type: \"double\" }\n        Property { name: \"indeterminate\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"AsemanQuickRadioButtonControl\"\n        name: \"AsemanQml.Controls.Beta/RadioButton 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/RadioButton 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n        Signal { name: \"toggled\" }\n        Method { name: \"toggle\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/ScrollBar 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/ScrollBar 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"flickArea\"; type: \"QQuickFlickable\"; isPointer: true }\n        Property { name: \"orientation\"; type: \"int\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"forceVisible\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"AsemanQuickScrollViewCore\"\n        name: \"AsemanQml.Controls.Beta/ScrollView 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/ScrollView 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"flickArea\"\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/Slider 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Slider 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"from\"; type: \"double\" }\n        Property { name: \"to\"; type: \"double\" }\n        Property { name: \"value\"; type: \"double\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Method { name: \"decrease\"; type: \"QVariant\" }\n        Method { name: \"increase\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls.Beta/StackPage 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/StackPage 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"delegate\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"sceneComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"opened\"; type: \"bool\" }\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"openToPrimaryViewport\"; type: \"bool\" }\n        Method { name: \"open\"; type: \"QVariant\" }\n        Method { name: \"close\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/SwipeView 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/SwipeView 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"list\"\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Property { name: \"interactive\"; type: \"bool\" }\n        Property { name: \"list\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/Switch 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Switch 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"checked\"; type: \"bool\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n        Signal { name: \"toggled\" }\n        Method { name: \"toggle\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/SwitchDelegate 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/SwitchDelegate 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"checked\"; type: \"bool\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n        Signal { name: \"toggled\" }\n        Method { name: \"toggle\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/TabBar 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/TabBar 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"list\"\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Property { name: \"interactive\"; type: \"bool\" }\n        Property { name: \"list\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n    Component {\n        prototype: \"AsemanQuickControlItem\"\n        name: \"AsemanQml.Controls.Beta/TabButton 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/TabButton 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"icon\"; type: \"string\" }\n        Property { name: \"iconPixelSize\"; type: \"double\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"pressedX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressedY\"; type: \"double\"; isReadonly: true }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"hovered\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n    }\n    Component {\n        prototype: \"QQuickTextEdit\"\n        name: \"AsemanQml.Controls.Beta/TextArea 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/TextArea 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"placeholderText\"; type: \"string\" }\n        Signal {\n            name: \"contextMenuRequest\"\n            Parameter { name: \"x\"; type: \"double\" }\n            Parameter { name: \"y\"; type: \"double\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickTextInput\"\n        name: \"AsemanQml.Controls.Beta/TextField 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/TextField 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"styleFileName\"; type: \"string\" }\n        Property { name: \"placeholderText\"; type: \"string\" }\n        Signal {\n            name: \"contextMenuRequest\"\n            Parameter { name: \"x\"; type: \"double\" }\n            Parameter { name: \"y\"; type: \"double\" }\n        }\n    }\n    Component {\n        prototype: \"AsemanViewport\"\n        name: \"AsemanQml.Controls.Beta/ViewportContainer 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/ViewportContainer 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"sceneItems\"\n        Property { name: \"sceneItems\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Property { name: \"androidStyle\"; type: \"bool\" }\n        Property { name: \"mainItem\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"currentItem\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"currentType\"; type: \"string\"; isReadonly: true }\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"list\"; type: \"QVariantList\" }\n        Method {\n            name: \"append\"\n            type: \"QVariant\"\n            Parameter { name: \"component\"; type: \"QVariant\" }\n            Parameter { name: \"properties\"; type: \"QVariant\" }\n            Parameter { name: \"type\"; type: \"QVariant\" }\n        }\n        Method { name: \"closeLast\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickWindowQmlImpl\"\n        name: \"AsemanQml.Controls.Beta/Window 3.0\"\n        exports: [\"AsemanQml.Controls.Beta/Window 3.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"backController\"; type: \"bool\" }\n        Property { name: \"try_close\"; type: \"bool\" }\n        Property { name: \"viewport\"; type: \"Viewport_QMLTYPE_1\"; isReadonly: true; isPointer: true }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Signal { name: \"closeRequest\" }\n        Method { name: \"tryClose\"; type: \"QVariant\" }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Controls/Beta/qmldir",
    "content": "module AsemanQml.Controls.Beta\nclassname AsemanControlsBetaPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlcontrolsbeta\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Controls/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Controls 2.0'\n\nModule {\n    dependencies: [\n        \"QtGraphicalEffects 1.12\",\n        \"QtQml 2.7\",\n        \"QtQml.Models 2.2\",\n        \"QtQml.WorkerScript 2.15\",\n        \"QtQuick 2.9\",\n        \"QtQuick.Controls 2.5\",\n        \"QtQuick.Controls.Fusion 2.15\",\n        \"QtQuick.Controls.Fusion.impl 2.15\",\n        \"QtQuick.Controls.IOSStyle 2.12\",\n        \"QtQuick.Controls.IOSStyle.impl 2.12\",\n        \"QtQuick.Controls.Imagine 2.15\",\n        \"QtQuick.Controls.Imagine.impl 2.15\",\n        \"QtQuick.Controls.Material 2.15\",\n        \"QtQuick.Controls.Material.impl 2.15\",\n        \"QtQuick.Controls.Styles 1.4\",\n        \"QtQuick.Controls.Styles.Plasma 2.0\",\n        \"QtQuick.Controls.Universal 2.15\",\n        \"QtQuick.Controls.Universal.impl 2.15\",\n        \"QtQuick.Controls.impl 2.15\",\n        \"QtQuick.Extras 1.4\",\n        \"QtQuick.Layouts 1.4\",\n        \"QtQuick.Templates 2.5\",\n        \"QtQuick.Window 2.6\",\n        \"org.kde.kconfig 1.0\",\n        \"org.kde.kirigami 2.9\",\n        \"org.kde.kquickcontrolsaddons 2.0\",\n        \"org.kde.plasma.components 3.0\",\n        \"org.kde.plasma.core 2.0\",\n        \"org.kde.plasma.extras 2.0\"\n    ]\n    Component {\n        prototype: \"AsemanApplicationItem\"\n        name: \"AsemanQml.Controls/AsemanApplication 2.0\"\n        exports: [\"AsemanQml.Controls/AsemanApplication 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"items\"\n        Property { name: \"source\"; type: \"QUrl\" }\n        Property { name: \"appMain\"; type: \"QQuickWindow\"; isReadonly: true; isPointer: true }\n    }\n    Component {\n        prototype: \"QQuickApplicationWindow\"\n        name: \"AsemanQml.Controls/AsemanWindow 2.0\"\n        exports: [\"AsemanQml.Controls/AsemanWindow 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"contentData\"\n        Property { name: \"backController\"; type: \"bool\" }\n        Property { name: \"try_close\"; type: \"bool\" }\n        Property { name: \"portrait\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"masterPalette\"; type: \"QQuickSystemPalette\"; isReadonly: true; isPointer: true }\n        Property { name: \"tooltip\"; type: \"Tooltip_QMLTYPE_4\"; isReadonly: true; isPointer: true }\n        Signal { name: \"closeRequest\" }\n        Method { name: \"tryClose\"; type: \"QVariant\" }\n        Method {\n            name: \"showTooltip\"\n            type: \"QVariant\"\n            Parameter { name: \"text\"; type: \"QVariant\" }\n        }\n        Method {\n            name: \"showGlobalWait\"\n            type: \"QVariant\"\n            Parameter { name: \"text\"; type: \"QVariant\" }\n            Parameter { name: \"blockBack\"; type: \"QVariant\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/CircularProgressBar 2.0\"\n        exports: [\"AsemanQml.Controls/CircularProgressBar 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"lineWidth\"; type: \"double\" }\n        Property { name: \"progress\"; type: \"double\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"running\"; type: \"bool\" }\n        Property { name: \"progressText\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/DateTimeChooser 2.0\"\n        exports: [\"AsemanQml.Controls/DateTimeChooser 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"textsColor\"; type: \"QColor\" }\n        Property { name: \"dateVisible\"; type: \"bool\" }\n        Property { name: \"timeVisible\"; type: \"bool\" }\n        Property { name: \"calendarType\"; type: \"int\" }\n        Property { name: \"date\"; type: \"QDateTime\" }\n        Method { name: \"getDate\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/Drawer 2.0\"\n        exports: [\"AsemanQml.Controls/Drawer 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QVariant\" }\n        Property { name: \"handleWidth\"; type: \"double\" }\n        Property { name: \"percent\"; type: \"double\"; isReadonly: true }\n        Property { name: \"showed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"menuWidth\"; type: \"double\" }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Method { name: \"discard\"; type: \"QVariant\" }\n        Method { name: \"show\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/DynamicTabBar 2.0\"\n        exports: [\"AsemanQml.Controls/DynamicTabBar 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"minimumWidth\"; type: \"double\" }\n        Property { name: \"highlightColor\"; type: \"QColor\" }\n        Property { name: \"textColor\"; type: \"QColor\" }\n        Property { name: \"fontSize\"; type: \"double\" }\n        Property { name: \"fontFamily\"; type: \"string\" }\n        Property { name: \"displayRole\"; type: \"string\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"model\"; type: \"QVariant\" }\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Signal {\n            name: \"clicked\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/ExtendedFab 2.0\"\n        exports: [\"AsemanQml.Controls/ExtendedFab 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"fontSize\"; type: \"int\" }\n        Property { name: \"scrollArea\"; type: \"QQuickFlickable\"; isPointer: true }\n        Property { name: \"icon\"; type: \"string\" }\n        Property { name: \"textColor\"; type: \"QColor\" }\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"fontFamily\"; type: \"string\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/HScrollBar 2.0\"\n        exports: [\"AsemanQml.Controls/HScrollBar 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"scrollArea\"; type: \"QVariant\" }\n        Property { name: \"orientation\"; type: \"QVariant\" }\n        Property { name: \"forceVisible\"; type: \"bool\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Method { name: \"position\"; type: \"QVariant\" }\n        Method { name: \"size\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickRectangle\"\n        name: \"AsemanQml.Controls/Header 2.0\"\n        exports: [\"AsemanQml.Controls/Header 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"light\"; type: \"bool\" }\n        Property { name: \"statusBar\"; type: \"bool\" }\n        Property { name: \"centerText\"; type: \"bool\" }\n        Property { name: \"defaultHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"text\"; type: \"string\" }\n        Property { name: \"titleFont\"; type: \"QFont\" }\n        Property { name: \"titleFontSize\"; type: \"int\" }\n        Property { name: \"shadow\"; type: \"bool\" }\n        Property { name: \"shadowOpacity\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/HeaderMenuButton 2.0\"\n        exports: [\"AsemanQml.Controls/HeaderMenuButton 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"buttonColor\"; type: \"QColor\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Signal { name: \"clicked\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/Helper 2.0\"\n        exports: [\"AsemanQml.Controls/Helper 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"borderPadding\"; type: \"double\" }\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Property {\n            name: \"currentItem\"\n            type: \"HelperPoint_QMLTYPE_46\"\n            isReadonly: true\n            isPointer: true\n        }\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"ratio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"duration\"; type: \"int\" }\n        Signal { name: \"finished\" }\n        Method { name: \"next\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/HelperPoint 2.0\"\n        exports: [\"AsemanQml.Controls/HelperPoint 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"title\"; type: \"string\" }\n        Property { name: \"description\"; type: \"string\" }\n        Property { name: \"icon\"; type: \"string\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"titleColor\"; type: \"QColor\" }\n        Property { name: \"descriptionColor\"; type: \"QColor\" }\n        Property { name: \"iconColor\"; type: \"QColor\" }\n        Property { name: \"titleFont\"; type: \"QFont\" }\n        Property { name: \"descriptionFont\"; type: \"QFont\" }\n        Property { name: \"iconFont\"; type: \"QFont\" }\n        Property { name: \"buttonText\"; type: \"string\" }\n        Property { name: \"classId\"; type: \"string\"; isReadonly: true }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/MenuIcon 2.0\"\n        exports: [\"AsemanQml.Controls/MenuIcon 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"_mirror\"; type: \"bool\"; isReadonly: true }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/PanelDrawer 2.0\"\n        exports: [\"AsemanQml.Controls/PanelDrawer 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"item\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"disableBack\"; type: \"bool\" }\n        Property { name: \"handleHeight\"; type: \"double\" }\n        Property { name: \"defaultHeight\"; type: \"double\" }\n        Property { name: \"percent\"; type: \"double\"; isReadonly: true }\n        Property { name: \"maximizable\"; type: \"bool\" }\n        Property { name: \"openFromTop\"; type: \"bool\" }\n        Property { name: \"showed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"menuHeight\"; type: \"double\" }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"maximize\"; type: \"bool\" }\n        Signal { name: \"clicked\" }\n        Method { name: \"discard\"; type: \"QVariant\" }\n        Method { name: \"show\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/PanelFlicker 2.0\"\n        exports: [\"AsemanQml.Controls/PanelFlicker 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"item\"; type: \"QVariant\" }\n        Property { name: \"handleHeight\"; type: \"double\" }\n        Property { name: \"percent\"; type: \"double\"; isReadonly: true }\n        Property { name: \"bottomMenu\"; type: \"bool\" }\n        Property { name: \"showed\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"menuHeight\"; type: \"double\" }\n        Property { name: \"pressed\"; type: \"bool\"; isReadonly: true }\n        Method { name: \"discard\"; type: \"QVariant\" }\n        Method { name: \"show\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickSlider\"\n        name: \"AsemanQml.Controls/Slider 2.0\"\n        exports: [\"AsemanQml.Controls/Slider 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"labelDecimals\"; type: \"int\" }\n        Property { name: \"labelUnit\"; type: \"string\" }\n        Property { name: \"labelVisible\"; type: \"bool\" }\n        Property { name: \"labelOpacity\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/TabView 2.0\"\n        exports: [\"AsemanQml.Controls/TabView 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"minimumTabSize\"; type: \"double\" }\n        Property { name: \"maximumTabSize\"; type: \"double\" }\n        Property { name: \"tabsHeight\"; type: \"double\" }\n        Property { name: \"model\"; type: \"QVariant\" }\n        Property { name: \"currentIndex\"; type: \"int\" }\n    }\n    Component {\n        prototype: \"QQuickTextArea\"\n        name: \"AsemanQml.Controls/TextArea 2.0\"\n        exports: [\"AsemanQml.Controls/TextArea 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"placeholder\"; type: \"string\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/TextCursorArea 2.0\"\n        exports: [\"AsemanQml.Controls/TextCursorArea 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"backgroundColor\"; type: \"QColor\" }\n        Property { name: \"textItem\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"cursorParent\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"selected\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"topPadding\"; type: \"double\" }\n        Property { name: \"menuMap\"; type: \"QVariant\" }\n        Property { name: \"menuMoreMap\"; type: \"QVariant\" }\n        Property { name: \"menuMore\"; type: \"bool\" }\n        Property { name: \"active\"; type: \"bool\" }\n        Method { name: \"hideMenu\"; type: \"QVariant\" }\n        Method { name: \"close\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickTextField\"\n        name: \"AsemanQml.Controls/TextField 2.0\"\n        exports: [\"AsemanQml.Controls/TextField 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"placeholder\"; type: \"string\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Controls/Tooltip 2.0\"\n        exports: [\"AsemanQml.Controls/Tooltip 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"interval\"; type: \"int\" }\n        Property { name: \"padding\"; type: \"double\" }\n        Property { name: \"textFont\"; type: \"QFont\" }\n        Property { name: \"textColor\"; type: \"QColor\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Method {\n            name: \"showText\"\n            type: \"QVariant\"\n            Parameter { name: \"text\"; type: \"QVariant\" }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Controls/qmldir",
    "content": "module AsemanQml.Controls\nclassname AsemanControlsPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlcontrols\ndepends QtQuick 2.0\ndepends QtGraphicalEffects 1.0\ndepends QtQuick.Controls 2.0\ndepends QtQuick.Window 2.2\ndepends QtQuick.Layouts 1.2\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/GraphicalEffects/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.GraphicalEffects 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.0\"]\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.GraphicalEffects/Colorize 2.0\"\n        exports: [\"AsemanQml.GraphicalEffects/Colorize 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"source\"; type: \"QVariant\" }\n        Property { name: \"hue\"; type: \"double\" }\n        Property { name: \"saturation\"; type: \"double\" }\n        Property { name: \"lightness\"; type: \"double\" }\n        Property { name: \"cached\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.GraphicalEffects/DropShadow 2.0\"\n        exports: [\"AsemanQml.GraphicalEffects/DropShadow 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"fast\"; type: \"bool\" }\n        Property { name: \"source\"; type: \"QVariant\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"samples\"; type: \"int\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"horizontalOffset\"; type: \"double\" }\n        Property { name: \"verticalOffset\"; type: \"double\" }\n        Property { name: \"spread\"; type: \"double\" }\n        Property { name: \"cached\"; type: \"bool\" }\n        Property { name: \"transparentBorder\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.GraphicalEffects/FastBlur 2.0\"\n        exports: [\"AsemanQml.GraphicalEffects/FastBlur 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"source\"; type: \"QVariant\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"transparentBorder\"; type: \"bool\" }\n        Property { name: \"cached\"; type: \"bool\" }\n        Property { name: \"__internalBlurVertexShader\"; type: \"string\" }\n        Property { name: \"__internalBlurFragmentShader\"; type: \"string\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.GraphicalEffects/OpacityMask 2.0\"\n        exports: [\"AsemanQml.GraphicalEffects/OpacityMask 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"source\"; type: \"QVariant\" }\n        Property { name: \"maskSource\"; type: \"QVariant\" }\n        Property { name: \"cached\"; type: \"bool\" }\n        Property { name: \"invert\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.GraphicalEffects/ThresholdMask 2.0\"\n        exports: [\"AsemanQml.GraphicalEffects/ThresholdMask 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"source\"; type: \"QVariant\" }\n        Property { name: \"maskSource\"; type: \"QVariant\" }\n        Property { name: \"threshold\"; type: \"double\" }\n        Property { name: \"spread\"; type: \"double\" }\n        Property { name: \"cached\"; type: \"bool\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.GraphicalEffects/RadialGradient 2.0\"\n        exports: [\"AsemanQml.GraphicalEffects/RadialGradient 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"source\"; type: \"QVariant\" }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/GraphicalEffects/qmldir",
    "content": "module AsemanQml.GraphicalEffects\nclassname AsemanGraphicalEffectsPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlgraphicalffects\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/MaterialIcons/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.MaterialIcons 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.8\"]\n    Component {\n        prototype: \"QObject\"\n        name: \"AsemanQml.MaterialIcons/MaterialIcons 2.0\"\n        exports: [\"AsemanQml.MaterialIcons/MaterialIcons 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        isCreatable: false\n        isSingleton: true\n        defaultProperty: \"items\"\n        Property { name: \"family\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_3d_rotation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_ac_unit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_access_alarm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_access_alarms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_access_time\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_accessibility\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_accessible\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_account_balance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_account_balance_wallet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_account_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_account_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_adb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_a_photo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_alarm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_location\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_shopping_cart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_to_photos\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_to_queue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_adjust\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_flat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_flat_angled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_individual_suite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_legroom_extra\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_legroom_normal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_legroom_reduced\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_recline_extra\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_recline_normal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airplanemode_active\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airplanemode_inactive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airplay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airport_shuttle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_alarm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_alarm_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_alarm_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_alarm_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_album\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_all_inclusive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_all_out\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_android\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_announcement\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_apps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_archive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_arrow_back\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_arrow_downward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_arrow_drop_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_arrow_drop_down_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_arrow_drop_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_arrow_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_arrow_upward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_art_track\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_aspect_ratio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assessment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assignment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assignment_ind\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assignment_late\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assignment_return\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assignment_returned\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assignment_turned_in\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assistant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assistant_photo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_attach_file\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_attach_money\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_attachment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_audiotrack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_autorenew\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_av_timer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_backspace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_backup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_battery_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_battery_charging_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_battery_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_battery_std\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_battery_unknown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_beach_access\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_beenhere\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_block\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bluetooth_audio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bluetooth_connected\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bluetooth_disabled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bluetooth_searching\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_blur_circular\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_blur_linear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_blur_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_blur_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_book\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bookmark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bookmark_border\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_bottom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_clear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_color\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_inner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_outer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_style\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_branding_watermark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_7\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_high\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_low\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_broken_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brush\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bubble_chart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bug_report\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_build\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_burst_mode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_business\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_business_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cached\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cake\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_made\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_merge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_missed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_missed_outgoing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_received\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_split\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_to_action\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_camera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_camera_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_camera_enhance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_camera_front\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_camera_rear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_camera_roll\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cancel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_card_giftcard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_card_membership\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_card_travel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_casino\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cast_connected\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_center_focus_strong\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_center_focus_weak\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_change_history\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_chat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_chat_bubble\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_chat_bubble_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_check_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_check_box_outline_blank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_check_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_chevron_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_chevron_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_child_care\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_child_friendly\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_chrome_reader_mode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_class\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_clear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_clear_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_closed_caption\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cloud_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cloud_done\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cloud_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cloud_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cloud_queue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cloud_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_code\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_collections\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_collections_bookmark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_color_lens\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_colorize\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_comment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_compare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_compare_arrows\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_computer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_confirmation_number\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_contact_mail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_contact_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_contacts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_content_copy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_content_cut\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_content_paste\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_control_point\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_control_point_duplicate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_copyright\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_create\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_create_new_folder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_credit_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_16_9\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_3_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_5_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_7_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_din\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_free\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_landscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_original\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_rotate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_dashboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_data_usage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_date_range\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_dehaze\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_delete\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_delete_forever\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_delete_sweep\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_description\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_desktop_mac\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_desktop_windows\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_details\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_developer_board\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_developer_mode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_device_hub\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_devices\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_devices_other\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_dialer_sip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_dialpad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_bike\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_boat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_bus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_car\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_railway\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_run\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_subway\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_transit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_walk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_disc_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_dns\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_do_not_disturb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_do_not_disturb_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_do_not_disturb_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_do_not_disturb_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_dock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_domain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_done\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_done_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_donut_large\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_donut_small\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_drafts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_drag_handle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_drive_eta\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_dvr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_edit_location\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_eject\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_email\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_enhanced_encryption\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_equalizer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_error\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_error_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_euro_symbol\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_ev_station\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_event\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_event_available\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_event_busy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_event_note\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_event_seat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_exit_to_app\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_expand_less\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_expand_more\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_explicit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_explore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_exposure\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_exposure_neg_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_exposure_neg_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_exposure_plus_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_exposure_plus_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_exposure_zero\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_extension\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_face\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fast_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fast_rewind\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_favorite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_favorite_border\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_featured_play_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_featured_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_feedback\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fiber_dvr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fiber_manual_record\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fiber_new\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fiber_pin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fiber_smart_record\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_file_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_file_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_7\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_8\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_9\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_9_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_b_and_w\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_center_focus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_drama\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_frames\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_hdr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_tilt_shift\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_vintage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_find_in_page\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_find_replace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fingerprint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_first_page\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fitness_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flash_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flash_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flash_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flight_land\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flight_takeoff\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flip_to_back\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flip_to_front\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_folder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_folder_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_folder_shared\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_folder_special\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_font_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_align_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_align_justify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_align_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_align_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_clear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_color_fill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_color_reset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_color_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_indent_decrease\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_indent_increase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_italic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_line_spacing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_list_bulleted\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_list_numbered\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_paint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_quote\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_shapes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_size\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_strikethrough\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_textdirection_l_to_r\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_textdirection_r_to_l\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_underlined\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_forum\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_forward_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_forward_30\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_forward_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_free_breakfast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fullscreen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fullscreen_exit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_functions\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_g_translate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gamepad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_games\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gavel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gesture\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_get_app\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gif\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_golf_course\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gps_fixed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gps_not_fixed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gps_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_grade\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gradient\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_grain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_graphic_eq\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_grid_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_grid_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_group_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_group_work\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hdr_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hdr_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hdr_strong\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hdr_weak\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_headset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_headset_mic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_healing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hearing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_help\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_help_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_high_quality\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_highlight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_highlight_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_history\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_home\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hot_tub\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hotel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hourglass_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hourglass_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_http\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_https\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_image_aspect_ratio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_import_contacts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_import_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_important_devices\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_inbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_indeterminate_check_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_info\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_info_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_input\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_insert_chart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_insert_comment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_insert_drive_file\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_insert_emoticon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_insert_invitation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_insert_link\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_insert_photo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_invert_colors\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_invert_colors_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_iso\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_arrow_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_backspace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_capslock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_hide\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_return\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_tab\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_voice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_kitchen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_label\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_label_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_landscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_language\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_laptop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_laptop_chromebook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_laptop_mac\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_laptop_windows\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_last_page\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_launch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_layers\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_layers_clear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_leak_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_leak_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_lens\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_library_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_library_books\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_library_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_lightbulb_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_line_style\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_line_weight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_linear_scale\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_link\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_linked_camera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_live_help\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_live_tv\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_activity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_airport\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_atm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_bar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_cafe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_car_wash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_convenience_store\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_dining\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_drink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_florist\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_gas_station\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_grocery_store\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_hospital\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_hotel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_laundry_service\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_library\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_mall\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_movies\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_offer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_parking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_pharmacy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_pizza\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_post_office\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_printshop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_see\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_shipping\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_taxi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_location_city\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_location_disabled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_location_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_location_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_location_searching\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_lock_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_lock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_looks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_looks_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_looks_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_looks_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_looks_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_looks_one\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_looks_two\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_loop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_loupe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_low_priority\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_loyalty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mail_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_map\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_markunread\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_markunread_mailbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_memory\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_menu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_merge_type\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_message\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mic_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mic_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mode_comment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mode_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_monetization_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_money_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_monochrome_photos\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mood\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mood_bad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_more\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_more_horiz\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_more_vert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_motorcycle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mouse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_move_to_inbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_movie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_movie_creation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_movie_filter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_multiline_chart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_music_note\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_music_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_my_location\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_nature\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_nature_people\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_navigate_before\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_navigate_next\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_navigation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_near_me\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_network_cell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_network_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_network_locked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_network_wifi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_new_releases\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_next_week\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_nfc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_no_encryption\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_no_sim\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_not_interested\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_note\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_note_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_notifications\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_notifications_active\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_notifications_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_notifications_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_notifications_paused\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_offline_pin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_ondemand_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_opacity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_open_in_browser\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_open_in_new\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_open_with\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pages\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pageview\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_palette\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pan_tool\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_panorama\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_panorama_fish_eye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_panorama_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_panorama_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_panorama_wide_angle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_party_mode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pause\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pause_circle_filled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pause_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_payment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_people\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_people_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_camera_mic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_contact_calendar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_data_setting\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_device_information\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_identity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_media\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_phone_msg\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_scan_wifi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_person\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_person_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_person_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_person_pin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_person_pin_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_personal_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pets\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_android\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_bluetooth_speaker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_forwarded\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_in_talk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_iphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_locked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_missed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_paused\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phonelink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phonelink_erase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phonelink_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phonelink_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phonelink_ring\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phonelink_setup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo_album\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo_camera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo_filter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo_library\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo_size_select_actual\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo_size_select_large\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo_size_select_small\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_picture_as_pdf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_picture_in_picture\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_picture_in_picture_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pie_chart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pie_chart_outlined\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pin_drop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_place\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_play_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_play_circle_filled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_play_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_play_for_work\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_playlist_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_playlist_add_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_playlist_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_plus_one\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_poll\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_polymer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pool\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_portable_wifi_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_power\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_power_input\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_power_settings_new\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pregnant_woman\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_present_to_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_print\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_priority_high\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_public\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_publish\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_query_builder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_question_answer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_queue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_queue_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_queue_play_next\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_radio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_radio_button_checked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_radio_button_unchecked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rate_review\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_receipt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_recent_actors\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_record_voice_over\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_redeem\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_redo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_refresh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_remove_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_remove_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_remove_from_queue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_remove_red_eye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_remove_shopping_cart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_reorder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_repeat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_repeat_one\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_replay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_replay_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_replay_30\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_replay_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_reply\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_reply_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_report\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_report_problem\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_restaurant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_restaurant_menu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_restore_page\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_ring_volume\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_room\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_room_service\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rotate_90_degrees_ccw\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rotate_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rotate_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rounded_corner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_router\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rowing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rss_feed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rv_hookup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_satellite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_save\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_scanner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_schedule\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_school\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_screen_lock_landscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_screen_lock_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_screen_lock_rotation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_screen_rotation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_screen_share\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sd_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sd_storage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_security\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_select_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_send\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sentiment_dissatisfied\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sentiment_neutral\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sentiment_satisfied\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sentiment_very_dissatisfied\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sentiment_very_satisfied\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_applications\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_backup_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_brightness\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_cell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_ethernet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_input_antenna\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_input_component\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_input_composite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_input_hdmi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_input_svideo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_overscan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_power\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_remote\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_system_daydream\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_voice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_share\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_shop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_shop_two\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_shopping_basket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_shopping_cart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_short_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_show_chart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_shuffle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_signal_cellular_4_bar\"; type: \"string\"; isReadonly: true }\n        Property {\n            name: \"mi_signal_cellular_connected_no_internet_4_bar\"\n            type: \"string\"\n            isReadonly: true\n        }\n        Property { name: \"mi_signal_cellular_no_sim\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_signal_cellular_null\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_signal_cellular_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_signal_wifi_4_bar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_signal_wifi_4_bar_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_signal_wifi_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sim_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sim_card_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_skip_next\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_skip_previous\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_slideshow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_slow_motion_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_smartphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_smoke_free\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_smoking_rooms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sms_failed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_snooze\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sort\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sort_by_alpha\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_spa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_space_bar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_speaker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_speaker_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_speaker_notes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_speaker_notes_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_speaker_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_spellcheck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_star_border\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_star_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_stars\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_stay_current_landscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_stay_current_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_stay_primary_landscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_stay_primary_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_stop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_stop_screen_share\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_storage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_store\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_store_mall_directory\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_straighten\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_streetview\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_strikethrough_s\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_style\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_subdirectory_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_subdirectory_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_subject\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_subscriptions\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_subtitles\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_subway\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_supervisor_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_surround_sound\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_swap_calls\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_swap_horiz\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_swap_vert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_swap_vertical_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_switch_camera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_switch_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sync\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sync_disabled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sync_problem\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_system_update\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_system_update_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tab\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tab_unselected\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tablet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tablet_android\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tablet_mac\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tag_faces\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tap_and_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_terrain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_text_fields\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_text_format\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_textsms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_texture\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_theaters\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_thumb_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_thumb_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_thumbs_up_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_time_to_leave\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_timelapse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_timeline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_timer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_timer_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_timer_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_timer_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_title\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_toc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_today\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_toll\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tonality\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_touch_app\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_toys\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_track_changes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_traffic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_train\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_transfer_within_a_station\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_transform\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_translate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_trending_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_trending_flat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_trending_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tune\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_turned_in\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_turned_in_not\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tv\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_unarchive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_undo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_unfold_less\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_unfold_more\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_update\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_usb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_verified_user\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_vertical_align_bottom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_vertical_align_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_vertical_align_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_vibration\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_video_call\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_video_label\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_video_library\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_videocam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_videocam_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_videogame_asset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_agenda\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_array\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_carousel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_column\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_comfy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_compact\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_day\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_headline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_module\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_quilt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_stream\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_week\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_vignette\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_visibility\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_visibility_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_voice_chat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_voicemail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_volume_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_volume_mute\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_volume_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_volume_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_vpn_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_vpn_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wallpaper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_warning\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_watch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_watch_later\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wb_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wb_cloudy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wb_incandescent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wb_iridescent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wb_sunny\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_web\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_web_asset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_weekend\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_whatshot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_widgets\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wifi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wifi_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wifi_tethering\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_work\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wrap_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_youtube_searched_for\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_zoom_in\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_zoom_out\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_zoom_out_map\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_access_point\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_access_point_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_access_point_network_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_arrow_left_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_arrow_right_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_badge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_badge_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_badge_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_badge_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_box_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_card_details\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_card_details_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_child\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_child_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_clock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_convert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_details\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_group_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_heart_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_key_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_minus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_multiple_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_multiple_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_multiple_minus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_multiple_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_multiple_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_question\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_question_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_star_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_supervisor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_supervisor_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_tie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_accusoft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_adchoices\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_adjust\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_adobe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_air_conditioner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_air_filter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_air_horn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_air_purifier\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airbag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airballoon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airplane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airplane_landing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airplane_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airplane_takeoff\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airplay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airport\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_bell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_light\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_light_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_snooze\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_album\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_decagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_decagram_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_octagon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_octagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_octagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_octagram_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alien\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_all_inclusive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_a\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_a_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_a_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_a_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_a_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_b\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_b_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_b_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_b_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_b_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_c\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_c_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_c_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_c_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_c_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_d\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_d_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_d_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_d_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_d_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_e\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_e_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_e_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_e_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_e_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_f\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_f_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_f_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_f_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_f_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_g_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_g_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_g_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_g_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_h\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_h_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_h_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_h_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_h_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_i\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_i_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_i_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_i_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_i_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_j\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_j_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_j_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_j_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_j_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_k\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_k_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_k_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_k_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_k_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_l\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_l_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_l_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_l_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_l_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_m\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_m_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_m_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_m_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_m_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_n\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_n_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_n_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_n_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_n_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_o\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_o_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_o_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_o_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_o_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_p\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_p_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_p_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_p_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_p_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_q\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_q_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_q_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_q_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_q_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_r\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_r_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_r_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_r_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_r_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_s\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_s_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_s_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_s_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_s_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_t\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_t_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_t_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_t_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_t_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_u\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_u_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_u_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_u_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_u_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_v\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_v_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_v_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_v_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_v_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_w\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_w_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_w_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_w_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_w_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_x\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_x_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_x_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_x_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_x_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_y\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_y_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_y_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_y_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_y_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_z\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_z_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_z_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_z_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_z_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alphabetical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_altimeter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_amazon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_amazon_alexa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_amazon_drive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ambulance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ammunition\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ampersand\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_amplifier\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_anchor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_android\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_android_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_android_debug_bridge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_android_head\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_android_messages\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_android_studio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_angle_acute\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_angle_obtuse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_angle_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_angular\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_angularjs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_animation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_animation_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_animation_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_animation_play_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_anvil\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_finder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_icloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_ios\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_keyboard_caps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_keyboard_command\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_keyboard_control\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_keyboard_option\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_keyboard_shift\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_safari\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_application\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_application_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_application_import\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apps_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_archive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrange_bring_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrange_bring_to_front\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrange_send_backward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrange_send_to_back\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_bottom_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_bottom_left_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_bottom_left_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_bottom_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_bottom_right_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_bottom_right_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_decision\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_decision_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_decision_auto_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_decision_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_bold_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_bold_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_bold_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_bold_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_bold_hexagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_drop_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_drop_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_bold_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_bold_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_bold_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_bold_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_bold_hexagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_drop_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_drop_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_right_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_bold_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_bold_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_bold_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_bold_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_bold_hexagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_drop_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_drop_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_split_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_split_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_top_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_top_left_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_top_left_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_top_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_top_right_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_top_right_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_bold_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_bold_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_bold_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_bold_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_bold_hexagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_down_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_drop_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_drop_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_artist\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_artist_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_artstation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_aspect_ratio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_assistant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_asterisk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_at\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_atlassian\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_atm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_atom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_attachment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_audio_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_audiobook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_augmented_reality\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_auto_fix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_auto_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_autorenew\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_av_timer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_arrow_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_x_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_x_arrow_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_x_rotate_clockwise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_x_rotate_counterclockwise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_x_y_arrow_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_y_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_y_arrow_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_y_rotate_clockwise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_y_rotate_counterclockwise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_z_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_z_arrow_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_z_rotate_clockwise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_z_rotate_counterclockwise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_azure\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_babel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_baby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_baby_buggy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_backburger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_backspace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_backspace_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_backup_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_badminton\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_balloon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ballot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ballot_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ballot_recount\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ballot_recount_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bandage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bandcamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bank_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bank_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bank_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bank_transfer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bank_transfer_in\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bank_transfer_out\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_barcode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_barcode_scan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_barley\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_barley_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_barn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_barrel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_baseball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_baseball_bat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_basecamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_basket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_basket_fill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_basket_unfill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_basketball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_basketball_hoop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_basketball_hoop_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_10_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_20\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_20_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_30\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_30_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_40\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_40_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_50\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_50_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_60\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_60_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_70\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_70_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_80\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_80_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_90\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_90_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_alert_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_bluetooth_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_100\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_20\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_30\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_40\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_50\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_60\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_70\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_80\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_90\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_20\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_30\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_40\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_50\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_60\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_70\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_80\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_90\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_negative\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_positive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_unknown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_unknown_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battlenet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_beach\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_beaker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_beaker_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_beats\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bed_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_beer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_behance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_ring\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_ring_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_sleep\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_sleep_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_beta\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_betamax\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bible\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bike\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_billiards\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_billiards_rack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_binoculars\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_biohazard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bitbucket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bitcoin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_black_mesa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blackberry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blender\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blender_software\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blinds\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_block_helper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blogger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blood_bag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bluetooth_audio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bluetooth_connect\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bluetooth_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bluetooth_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bluetooth_transfer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blur\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blur_linear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blur_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blur_radial\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bolnisi_cross\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bolt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bomb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bomb_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_lock_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_multiple_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_multiple_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_multiple_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_multiple_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_open_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_open_page_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_open_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_minus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_boombox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bootstrap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_all_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_bottom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_bottom_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_color\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_inside\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_left_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_none_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_outside\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_right_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_style\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_top_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bottle_wine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bow_tie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bowl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bowling\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_box_cutter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_box_shadow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_boxing_glove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_braille\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bread_slice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bread_slice_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bridge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_account_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_download_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_edit_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_minus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_upload_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_7\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_percent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_broom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brush\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_buddhism\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_buffer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bug\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bug_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bug_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bug_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bugle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bulldozer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bullet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bulletin_board\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bullhorn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bullhorn_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bullseye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bullseye_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus_articulated_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus_articulated_front\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus_double_decker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus_school\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus_side\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cached\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cactus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cake\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cake_layered\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cake_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calculator\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calculator_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_blank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_blank_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_import\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_multiple_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_multiselect\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_question\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_range\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_range_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_today\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_week\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_week_begin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_call_made\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_call_merge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_call_missed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_call_received\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_call_split\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camcorder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camcorder_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camcorder_box_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camcorder_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_burst\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_control\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_enhance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_enhance_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_front\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_front_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_gopro\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_iris\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_metering_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_metering_matrix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_metering_partial\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_metering_spot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_party_mode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_rear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_rear_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_timer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_wireless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_wireless_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cancel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_candle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_candycane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cannabis\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_caps_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_battery\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_brake_abs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_brake_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_brake_hold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_brake_parking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_connected\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_convertible\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_cruise_control\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_defrost_front\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_defrost_rear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_door\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_electric\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_esp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_estate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_hatchback\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_light_dimmed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_light_fog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_light_high\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_limousine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_parking_lights\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_pickup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_side\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_sports\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_tire_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_traction_control\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_wash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_caravan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_bulleted\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_bulleted_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_bulleted_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_bulleted_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_bulleted_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_bulleted_settings_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards_club\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards_diamond\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards_playing_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards_spade\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_carrot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_carry_on_bag_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_arrow_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_case_sensitive_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cash_100\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cash_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cash_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cash_refund\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cash_register\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cash_usd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cassette\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cast_connected\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cast_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_castle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cctv\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ceiling_light\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_android\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_basic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_dock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_erase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_iphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_link\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_link_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_message\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_screenshot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_settings_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_sound\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_wireless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_celtic_cross\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_certificate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chair_school\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_charity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_arc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_areaspline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_bar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_bar_stacked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_bell_curve\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_bubble\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_donut\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_donut_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_gantt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_histogram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_line\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_line_stacked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_line_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_multiline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_pie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_scatterplot_hexbin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_timeline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chat_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chat_processing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_decagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_blank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_blank_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_blank_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_blank_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_intermediate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_marked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_marked_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_marked_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_marked_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_multiple_blank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_multiple_blank_circle\"; type: \"string\"; isReadonly: true }\n        Property {\n            name: \"mdi_checkbox_multiple_blank_circle_outline\"\n            type: \"string\"\n            isReadonly: true\n        }\n        Property { name: \"mdi_checkbox_multiple_blank_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_multiple_marked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_multiple_marked_circle\"; type: \"string\"; isReadonly: true }\n        Property {\n            name: \"mdi_checkbox_multiple_marked_circle_outline\"\n            type: \"string\"\n            isReadonly: true\n        }\n        Property { name: \"mdi_checkbox_multiple_marked_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkerboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chef_hat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chemical_weapon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chess_bishop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chess_king\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chess_knight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chess_pawn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chess_queen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chess_rook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_double_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_double_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_double_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_double_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_down_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_down_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_down_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_down_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_left_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_left_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_left_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_left_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_right_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_right_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_right_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_right_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_triple_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_triple_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_triple_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_triple_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_up_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_up_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_up_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_up_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chili_hot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chili_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chili_mild\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_christianity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_christianity_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_church\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_edit_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_7\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_8\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_small\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cisco_webex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_city\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_city_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_city_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_account_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_down_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_left_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_right_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_up_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_flow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_play_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_pulse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_pulse_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_text_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_text_play_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clippy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_fast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_in\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_out\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_start\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_box_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_octagon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_octagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_closed_caption\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_closed_caption_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_braces\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_download_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_print\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_print_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_question\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_sync\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_tags\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_upload_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clover\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_array\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_braces\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_brackets\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_greater_than\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_greater_than_or_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_less_than\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_less_than_or_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_not_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_not_equal_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_parentheses\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_string\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_tags\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_tags_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_codepen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_coffee\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_coffee_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_coffee_to_go\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_coffin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cogs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_coin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_coins\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_collage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_collapse_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_collapse_all_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_color_helper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_account_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_arrow_left_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_arrow_right_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_eye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_eye_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_processing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_processing_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_question\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_question_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_text_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_text_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_compare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_compass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_compass_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_compass_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_compass_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_console\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_console_line\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_console_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_console_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contact_mail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contactless_payment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contacts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contain_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contain_start\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_copy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_cut\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_duplicate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_paste\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_save\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_save_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_save_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_save_edit_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_save_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_save_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_save_settings_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contrast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contrast_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contrast_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_controller_classic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_controller_classic_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cookie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_copyright\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cordova\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_corn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_counter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_creation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_creative_commons\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_refund\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_scan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_wireless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cricket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crop_free\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crop_landscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crop_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crop_rotate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crop_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crosshairs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crosshairs_gps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cryengine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crystal_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cube\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cube_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cube_scan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cube_send\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cube_unfolded\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cup_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cup_water\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cupcake\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_curling\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_bdt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_brl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_btc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_chf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_cny\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_eth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_eur\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_gbp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_ils\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_inr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_jpy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_krw\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_kzt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_ngn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_php\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_rub\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_try\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_twd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_usd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_usd_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_current_ac\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_current_dc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cursor_default\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cursor_default_click\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cursor_default_click_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cursor_default_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cursor_move\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cursor_pointer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cursor_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_import\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_refresh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_death_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_death_star_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_deathly_hallows\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_debian\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_debug_step_into\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_debug_step_out\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_debug_step_over\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_decagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_decagram_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_decimal_decrease\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_decimal_increase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_forever\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_forever_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_sweep\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_sweep_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delta\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_desk_lamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_deskphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_desktop_classic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_desktop_mac\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_desktop_mac_dashboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_desktop_tower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_desktop_tower_monitor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_details\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dev_to\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_developer_board\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_deviantart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dialpad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diameter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diameter_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diameter_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diamond\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diamond_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diamond_stone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_d10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_d12\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_d20\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_d4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_d6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_d8\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dictionary\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dip_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_directions\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_directions_fork\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_disc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_disc_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_disc_player\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_discord\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dishwasher\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_disqus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_disqus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diving_flippers\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diving_helmet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diving_scuba\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diving_scuba_flag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diving_scuba_tank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diving_scuba_tank_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diving_snorkel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_division\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_division_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dlna\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dna\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dns\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dns_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_do_not_disturb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_do_not_disturb_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_docker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_doctor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dog_service\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dog_side\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dolby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_domain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_domain_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_donkey\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_door\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_door_closed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_door_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_doorbell_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dot_net\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dots_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dots_horizontal_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dots_horizontal_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dots_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dots_vertical_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dots_vertical_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_douban\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_download_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_download_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_download_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_download_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drag_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drag_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drag_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drama_masks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drawing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drawing_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dribbble\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dribbble_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dropbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drupal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_duck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dumbbell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dump_truck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ear_hearing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ear_hearing_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_earth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_earth_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_earth_box_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_earth_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_edge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_egg\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_egg_easter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eight_track\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eject\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eject_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_elephant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_elevation_decline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_elevation_rise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_elevator\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_mark_as_unread\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_open_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ember\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_angry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_angry_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_cool\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_cool_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_cry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_cry_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_dead\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_dead_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_devil\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_devil_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_excited\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_excited_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_happy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_happy_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_kiss\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_kiss_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_neutral\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_neutral_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_poop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_poop_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_sad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_sad_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_tongue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_tongue_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_wink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_wink_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_engine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_engine_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_engine_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_engine_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_equal_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eraser\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eraser_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_escalator\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eslint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_et\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ethereum\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ethernet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ethernet_cable\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ethernet_cable_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_etsy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ev_station\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eventbrite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_evernote\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_exclamation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_exit_run\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_exit_to_app\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_expand_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_expand_all_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_exponent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_exponent_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_export_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_settings_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eyedropper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eyedropper_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_face\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_face_agent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_face_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_face_profile\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_face_recognition\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_facebook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_facebook_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_facebook_messenger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_facebook_workplace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_factory\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fan_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fast_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fast_forward_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fast_forward_30\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fast_forward_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fax\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_feather\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_feature_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_feature_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fedora\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ferry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_cabinet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_cancel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_cancel_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_chart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_cloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_compare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_delimited\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document_box_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document_edit_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_download_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_excel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_excel_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_eye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_eye_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_find\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_find_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_hidden\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_import\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_move\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_pdf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_pdf_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_percent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_powerpoint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_powerpoint_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_presentation_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_question\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_replace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_replace_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_send\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_table\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_table_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_tree\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_undo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_upload_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_word\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_word_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_xml\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_film\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_filmstrip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_filmstrip_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_filter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_filter_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_filter_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_filter_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_filter_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_finance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_find_replace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fingerprint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fire\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fire_truck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_firebase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_firefox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fish\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_checkered\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_triangle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flash_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flash_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flash_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flash_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flash_red_eye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flashlight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flashlight_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flask\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flask_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flask_empty_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flask_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flattr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flickr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flip_to_back\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flip_to_front\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_floor_lamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_floor_plan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_floppy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_floppy_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flower_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flower_poppy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flower_tulip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flower_tulip_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_account_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_clock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_edit_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_google_drive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_key_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_key_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_lock_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_move\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_multiple_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_open_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_pound\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_pound_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_star_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_sync\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_sync_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_font_awesome\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_food\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_food_apple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_food_apple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_food_croissant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_food_fork_drink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_food_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_food_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_football\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_football_australian\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_football_helmet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_forklift\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_align_bottom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_align_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_align_justify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_align_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_align_middle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_align_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_align_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_annotation_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_annotation_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_clear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_color_fill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_color_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_columns\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_float_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_float_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_float_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_float_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_font\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_font_size_decrease\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_font_size_increase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_decrease\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_increase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_pound\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_horizontal_align_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_horizontal_align_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_horizontal_align_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_indent_decrease\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_indent_increase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_italic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_letter_case\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_letter_case_lower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_letter_case_upper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_line_spacing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_line_style\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_line_weight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_list_bulleted\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_list_bulleted_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_list_bulleted_type\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_list_checkbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_list_checks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_list_numbered\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_list_numbered_rtl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_page_break\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_paint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_paragraph\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_pilcrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_quote_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_quote_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_rotate_90\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_section\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_size\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_strikethrough\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_strikethrough_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_subscript\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_superscript\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_text_rotation_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_text_rotation_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_text_wrapping_clip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_text_wrapping_overflow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_text_wrapping_wrap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_textbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_textdirection_l_to_r\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_textdirection_r_to_l\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_title\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_underline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_vertical_align_bottom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_vertical_align_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_vertical_align_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_wrap_inline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_wrap_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_wrap_tight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_wrap_top_bottom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_forum\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_forum_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_forwardburger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fountain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fountain_pen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fountain_pen_tip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_foursquare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_freebsd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fridge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fridge_bottom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fridge_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fridge_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fuel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fullscreen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fullscreen_exit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_function\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_function_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fuse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fuse_blade\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gamepad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gamepad_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gantry_crane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_garage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_garage_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_garage_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gas_cylinder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gas_station\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate_and\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate_nand\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate_nor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate_not\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate_or\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate_xnor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate_xor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gauge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gauge_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gauge_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gauge_low\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gavel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gender_female\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gender_male\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gender_male_female\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gender_transgender\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gentoo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_double_tap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_pinch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_spread\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_swipe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_swipe_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_swipe_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_swipe_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_swipe_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_swipe_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_swipe_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_tap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_tap_hold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_two_double_tap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_two_tap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ghost\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ghost_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gif\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gift\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_git\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_github_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_github_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_github_face\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gitlab\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glass_cocktail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glass_flute\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glass_mug\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glass_stange\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glass_tulip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glass_wine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glassdoor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glasses\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_globe_model\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gmail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gnome\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_go_kart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_go_kart_track\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_golf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gondola\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_goodreads\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_adwords\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_allo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_analytics\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_assistant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_cardboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_chrome\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_circles\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_circles_communities\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_circles_extended\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_circles_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_classroom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_controller\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_controller_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_drive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_earth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_fit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_glass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_hangouts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_home\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_keep\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_lens\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_maps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_nearby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_pages\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_photos\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_physical_web\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_plus_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_spreadsheet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_street_view\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_translate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gpu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gradient\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_grain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_graphql\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_grave_stone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_grease_pencil\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_greater_than\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_greater_than_or_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_grid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_grid_large\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_grid_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_guitar_acoustic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_guitar_electric\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_guitar_pick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_guitar_pick_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_guy_fawkes_mask\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hackernews\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_halloween\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hamburger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hammer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand_okay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand_peace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand_peace_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand_pointing_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand_pointing_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand_pointing_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand_pointing_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hanger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hard_hat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_harddisk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hat_fedora\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hazard_lights\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hdr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hdr_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headphones\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headphones_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headphones_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headphones_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headphones_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headset_dock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headset_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_broken\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_broken_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_half_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_half_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_pulse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_helicopter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help_rhombus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help_rhombus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_slice_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_slice_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_slice_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_slice_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_slice_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_slice_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagram_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_high_definition\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_high_definition_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_highway\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hiking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hinduism\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_history\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hockey_puck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hockey_sticks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hololens\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_assistant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_automation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_city\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_city_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_currency_usd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_0\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_a\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_b\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_l\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_negative_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_lock_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_map_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_modern\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hook_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hops\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_horseshoe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hospital\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hospital_building\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hospital_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hot_tub\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hotel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_houzz\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_houzz_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hubspot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hulu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_child\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_female\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_female_boy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_female_female\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_female_girl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_greeting\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_handsdown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_handsup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_male\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_male_boy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_male_female\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_male_girl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_male_male\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_pregnant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_humble_bundle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ice_cream\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_iframe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_iframe_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_album\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_area\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_area_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_broken\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_broken_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_black_white\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_center_focus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_center_focus_weak\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_drama\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_frames\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_hdr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_tilt_shift\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_vintage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_move\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_size_select_actual\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_size_select_large\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_size_select_small\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_import\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_inbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_inbox_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_inbox_arrow_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_inbox_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_inbox_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_incognito\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_infinity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_information\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_information_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_information_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_instagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_instapaper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_internet_explorer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_invert_colors\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ip_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ip_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ipod\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_islam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_itunes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_jabber\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_jeepney\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_jira\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_jquery\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_jsfiddle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_json\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_judaism\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_kabaddi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_karate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keg\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_kettle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_key_change\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_key_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_key_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_key_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_key_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_key_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_backspace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_caps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_return\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_settings_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_tab\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_kickstarter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_knife\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_knife_military\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_kodi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_label\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_label_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_label_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_label_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_label_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_label_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ladybug\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lambda\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lan_connect\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lan_disconnect\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lan_pending\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_c\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_cpp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_csharp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_css3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_go\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_haskell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_html5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_java\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_javascript\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_lua\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_php\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_python\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_python_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_r\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_ruby_on_rails\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_swift\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_typescript\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_laptop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_laptop_chromebook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_laptop_mac\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_laptop_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_laptop_windows\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_laravel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lastfm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lastpass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_launch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lava_lamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_layers\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_layers_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_layers_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_layers_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lead_pencil\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_leaf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_leaf_maple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_leak\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_leak_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_led_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_led_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_led_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_led_strip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_led_variant_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_led_variant_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_led_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_less_than\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_less_than_or_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_library\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_library_books\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_library_movie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_library_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_library_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_library_shelves\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_library_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lifebuoy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_light_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lightbulb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lightbulb_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lightbulb_on_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lightbulb_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lighthouse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lighthouse_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_box_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_box_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_variant_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_linkedin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_linkedin_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_linux\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_linux_mint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_litecoin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_loading\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_open_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_pattern\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_question\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_reset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_smart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_locker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_locker_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_login\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_login_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_logout\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_logout_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_looks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_loop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_loupe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lumx\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lyft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnet_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify_minus_cursor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify_minus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify_plus_cursor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mail_ru\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox_open_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox_open_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox_open_up_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox_up_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_clock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_legend\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_distance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_path\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_radius\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mapbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_margin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_markdown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_marker_cancel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_marker_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mastodon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mastodon_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_material_design\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_material_ui\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_math_compass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_math_cos\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_math_sin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_math_tan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_matrix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_maxcdn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_medal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_medical_bag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_meetup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_memory\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_down_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_left_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_right_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_swap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_swap_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_up_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_bulleted\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_bulleted_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_draw\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_processing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_reply\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_reply_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_settings_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_meteor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_metronome\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_metronome_tick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_micro_sd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone_variant_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microscope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microsoft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microsoft_dynamics\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microwave\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_midi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_midi_port\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minecraft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mini_sd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minidisc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minus_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minus_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minus_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minus_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minus_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minus_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mixcloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mixed_martial_arts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mixed_reality\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mixer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_molecule\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor_cellphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor_cellphone_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor_dashboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_more\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mother_nurse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_motion_sensor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_motorbike\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mouse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mouse_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mouse_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mouse_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mouse_variant_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_move_resize\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_move_resize_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_movie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_movie_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_movie_roll\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_muffin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_multiplication\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_multiplication_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mushroom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mushroom_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_bluetooth_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_eighth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_quarter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_sixteenth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_whole\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nas\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nativescript\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nature\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nature_people\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_navigation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_near_me\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_needle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_netflix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_1_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_2_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_3_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_4_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_new_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_newspaper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nfc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nfc_tap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nfc_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ninja\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nintendo_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nodejs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_not_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_not_equal_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_note\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_note_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_note_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_note_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_note_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_note_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_note_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_notebook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_notification_clear_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_npm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_npm_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_npm_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nuke\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_null\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_0\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_0_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_0_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_0_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_0_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_0_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_1_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_1_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_1_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_1_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_1_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_2_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_2_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_2_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_2_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_2_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_3_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_3_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_3_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_3_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_3_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_4_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_4_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_4_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_4_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_4_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_5_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_5_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_5_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_5_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_5_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_6_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_6_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_6_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_6_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_6_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_7\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_7_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_7_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_7_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_7_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_7_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_8\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_8_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_8_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_8_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_8_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_8_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_plus_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_plus_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_plus_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_plus_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_plus_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nut\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nutrition\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_oar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ocarina\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_octagon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_octagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_octagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_octagram_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_odnoklassniki\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_office\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_office_building\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_oil\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_oil_temperature\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_omega\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_one_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_onedrive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_onenote\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_onepassword\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_opacity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_open_in_app\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_open_in_new\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_open_source_initiative\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_openid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_opera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_orbit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_origin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ornament\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ornament_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_outlook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_owl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pac_man\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_package\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_package_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_package_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_package_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_package_variant_closed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_first\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_last\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_layout_body\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_layout_footer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_layout_header\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_layout_sidebar_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_layout_sidebar_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_next\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_next_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_previous\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_previous_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_palette\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_palette_advanced\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_palette_swatch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_bottom_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_bottom_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_top_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_top_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_panda\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pandora\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_panorama\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_panorama_fisheye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_panorama_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_panorama_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_panorama_wide_angle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_paper_cut_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_paperclip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_parachute\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_parachute_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_parking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_passport\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_passport_biometric\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_patreon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pause\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pause_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pause_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pause_octagon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pause_octagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_paw\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_paw_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_paypal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_peace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pen_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pen_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pen_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pen_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pen_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_lock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_minus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pentagon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pentagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_percent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_periodic_table\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_periodic_table_co2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_periscope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_perspective_less\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_perspective_more\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pharmacy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_classic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_hangup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_in_talk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_incoming\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_log\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_missed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_outgoing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_paused\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_return\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_rotate_landscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_rotate_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_voip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pi_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pi_hole\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_piano\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pickaxe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pier\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pier_crane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pig\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pillar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pin_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pin_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pin_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pine_tree\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pine_tree_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pinterest\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pinterest_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pinwheel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pinwheel_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pipe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pipe_disconnected\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pipe_leak\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pirate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pistol\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_piston\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pizza\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_pause\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_protected_content\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_speed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_music_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playstation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_circle_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_minus_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_one\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pocket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_podcast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_podium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_podium_bronze\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_podium_gold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_podium_silver\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_point_of_sale\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pokeball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pokemon_go\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_poker_chip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_polaroid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_poll\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_poll_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_polymer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pool\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_popcorn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_postage_stamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pot_mix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pound\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pound_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_cycle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_plug\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_plug_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_sleep\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_socket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_socket_au\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_socket_eu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_socket_uk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_socket_us\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_standby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_powershell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_prescription\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_presentation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_presentation_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_printer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_printer_3d\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_printer_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_printer_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_printer_wireless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_priority_high\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_priority_low\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_professional_hexagon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_progress_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_progress_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_progress_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_progress_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_progress_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_progress_wrench\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_projector\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_projector_screen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_publish\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pulse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pumpkin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_puzzle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_puzzle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_qi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_qqchat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_qrcode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_qrcode_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_qrcode_scan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_quadcopter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_quality_high\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_quality_low\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_quality_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_quicktime\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_quora\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rabbit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_racing_helmet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_racquetball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radiator\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radiator_disabled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radiator_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radio_am\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radio_fm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radio_handheld\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radio_tower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radioactive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radiobox_blank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radiobox_marked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radius\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radius_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_raspberry_pi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ray_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ray_end_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ray_start\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ray_start_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ray_start_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ray_vertex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_react\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_read\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_receipt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_record\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_record_player\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_record_rec\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_recycle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reddit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_redo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_redo_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reflect_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reflect_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_refresh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_regex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_registered_trademark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_relative_scale\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reminder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_remote\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_remote_desktop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rename_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reorder_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reorder_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_repeat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_repeat_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_repeat_once\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_replay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reply\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reply_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reproduction\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_resistor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_resistor_nodes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_resize\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_resize_bottom_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_responsive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_restart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_restart_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_restore_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rewind\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rewind_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rewind_30\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rewind_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rhombus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rhombus_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rhombus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rhombus_split\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ribbon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ring\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_road\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_road_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_robot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_robot_industrial\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_robot_vacuum\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_robot_vacuum_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rocket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_roller_skate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rollerblade\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rollupjs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_room_service\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_room_service_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rotate_3d\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rotate_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rotate_left_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rotate_orbit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rotate_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rotate_right_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rounded_corner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_router_wireless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_router_wireless_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_routes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rowing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rss\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rss_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ruby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rugby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ruler\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ruler_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_run\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_run_fast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sack_percent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_safe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_safety_goggles\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sale\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_salesforce\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_satellite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_satellite_uplink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_satellite_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sausage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_saxophone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_scale\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_scale_balance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_scale_bathroom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_scanner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_scanner_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_school\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_scissors_cutting\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screen_rotation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screen_rotation_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screw_flat_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screw_lag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screw_machine_flat_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screw_machine_round_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screw_round_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screwdriver\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_script\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_script_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_script_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_script_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_search_web\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_flat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_flat_angled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_individual_suite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_legroom_extra\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_legroom_normal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_legroom_reduced\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_recline_extra\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_recline_normal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seatbelt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_security\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_security_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_select\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_select_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_select_color\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_select_compare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_select_drag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_select_inverse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_select_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_selection\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_selection_drag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_selection_ellipse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_selection_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_send\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_send_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_send_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_send_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_serial_port\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server_network_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server_security\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_center_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_left_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_left_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_top_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_settings_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_settings_helper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_settings_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shape_circle_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shape_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shape_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shape_polygon_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shape_rectangle_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shape_square_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_share\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_share_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_share_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sheep\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_account_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_airplane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_airplane_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_cross\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_cross_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_half_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_home\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_home_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_key_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_link_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_link_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_lock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ship_wheel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shoe_formal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shoe_heel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shoe_print\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shopify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shopping\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shopping_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shovel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shovel_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shower_head\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shredder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shuffle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shuffle_disabled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shuffle_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sigma\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sigma_lower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sign_caution\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sign_direction\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sign_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_2g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_3g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_4g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_5g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_cellular_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_cellular_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_cellular_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_cellular_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_hspa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_hspa_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signature\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signature_freehand\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signature_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signature_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_silo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_silverware\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_silverware_fork\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_silverware_fork_knife\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_silverware_spoon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_silverware_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sim\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sim_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sim_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sina_weibo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sitemap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skew_less\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skew_more\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_backward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_next\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_next_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_next_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_previous\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_previous_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_previous_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skull\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skull_crossbones\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skull_crossbones_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skull_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skype\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skype_business\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_slack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_slackware\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sleep\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sleep_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_slope_downhill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_slope_uphill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_smog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_smoke_detector\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_smoking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_smoking_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_snapchat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_snowflake\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_snowman\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_soccer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_soccer_field\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sofa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_solar_panel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_solar_panel_large\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_solar_power\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_solid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort_alphabetical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort_ascending\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort_descending\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort_numeric\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort_variant_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort_variant_lock_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_soundcloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_branch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_commit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_commit_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_commit_end_local\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_commit_local\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_commit_next_local\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_commit_start\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_commit_start_next_local\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_fork\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_merge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_pull\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_repository\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_repository_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_soy_sauce\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spa_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_space_invaders\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_speaker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_speaker_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_speaker_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_speaker_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_speaker_wireless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_speedometer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spellcheck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spider_web\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spotify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spotlight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spotlight_beam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spray\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spray_bottle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_edit_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_inc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_inc_cash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_medium_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_root\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_root_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_small\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_squeegee\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ssh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stack_exchange\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stack_overflow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stadium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stairs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stamper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_standard_definition\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_face\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_four_points\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_four_points_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_three_points\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_three_points_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_steam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_steam_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_steering\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_steering_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_step_backward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_step_backward_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_step_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_step_forward_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stethoscope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sticker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sticker_emoji\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stocking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stop_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stop_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_store\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_store_24_hour\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_strava\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_subdirectory_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_subdirectory_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_subtitles\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_subtitles_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_subway\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_subway_alert_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_subway_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_summit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sunglasses\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_surround_sound\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_surround_sound_2_0\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_surround_sound_3_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_surround_sound_5_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_surround_sound_7_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_svg\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_swap_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_swap_horizontal_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_swap_horizontal_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_swap_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_swap_vertical_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_swap_vertical_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_swim\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sword\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sword_cross\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_symfony\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sync\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sync_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sync_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tab\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tab_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tab_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tab_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tab_unselected\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_border\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_column\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_column_plus_after\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_column_plus_before\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_column_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_column_width\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_large\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_merge_cells\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_of_contents\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_row\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_row_height\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_row_plus_after\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_row_plus_before\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_row_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tablet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tablet_android\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tablet_cellphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tablet_ipad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_taco\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_faces\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_heart_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tape_measure\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_target\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_target_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_target_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_taxi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tea\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tea_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_teach\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_teamviewer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_telegram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_telescope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_television\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_television_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_television_classic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_television_classic_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_television_guide\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_television_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_temperature_celsius\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_temperature_fahrenheit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_temperature_kelvin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tennis\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tennis_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_terrain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_test_tube\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_test_tube_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_test_tube_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_text_shadow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_text_short\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_text_subject\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_text_to_speech\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_text_to_speech_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_textbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_textbox_password\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_texture\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_theater\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_theme_light_dark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermometer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermometer_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermometer_chevron_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermometer_chevron_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermometer_lines\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermometer_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermometer_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermostat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermostat_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thought_bubble\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thought_bubble_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thumb_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thumb_down_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thumb_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thumb_up_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thumbs_up_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ticket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ticket_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ticket_confirmation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ticket_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ticket_percent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tilde\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timelapse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timeline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timeline_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timeline_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timeline_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timer_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timer_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timer_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timer_sand\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timer_sand_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timer_sand_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timetable\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toaster_oven\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toggle_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toggle_switch_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toggle_switch_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toggle_switch_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toilet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toolbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toolbox_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_image_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooth_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tortoise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tournament\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tower_beach\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tower_fire\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_towing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_track_light\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trackpad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trackpad_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tractor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trademark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_traffic_light\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_train\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_train_car\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_train_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transcribe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transcribe_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transfer_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transfer_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transfer_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transfer_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transit_connection\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transit_connection_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transit_transfer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transition\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transition_masked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_translate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_translate_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transmission_tower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trash_can\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trash_can_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_treasure_chest\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tree\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trello\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trending_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trending_neutral\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trending_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_triangle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_triangle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_triforce\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trophy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trophy_award\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trophy_broken\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trophy_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trophy_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trophy_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_truck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_truck_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_truck_delivery\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_truck_fast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_truck_trailer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tshirt_crew\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tshirt_crew_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tshirt_v\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tshirt_v_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tumble_dryer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tumblr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tumblr_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tumblr_reblog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tune\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tune_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_turnstile\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_turnstile_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_turtle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_twitch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_twitter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_twitter_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_twitter_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_twitter_retweet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_two_factor_authentication\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_uber\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ubisoft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ubuntu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ultra_high_definition\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_umbraco\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_umbrella\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_umbrella_closed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_umbrella_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_undo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_undo_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_unfold_less_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_unfold_less_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_unfold_more_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_unfold_more_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ungroup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_unity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_unreal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_untappd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_update\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_upload_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_upload_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_upload_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_upload_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_usb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_van_passenger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_van_utility\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vanish\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_variable\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_arrange_above\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_arrange_below\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_bezier\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_circle_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_combine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_curve\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_difference\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_difference_ab\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_difference_ba\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_ellipse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_intersection\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_line\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_point\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_polygon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_polyline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_radius\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_rectangle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_selection\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_triangle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_union\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_venmo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vhs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vibrate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vibrate_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_3d\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_4k_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_input_antenna\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_input_component\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_input_hdmi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_input_svideo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_stabilization\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_vintage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_agenda\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_array\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_carousel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_column\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_dashboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_dashboard_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_dashboard_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_day\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_grid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_headline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_module\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_parallel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_quilt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_sequential\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_split_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_split_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_stream\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_week\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vimeo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_violin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_virtual_reality\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_visual_studio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_visual_studio_code\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vk_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vk_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vlc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_voice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_voicemail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volleyball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_high\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_low\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_mute\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_variant_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vote\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vote_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vpn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vuejs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_walk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wall\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wall_sconce\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wall_sconce_flat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wall_sconce_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wallet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wallet_giftcard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wallet_membership\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wallet_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wallet_travel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wallpaper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_washing_machine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch_export_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch_import\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch_import_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch_vibrate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch_vibrate_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_water\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_water_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_water_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_water_percent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_water_pump\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watermark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_waves\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_waze\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_cloudy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_fog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_hail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_hurricane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_lightning\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_lightning_rainy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_night\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_partlycloudy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_pouring\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_rainy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_snowy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_snowy_rainy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_sunny\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_sunset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_sunset_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_sunset_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_windy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_windy_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_web\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_webcam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_webhook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_webpack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wechat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weight_gram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weight_kilogram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weight_pound\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_whatsapp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wheelchair_accessibility\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_whistle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_white_balance_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_white_balance_incandescent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_white_balance_iridescent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_white_balance_sunny\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_widgets\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_1_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_1_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_2_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_2_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_3_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_3_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_4_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_4_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_lock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wii\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wiiu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wikipedia\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wind_turbine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_window_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_window_closed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_window_maximize\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_window_minimize\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_window_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_window_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_windows\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_windows_classic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wiper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wiper_wash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wordpress\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_worker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wrap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wrap_disabled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wrench\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wrench_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wunderlist\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xamarin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xamarin_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xaml\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_battery_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_battery_charging\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_battery_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_battery_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_battery_low\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_battery_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_battery_unknown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xda\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xing_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xing_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xml\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xmpp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_yahoo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_yammer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_yeast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_yelp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_yin_yang\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_youtube\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_youtube_creator_studio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_youtube_gaming\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_youtube_subscription\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_youtube_tv\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_z_wave\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zend\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zigbee\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zip_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zip_disk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_aquarius\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_aries\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_cancer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_capricorn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_gemini\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_leo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_libra\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_pisces\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_sagittarius\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_scorpio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_taurus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_virgo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blank\"; type: \"string\"; isReadonly: true }\n        Method { name: \"init\"; type: \"QVariant\" }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/MaterialIcons/qmldir",
    "content": "module AsemanQml.MaterialIcons\nclassname AsemanMaterialIconsPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlmaterialicons\n\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Models/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Models 2.0'\n\nModule {\n    dependencies: [\n        \"AsemanQml.Base 2.0\",\n        \"QtGraphicalEffects 1.12\",\n        \"QtQml 2.1\",\n        \"QtQml.Models 2.2\",\n        \"QtQuick 2.9\",\n        \"QtQuick.Controls 2.5\",\n        \"QtQuick.Controls.Fusion 2.12\",\n        \"QtQuick.Controls.Fusion.impl 2.12\",\n        \"QtQuick.Controls.IOSStyle 2.12\",\n        \"QtQuick.Controls.IOSStyle.impl 2.12\",\n        \"QtQuick.Controls.Imagine 2.12\",\n        \"QtQuick.Controls.Imagine.impl 2.12\",\n        \"QtQuick.Controls.Material 2.12\",\n        \"QtQuick.Controls.Material.impl 2.12\",\n        \"QtQuick.Controls.Styles 1.4\",\n        \"QtQuick.Controls.Styles.Plasma 2.0\",\n        \"QtQuick.Controls.Universal 2.12\",\n        \"QtQuick.Controls.Universal.impl 2.12\",\n        \"QtQuick.Controls.impl 2.12\",\n        \"QtQuick.Extras 1.4\",\n        \"QtQuick.Layouts 1.4\",\n        \"QtQuick.Templates 2.5\",\n        \"QtQuick.Window 2.2\",\n        \"org.kde.kconfig 1.0\",\n        \"org.kde.kirigami 2.9\",\n        \"org.kde.kquickcontrolsaddons 2.0\",\n        \"org.kde.plasma.components 2.0\",\n        \"org.kde.plasma.core 2.0\",\n        \"org.kde.plasma.extras 2.0\"\n    ]\n    Component {\n        name: \"AsemanAbstractListModel\"\n        prototype: \"QAbstractListModel\"\n        Method {\n            name: \"get\"\n            type: \"QVariant\"\n            Parameter { name: \"index\"; type: \"int\" }\n            Parameter { name: \"role\"; type: \"int\" }\n        }\n        Method {\n            name: \"get\"\n            type: \"QVariant\"\n            Parameter { name: \"index\"; type: \"int\" }\n            Parameter { name: \"roleName\"; type: \"string\" }\n        }\n        Method {\n            name: \"get\"\n            type: \"QVariantMap\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n        Method { name: \"roles\"; type: \"QStringList\" }\n    }\n    Component {\n        name: \"AsemanAbstractQuickListModelHint\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Models/AsemanAbstractQuickListModelHint 2.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n    }\n    Component {\n        name: \"AsemanCalendarModel\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Models/CalendarModel 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"CalendarTypes\"\n            values: {\n                \"CalendarGregorian\": 0,\n                \"CalendarJalali\": 1,\n                \"CalendarHijri\": 2\n            }\n        }\n        Property { name: \"years\"; type: \"QList<int>\"; isReadonly: true }\n        Property { name: \"months\"; type: \"QList<int>\"; isReadonly: true }\n        Property { name: \"days\"; type: \"QList<int>\"; isReadonly: true }\n        Property { name: \"hours\"; type: \"QList<int>\"; isReadonly: true }\n        Property { name: \"minutes\"; type: \"QList<int>\"; isReadonly: true }\n        Property { name: \"currentYearIndex\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentMonthIndex\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentDaysIndex\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentHoursIndex\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentMinutesIndex\"; type: \"int\"; isReadonly: true }\n        Property { name: \"dateTime\"; type: \"QDateTime\" }\n        Property { name: \"calendar\"; type: \"int\" }\n        Property { name: \"minimum\"; type: \"QDateTime\" }\n        Property { name: \"maximum\"; type: \"QDateTime\" }\n        Signal { name: \"secondsChanged\" }\n        Method {\n            name: \"setConvertDate\"\n            Parameter { name: \"yearIdx\"; type: \"int\" }\n            Parameter { name: \"monthIdx\"; type: \"int\" }\n            Parameter { name: \"dayIdx\"; type: \"int\" }\n            Parameter { name: \"hourIdx\"; type: \"int\" }\n            Parameter { name: \"minuteIdx\"; type: \"int\" }\n        }\n        Method {\n            name: \"monthName\"\n            type: \"string\"\n            Parameter { name: \"month\"; type: \"int\" }\n        }\n    }\n    Component {\n        name: \"AsemanCountriesModel\"\n        prototype: \"AsemanAbstractListModel\"\n        exports: [\"AsemanQml.Models/CountriesModel 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"ColorfullListModelRoles\"\n            values: {\n                \"NameRole\": 256,\n                \"NativeNameRole\": 257,\n                \"TldRole\": 258,\n                \"Cca2Role\": 259,\n                \"Ccn3Role\": 260,\n                \"Cca3Role\": 261,\n                \"CurrencyRole\": 262,\n                \"CallingCodeRole\": 263,\n                \"CapitalRole\": 264,\n                \"AltSpellingsRole\": 265,\n                \"RelevanceRole\": 266,\n                \"RegionRole\": 267,\n                \"SubregionRole\": 268,\n                \"LanguageRole\": 269,\n                \"LanguageCodesRole\": 270,\n                \"TranslationsRole\": 271,\n                \"LatlngRole\": 272,\n                \"DemonymRole\": 273,\n                \"BordersRole\": 274,\n                \"AreaRole\": 275,\n                \"KeyRole\": 276\n            }\n        }\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"filter\"; type: \"string\" }\n        Property { name: \"systemCountry\"; type: \"string\"; isReadonly: true }\n        Method {\n            name: \"indexOf\"\n            type: \"int\"\n            Parameter { name: \"name\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanFileSystemModel\"\n        prototype: \"AsemanAbstractListModel\"\n        exports: [\"AsemanQml.Models/FileSystemModel 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"SortFlag\"\n            values: {\n                \"Name\": 0,\n                \"Size\": 1,\n                \"Date\": 2\n            }\n        }\n        Enum {\n            name: \"DataRole\"\n            values: {\n                \"FilePath\": 256,\n                \"FileUrl\": 257,\n                \"FileName\": 258,\n                \"FileMime\": 259,\n                \"FileSize\": 260,\n                \"FileSuffix\": 261,\n                \"FileBaseName\": 262,\n                \"FileIsDir\": 263,\n                \"FileModifiedDate\": 264,\n                \"FileCreatedDate\": 265\n            }\n        }\n        Property { name: \"showDirs\"; type: \"bool\" }\n        Property { name: \"showDotAndDotDot\"; type: \"bool\" }\n        Property { name: \"showDirsFirst\"; type: \"bool\" }\n        Property { name: \"showFiles\"; type: \"bool\" }\n        Property { name: \"showHidden\"; type: \"bool\" }\n        Property { name: \"recursive\"; type: \"bool\" }\n        Property { name: \"nameFilters\"; type: \"QStringList\" }\n        Property { name: \"folder\"; type: \"string\" }\n        Property { name: \"limit\"; type: \"int\" }\n        Property { name: \"parentFolder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"sortField\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Signal { name: \"listChanged\" }\n        Method { name: \"refresh\" }\n    }\n    Component {\n        name: \"AsemanListModel\"\n        prototype: \"AsemanAbstractListModel\"\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"cachePath\"; type: \"string\" }\n        Property { name: \"data\"; type: \"QVariantList\" }\n        Signal { name: \"listChanged\" }\n        Signal { name: \"dataListChanged\" }\n        Method {\n            name: \"insert\"\n            Parameter { name: \"row\"; type: \"int\" }\n            Parameter { name: \"map\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"append\"\n            Parameter { name: \"map\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"remove\"\n            Parameter { name: \"row\"; type: \"int\" }\n        }\n        Method {\n            name: \"move\"\n            Parameter { name: \"from\"; type: \"int\" }\n            Parameter { name: \"to\"; type: \"int\" }\n        }\n        Method { name: \"clear\" }\n        Method {\n            name: \"change\"\n            Parameter { name: \"list\"; type: \"QVariantList\" }\n        }\n    }\n    Component {\n        name: \"AsemanMixedListModel\"\n        prototype: \"AsemanAbstractListModel\"\n        exports: [\"AsemanQml.Models/MixedListModel 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"models\"; type: \"QVariantList\" }\n    }\n    Component {\n        name: \"AsemanQuickListModel\"\n        defaultProperty: \"items\"\n        prototype: \"AsemanListModel\"\n        exports: [\"AsemanQml.Models/AsemanListModel 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"sortField\"; type: \"string\" }\n        Property { name: \"sortDescending\"; type: \"bool\" }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Method { name: \"reload\" }\n    }\n    Component {\n        name: \"AsemanQuickListModelCamelCaseHint\"\n        prototype: \"AsemanAbstractQuickListModelHint\"\n        exports: [\"AsemanQml.Models/ModelCamelCaseHint 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"path\"; type: \"string\" }\n        Signal { name: \"changeRequest\" }\n    }\n    Component {\n        name: \"AsemanQuickListModelCopyHint\"\n        prototype: \"AsemanAbstractQuickListModelHint\"\n        exports: [\"AsemanQml.Models/ModelCopyHint 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"path\"; type: \"string\" }\n        Property { name: \"targetPath\"; type: \"string\" }\n        Signal { name: \"changeRequest\" }\n    }\n    Component {\n        name: \"AsemanQuickListModelDeleteHint\"\n        prototype: \"AsemanAbstractQuickListModelHint\"\n        exports: [\"AsemanQml.Models/ModelDeleteHint 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"path\"; type: \"string\" }\n        Signal { name: \"changeRequest\" }\n    }\n    Component {\n        name: \"AsemanQuickListModelFormatHint\"\n        prototype: \"AsemanAbstractQuickListModelHint\"\n        exports: [\"AsemanQml.Models/ModelFormatHint 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"path\"; type: \"string\" }\n        Property { name: \"method\"; type: \"QJSValue\" }\n        Signal { name: \"changeRequest\" }\n    }\n    Component {\n        name: \"AsemanQuickListModelSource\"\n        defaultProperty: \"hints\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Models/AsemanListModelSource 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"source\"; type: \"QVariant\" }\n        Property { name: \"path\"; type: \"string\" }\n        Property { name: \"data\"; type: \"QVariantList\"; isReadonly: true }\n        Property {\n            name: \"hints\"\n            type: \"AsemanAbstractQuickListModelHint\"\n            isList: true\n            isReadonly: true\n        }\n        Method { name: \"refresh\" }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Models/qmldir",
    "content": "module AsemanQml.Models\nclassname AsemanModelsPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlmodels\ndepends AsemanQml.Base 2.0\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Modern/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Modern 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.8\"]\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Modern/FancyNavigationBar 2.0\"\n        exports: [\"AsemanQml.Modern/FancyNavigationBar 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"contents\"\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentPage\"; type: \"FancyPage_QMLTYPE_0\"; isReadonly: true; isPointer: true }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"contents\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Property { name: \"barHeight\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Modern/FancyPage 2.0\"\n        exports: [\"AsemanQml.Modern/FancyPage 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"contents\"\n        Property { name: \"delegateItem\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"title\"; type: \"string\" }\n        Property { name: \"font\"; type: \"QFont\" }\n        Property { name: \"textColor\"; type: \"QColor\" }\n        Property { name: \"contents\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Property { name: \"color\"; type: \"QColor\" }\n        Method {\n            name: \"init\"\n            type: \"QVariant\"\n            Parameter { name: \"opened\"; type: \"QVariant\" }\n        }\n        Method { name: \"openFromLeft\"; type: \"QVariant\" }\n        Method { name: \"openFromRight\"; type: \"QVariant\" }\n        Method { name: \"closeToLeft\"; type: \"QVariant\" }\n        Method { name: \"closeToRight\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Modern/FancySearchBar 2.0\"\n        exports: [\"AsemanQml.Modern/FancySearchBar 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"layoutDirection\"; type: \"int\" }\n        Property { name: \"mainList\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"ratio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"keyword\"; type: \"string\" }\n        Property { name: \"toolbarHeight\"; type: \"double\" }\n        Property { name: \"toolbarTopMargin\"; type: \"double\" }\n        Property { name: \"searchBarButton\"; type: \"QQuickText\"; isReadonly: true; isPointer: true }\n        Property { name: \"clearButton\"; type: \"QQuickText\"; isReadonly: true; isPointer: true }\n        Property { name: \"panelColor\"; type: \"QColor\" }\n        Property { name: \"searchBarColor\"; type: \"QColor\" }\n        Property { name: \"background\"; type: \"QColor\" }\n        Property { name: \"opened\"; type: \"bool\" }\n        Property { name: \"textInput\"; type: \"QQuickTextInput\"; isReadonly: true; isPointer: true }\n        Property { name: \"placeholder\"; type: \"string\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Modern/FastDropShadow 2.0\"\n        exports: [\"AsemanQml.Modern/FastDropShadow 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"horizontalOffset\"; type: \"double\" }\n        Property { name: \"verticalOffset\"; type: \"double\" }\n        Property { name: \"cached\"; type: \"bool\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"source\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Modern/FastRectengleShadow 2.0\"\n        exports: [\"AsemanQml.Modern/FastRectengleShadow 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"horizontalOffset\"; type: \"double\" }\n        Property { name: \"verticalOffset\"; type: \"double\" }\n        Property { name: \"cached\"; type: \"bool\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"roundRadius\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Modern/LazyList 2.0\"\n        exports: [\"AsemanQml.Modern/LazyList 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"contentItem\"\n        Property { name: \"contentItem\"; type: \"QQuickListView\"; isPointer: true }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Modern/qmldir",
    "content": "module AsemanQml.Modern\nclassname AsemanModernPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlmodern\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Multimedia/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Multimedia 2.0'\n\nModule {\n    dependencies: [\n        \"AsemanQml.Awesome 2.0\",\n        \"AsemanQml.Base 2.0\",\n        \"QtGraphicalEffects 1.12\",\n        \"QtMultimedia 5.11\",\n        \"QtQuick 2.13\",\n        \"QtQuick.Controls 2.5\",\n        \"QtQuick.Controls.Fusion 2.13\",\n        \"QtQuick.Controls.Fusion.impl 2.12\",\n        \"QtQuick.Controls.Imagine 2.13\",\n        \"QtQuick.Controls.Imagine.impl 2.13\",\n        \"QtQuick.Controls.Material 2.13\",\n        \"QtQuick.Controls.Material.impl 2.12\",\n        \"QtQuick.Controls.Universal 2.13\",\n        \"QtQuick.Controls.Universal.impl 2.12\",\n        \"QtQuick.Controls.impl 2.13\",\n        \"QtQuick.Layouts 1.2\",\n        \"QtQuick.Templates 2.13\",\n        \"QtQuick.Window 2.2\"\n    ]\n    Component {\n        name: \"AsemanAudioEncoderSettings\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Multimedia/AudioEncoderSettings 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"EncodingQuality\"\n            values: {\n                \"VeryLowQuality\": 0,\n                \"LowQuality\": 1,\n                \"NormalQuality\": 2,\n                \"HighQuality\": 3,\n                \"VeryHighQuality\": 4\n            }\n        }\n        Enum {\n            name: \"EncodingMode\"\n            values: {\n                \"ConstantQualityEncoding\": 0,\n                \"ConstantBitRateEncoding\": 1,\n                \"AverageBitRateEncoding\": 2,\n                \"TwoPassEncoding\": 3\n            }\n        }\n        Property { name: \"bitRate\"; type: \"int\" }\n        Property { name: \"channelCount\"; type: \"int\" }\n        Property { name: \"codec\"; type: \"string\" }\n        Property { name: \"encodingMode\"; type: \"int\" }\n        Property { name: \"encodingOptions\"; type: \"QVariantMap\" }\n        Property { name: \"quality\"; type: \"int\" }\n        Property { name: \"sampleRate\"; type: \"int\" }\n    }\n    Component {\n        name: \"AsemanAudioRecorder\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Multimedia/AudioRecorder 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"State\"\n            values: {\n                \"StoppedState\": 0,\n                \"RecordingState\": 1,\n                \"PausedState\": 2\n            }\n        }\n        Enum {\n            name: \"Status\"\n            values: {\n                \"UnavailableStatus\": 0,\n                \"UnloadedStatus\": 1,\n                \"LoadingStatus\": 2,\n                \"LoadedStatus\": 3,\n                \"StartingStatus\": 4,\n                \"RecordingStatus\": 5,\n                \"PausedStatus\": 6,\n                \"FinalizingStatus\": 7\n            }\n        }\n        Property { name: \"encoderSettings\"; type: \"AsemanAudioEncoderSettings\"; isPointer: true }\n        Property { name: \"output\"; type: \"QUrl\" }\n        Property { name: \"mute\"; type: \"bool\" }\n        Property { name: \"available\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"availability\"; type: \"int\"; isReadonly: true }\n        Property { name: \"state\"; type: \"int\"; isReadonly: true }\n        Property { name: \"status\"; type: \"int\"; isReadonly: true }\n        Property { name: \"volume\"; type: \"double\" }\n        Property { name: \"audioInput\"; type: \"string\" }\n        Property { name: \"audioInputs\"; type: \"QStringList\"; isReadonly: true }\n        Method { name: \"stop\" }\n        Method { name: \"pause\" }\n        Method { name: \"record\" }\n    }\n    Component {\n        name: \"AsemanMultimediaDatabase\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Multimedia/MultimediaDatabase 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Method { name: \"getAllMusics\"; type: \"QVariantList\" }\n        Method { name: \"getAllAlbums\"; type: \"QVariantList\" }\n        Method { name: \"getAllArtists\"; type: \"QVariantList\" }\n        Method {\n            name: \"getArtistAlbums\"\n            type: \"QVariantList\"\n            Parameter { name: \"artistId\"; type: \"string\" }\n        }\n        Method {\n            name: \"getArtistSongs\"\n            type: \"QVariantList\"\n            Parameter { name: \"artistId\"; type: \"string\" }\n        }\n        Method {\n            name: \"getAlbumSongs\"\n            type: \"QVariantList\"\n            Parameter { name: \"albumId\"; type: \"string\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Multimedia/VideoPlayer 2.0\"\n        exports: [\"AsemanQml.Multimedia/VideoPlayer 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"controlsVisibled\"; type: \"bool\" }\n        Property { name: \"playing\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"loading\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"background\"; type: \"QColor\" }\n        Property { name: \"blur\"; type: \"bool\" }\n        Property { name: \"source\"; type: \"QUrl\" }\n        Property { name: \"title\"; type: \"string\" }\n        Method { name: \"play\"; type: \"QVariant\" }\n        Method { name: \"pause\"; type: \"QVariant\" }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Multimedia/qmldir",
    "content": "module AsemanQml.Multimedia\nclassname AsemanMultimediaPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlmultimedia\ndepends QtMultimedia 5.8\ndepends AsemanQml.Base 2.0\ndepends AsemanQml.Awesome 2.0\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Network/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Network 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.12\"]\n    Component {\n        name: \"AsemanFileDownloaderQueue\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Network/DownloaderQueue 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Property { name: \"capacity\"; type: \"int\" }\n        Property { name: \"destination\"; type: \"string\" }\n        Signal {\n            name: \"finished\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n        }\n        Signal {\n            name: \"progressChanged\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n            Parameter { name: \"percent\"; type: \"double\" }\n        }\n        Method {\n            name: \"download\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n            Parameter { name: \"header\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"download\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanNetworkRequestManager\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Network/NetworkRequestManager 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"boundaryToken\"; type: \"string\" }\n        Property { name: \"ignoreSslErrors\"; type: \"bool\" }\n        Method {\n            name: \"get\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n            Parameter { name: \"ignoreEmptyValues\"; type: \"bool\" }\n        }\n        Method {\n            name: \"get\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n        }\n        Method {\n            name: \"post\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n            Parameter { name: \"ignoreEmptyValues\"; type: \"bool\" }\n        }\n        Method {\n            name: \"post\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n        }\n        Method {\n            name: \"put\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n            Parameter { name: \"ignoreEmptyValues\"; type: \"bool\" }\n        }\n        Method {\n            name: \"put\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n        }\n        Method {\n            name: \"patch\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n            Parameter { name: \"ignoreEmptyValues\"; type: \"bool\" }\n        }\n        Method {\n            name: \"patch\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n        }\n        Method {\n            name: \"deleteMethod\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n            Parameter { name: \"ignoreEmptyValues\"; type: \"bool\" }\n        }\n        Method {\n            name: \"deleteMethod\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n        }\n        Method {\n            name: \"customMethod\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"method\"; type: \"string\" }\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n            Parameter { name: \"ignoreEmptyValues\"; type: \"bool\" }\n        }\n        Method {\n            name: \"customMethod\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"method\"; type: \"string\" }\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n        }\n    }\n    Component {\n        name: \"AsemanNetworkRequestObject\"\n        defaultProperty: \"items\"\n        prototype: \"AsemanQuickObject\"\n        exports: [\"AsemanQml.Network/NetworkRequest 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"ContentType\"\n            values: {\n                \"TypeJson\": 0,\n                \"TypeForm\": 1,\n                \"TypeWWWForm\": 2,\n                \"TypeNone\": 3\n            }\n        }\n        Property { name: \"response\"; type: \"QVariant\"; isReadonly: true }\n        Property { name: \"data\"; type: \"QVariant\" }\n        Property { name: \"cachedData\"; type: \"QVariant\" }\n        Property { name: \"contentType\"; type: \"int\" }\n        Property { name: \"status\"; type: \"int\"; isReadonly: true }\n        Property { name: \"refreshing\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"error\"; type: \"string\"; isReadonly: true }\n        Property { name: \"sslErrors\"; type: \"string\"; isReadonly: true }\n        Property { name: \"ignoreKeys\"; type: \"QStringList\" }\n        Property { name: \"ignoreRegExp\"; type: \"QRegExp\" }\n        Property { name: \"cachePath\"; type: \"string\" }\n        Property { name: \"headers\"; type: \"QVariantMap\" }\n        Property { name: \"url\"; type: \"QUrl\" }\n        Property { name: \"ignoreSslErrors\"; type: \"bool\" }\n        Signal {\n            name: \"successfull\"\n            Parameter { name: \"status\"; type: \"int\" }\n        }\n        Signal {\n            name: \"unsuccessfull\"\n            Parameter { name: \"status\"; type: \"int\" }\n        }\n        Signal {\n            name: \"clientError\"\n            Parameter { name: \"status\"; type: \"int\" }\n        }\n        Signal {\n            name: \"serverError\"\n            Parameter { name: \"status\"; type: \"int\" }\n        }\n        Signal {\n            name: \"uploadProgress\"\n            Parameter { name: \"bytesSent\"; type: \"qlonglong\" }\n            Parameter { name: \"bytesTotal\"; type: \"qlonglong\" }\n        }\n        Signal {\n            name: \"downloadProgress\"\n            Parameter { name: \"bytesReceived\"; type: \"qlonglong\" }\n            Parameter { name: \"bytesTotal\"; type: \"qlonglong\" }\n        }\n        Method { name: \"toMap\"; type: \"QVariantMap\" }\n        Method {\n            name: \"fromMap\"\n            Parameter { name: \"map\"; type: \"QVariantMap\" }\n        }\n        Method { name: \"toJson\"; type: \"string\" }\n        Method {\n            name: \"fromJson\"\n            Parameter { name: \"json\"; type: \"string\" }\n        }\n        Method {\n            name: \"toFormData\"\n            type: \"string\"\n            Parameter { name: \"ignoreEmpty\"; type: \"bool\" }\n        }\n        Method { name: \"toFormData\"; type: \"string\" }\n        Method {\n            name: \"fromFormData\"\n            Parameter { name: \"formData\"; type: \"string\" }\n        }\n        Method { name: \"properties\"; type: \"QStringList\" }\n    }\n    Component {\n        name: \"AsemanNetworkRequestReply\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Network/NetworkRequestReply 2.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        Signal {\n            name: \"finished\"\n            Parameter { name: \"status\"; type: \"int\" }\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n        Signal {\n            name: \"uploadProgress\"\n            Parameter { name: \"bytesSent\"; type: \"qlonglong\" }\n            Parameter { name: \"bytesTotal\"; type: \"qlonglong\" }\n        }\n        Signal {\n            name: \"downloadProgress\"\n            Parameter { name: \"bytesReceived\"; type: \"qlonglong\" }\n            Parameter { name: \"bytesTotal\"; type: \"qlonglong\" }\n        }\n        Signal {\n            name: \"error\"\n            Parameter { name: \"errorString\"; type: \"string\" }\n            Parameter { name: \"errorCode\"; type: \"QNetworkReply::NetworkError\" }\n        }\n        Method { name: \"abort\" }\n    }\n    Component {\n        name: \"AsemanQuickObject\"\n        defaultProperty: \"items\"\n        prototype: \"QObject\"\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Network/qmldir",
    "content": "module AsemanQml.Network\nclassname AsemanNetworkPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlnetwork\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Sql/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Sql 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.12\"]\n    Component {\n        name: \"AsemanQuickSqlObject\"\n        prototype: \"AsemanSqlObject\"\n        exports: [\"AsemanQml.Sql/SqlObject 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Method {\n            name: \"queryAsync\"\n            Parameter { name: \"query\"; type: \"string\" }\n            Parameter { name: \"binds\"; type: \"QVariantMap\" }\n            Parameter { name: \"callback\"; type: \"QJSValue\" }\n        }\n    }\n    Component {\n        name: \"AsemanSqlObject\"\n        prototype: \"QObject\"\n        Enum {\n            name: \"DriverTypes\"\n            values: {\n                \"NoneDriver\": 0,\n                \"SQLite\": 1,\n                \"MySQL\": 2,\n                \"PostgreSQL\": 3,\n                \"ODBC\": 4,\n                \"MSSQL\": 5\n            }\n        }\n        Property { name: \"table\"; type: \"string\" }\n        Property { name: \"driver\"; type: \"QVariant\" }\n        Property { name: \"databaseName\"; type: \"string\" }\n        Property { name: \"host\"; type: \"string\" }\n        Property { name: \"port\"; type: \"int\" }\n        Property { name: \"userName\"; type: \"string\" }\n        Property { name: \"password\"; type: \"string\" }\n        Property { name: \"createQuery\"; type: \"string\" }\n        Property { name: \"primaryKeys\"; type: \"QStringList\" }\n        Property { name: \"lastError\"; type: \"string\"; isReadonly: true }\n        Method {\n            name: \"insert\"\n            type: \"int\"\n            Parameter { name: \"extra\"; type: \"string\" }\n        }\n        Method { name: \"insert\"; type: \"int\" }\n        Method {\n            name: \"update\"\n            Parameter { name: \"where\"; type: \"string\" }\n            Parameter { name: \"binds\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"update\"\n            Parameter { name: \"where\"; type: \"string\" }\n        }\n        Method { name: \"update\" }\n        Method { name: \"select\"; type: \"QVariantList\" }\n        Method {\n            name: \"select\"\n            type: \"QVariantList\"\n            Parameter { name: \"where\"; type: \"string\" }\n            Parameter { name: \"binds\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"select\"\n            type: \"QVariantList\"\n            Parameter { name: \"join\"; type: \"string\" }\n            Parameter { name: \"where\"; type: \"string\" }\n            Parameter { name: \"binds\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"select\"\n            type: \"QVariantList\"\n            Parameter { name: \"join\"; type: \"string\" }\n            Parameter { name: \"where\"; type: \"string\" }\n            Parameter { name: \"extra\"; type: \"string\" }\n            Parameter { name: \"binds\"; type: \"QVariantMap\" }\n        }\n        Method { name: \"push\" }\n        Method { name: \"fetch\" }\n        Method {\n            name: \"deleteQuery\"\n            Parameter { name: \"where\"; type: \"string\" }\n            Parameter { name: \"binds\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"deleteQuery\"\n            Parameter { name: \"where\"; type: \"string\" }\n        }\n        Method {\n            name: \"query\"\n            type: \"QVariantList\"\n            Parameter { name: \"query\"; type: \"string\" }\n            Parameter { name: \"binds\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"query\"\n            type: \"QVariantList\"\n            Parameter { name: \"query\"; type: \"string\" }\n        }\n        Method { name: \"create\" }\n        Method { name: \"drop\" }\n        Method { name: \"getData\"; type: \"QVariantMap\" }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Sql/qmldir",
    "content": "module AsemanQml.Sql\nclassname AsemanSqlPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlsql\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Viewport/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Viewport 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.0\"]\n    Component {\n        name: \"AsemanAbstractViewportType\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Viewport/AbstractViewportTypeCore 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"backgroundItem\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"foregroundItem\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"viewport\"; type: \"AsemanViewport\"; isPointer: true }\n        Property { name: \"open\"; type: \"bool\" }\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"gestureWidthIsNull\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"maximumWidthIsNull\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"typeTransformOrigin\"; type: \"QPointF\" }\n        Property { name: \"typeTransformOriginIsNull\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"touchToCloseIsNull\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"blockBackIsNull\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"sourceObject\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"sourceObjectIsNull\"; type: \"bool\"; isReadonly: true }\n    }\n    Component {\n        name: \"AsemanViewport\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Viewport/ViewportCore 2.0\"]\n        exportMetaObjectRevisions: [0]\n        attachedType: \"AsemanViewportAttechedProperty\"\n        Property { name: \"items\"; type: \"AsemanViewportItem\"; isList: true; isReadonly: true }\n        Property { name: \"keys\"; type: \"QStringList\"; isReadonly: true }\n        Property { name: \"primaryViewport\"; type: \"bool\" }\n        Signal { name: \"viewportChanged\" }\n        Method {\n            name: \"getComponent\"\n            type: \"QVariant\"\n            Parameter { name: \"name\"; type: \"string\" }\n        }\n        Method {\n            name: \"createComponent\"\n            type: \"QQmlComponent*\"\n            Parameter { name: \"fileUrl\"; type: \"QUrl\" }\n            Parameter { name: \"asyn\"; type: \"bool\" }\n        }\n        Method {\n            name: \"createComponent\"\n            type: \"QQmlComponent*\"\n            Parameter { name: \"fileUrl\"; type: \"QUrl\" }\n        }\n    }\n    Component {\n        name: \"AsemanViewportAttechedProperty\"\n        prototype: \"QObject\"\n        Property { name: \"controller\"; type: \"QObject\"; isReadonly: true; isPointer: true }\n        Property { name: \"allControllers\"; type: \"QList<QObject*>\"; isReadonly: true }\n        Property { name: \"viewport\"; type: \"AsemanViewport\"; isReadonly: true; isPointer: true }\n        Property { name: \"primaryViewport\"; type: \"AsemanViewport\"; isReadonly: true; isPointer: true }\n        Signal { name: \"controllersChanged\" }\n    }\n    Component {\n        name: \"AsemanViewportController\"\n        defaultProperty: \"routes\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Viewport/ViewportControllerCore 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"routes\"; type: \"AsemanViewportControllerRoute\"; isList: true; isReadonly: true }\n        Property { name: \"viewport\"; type: \"AsemanViewport\"; isPointer: true }\n        Property { name: \"allowRecursiveTrigger\"; type: \"bool\" }\n        Method {\n            name: \"lookup\"\n            type: \"QVariantMap\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"properties\"; type: \"QVariantMap\" }\n            Parameter { name: \"viewport\"; type: \"AsemanViewport\"; isPointer: true }\n        }\n        Method {\n            name: \"lookup\"\n            type: \"QVariantMap\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"properties\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"lookup\"\n            type: \"QVariantMap\"\n            Parameter { name: \"url\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanViewportControllerRoute\"\n        defaultProperty: \"sourceComponent\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Viewport/ViewportControllerRoute 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"route\"; type: \"QRegularExpression\" }\n        Property { name: \"sourceComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"source\"; type: \"QUrl\" }\n        Property { name: \"viewportType\"; type: \"string\" }\n        Signal { name: \"componentChanged\" }\n    }\n    Component {\n        name: \"AsemanViewportItem\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Viewport/ViewportItem 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"name\"; type: \"string\" }\n        Property { name: \"component\"; type: \"QVariant\" }\n    }\n    Component {\n        name: \"AsemanViewportType\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Viewport/ViewportType 2.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        attachedType: \"AsemanViewportTypeAttechedProperty\"\n    }\n    Component {\n        name: \"AsemanViewportTypeAttechedProperty\"\n        prototype: \"QObject\"\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"transformOrigin\"; type: \"QPointF\" }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"sourceObject\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"open\"; type: \"bool\" }\n        Signal { name: \"typeTransformOriginChanged\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/AbstractViewportType 2.0\"\n        exports: [\"AsemanQml.Viewport/AbstractViewportType 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/AndroidActivityViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/AndroidActivityViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"openRatio\"; type: \"double\" }\n        Property { name: \"mouseRatio\"; type: \"double\" }\n        Property { name: \"realRatio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/AndroidBottomDrawerViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/AndroidBottomDrawerViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"openRatio\"; type: \"double\" }\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/AndroidDefaultPagesViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/AndroidDefaultPagesViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/AndroidDialogViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/AndroidDialogViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/IOSBottomDrawerViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/IOSBottomDrawerViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"openRatio\"; type: \"double\" }\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/IOSContextMenuViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/IOSContextMenuViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/IOSDialogViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/IOSDialogViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/IOSNormalViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/IOSNormalViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"openRatio\"; type: \"double\" }\n        Property { name: \"mouseRatio\"; type: \"double\" }\n        Property { name: \"foregroundX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/IOSPopupViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/IOSPopupViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"topPadSize\"; type: \"double\"; isReadonly: true }\n        Property { name: \"openRatio\"; type: \"double\" }\n        Property { name: \"mouseRatio\"; type: \"double\" }\n        Property { name: \"foregroundScale\"; type: \"double\"; isReadonly: true }\n        Property { name: \"foregroundHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"realRatio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"tabletMode\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isIOSPopup\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"nextItem\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"iosBelowIndex\"; type: \"int\"; isReadonly: true }\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/NoneViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/NoneViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/SplitedViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/SplitedViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"openRatio\"; type: \"double\" }\n        Property { name: \"mouseRatio\"; type: \"double\" }\n        Property { name: \"foregroundX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanViewport\"\n        name: \"AsemanQml.Viewport/Viewport 2.0\"\n        exports: [\"AsemanQml.Viewport/Viewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"androidStyle\"; type: \"bool\" }\n        Property { name: \"mainItem\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"currentItem\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"currentType\"; type: \"string\"; isReadonly: true }\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"list\"; type: \"QVariantList\" }\n        Method {\n            name: \"append\"\n            type: \"QVariant\"\n            Parameter { name: \"component\"; type: \"QVariant\" }\n            Parameter { name: \"properties\"; type: \"QVariant\" }\n            Parameter { name: \"type\"; type: \"QVariant\" }\n        }\n        Method { name: \"closeLast\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanViewportController\"\n        name: \"AsemanQml.Viewport/ViewportController 2.0\"\n        exports: [\"AsemanQml.Viewport/ViewportController 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"routes\"\n        Method {\n            name: \"trigger\"\n            type: \"QVariant\"\n            Parameter { name: \"url\"; type: \"QVariant\" }\n            Parameter { name: \"properties\"; type: \"QVariant\" }\n            Parameter { name: \"viewport\"; type: \"QVariant\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Viewport/ViewportPage 2.0\"\n        exports: [\"AsemanQml.Viewport/ViewportPage 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"pageData\"\n        Property { name: \"header\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"title\"; type: \"string\" }\n        Property { name: \"pageData\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Viewport/qmldir",
    "content": "module AsemanQml.Viewport\nclassname AsemanViewportPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlviewport\ndepends AsemanQml.Base 2.0\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Widgets/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Widgets 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.8\"]\n    Component {\n        name: \"AsemanLinuxNativeNotification\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Widgets/Notification 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"color\"; type: \"QColor\" }\n        Signal {\n            name: \"notifyClosed\"\n            Parameter { name: \"id\"; type: \"uint\" }\n        }\n        Signal {\n            name: \"notifyTimedOut\"\n            Parameter { name: \"id\"; type: \"uint\" }\n        }\n        Signal {\n            name: \"notifyAction\"\n            Parameter { name: \"id\"; type: \"uint\" }\n            Parameter { name: \"action\"; type: \"string\" }\n        }\n        Method {\n            name: \"sendNotify\"\n            type: \"uint\"\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"body\"; type: \"string\" }\n            Parameter { name: \"icon\"; type: \"string\" }\n            Parameter { name: \"replace_id\"; type: \"uint\" }\n            Parameter { name: \"timeOut\"; type: \"int\" }\n            Parameter { name: \"actions\"; type: \"QStringList\" }\n        }\n        Method {\n            name: \"sendNotify\"\n            type: \"uint\"\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"body\"; type: \"string\" }\n            Parameter { name: \"icon\"; type: \"string\" }\n            Parameter { name: \"replace_id\"; type: \"uint\" }\n            Parameter { name: \"timeOut\"; type: \"int\" }\n        }\n        Method {\n            name: \"sendNotify\"\n            type: \"uint\"\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"body\"; type: \"string\" }\n            Parameter { name: \"icon\"; type: \"string\" }\n            Parameter { name: \"replace_id\"; type: \"uint\" }\n        }\n        Method {\n            name: \"sendNotify\"\n            type: \"uint\"\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"body\"; type: \"string\" }\n            Parameter { name: \"icon\"; type: \"string\" }\n        }\n        Method {\n            name: \"closeNotification\"\n            Parameter { name: \"id\"; type: \"uint\" }\n        }\n    }\n    Component {\n        name: \"AsemanSystemTray\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Widgets/SystemTray 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"ActivateReason\"\n            values: {\n                \"ActivateUnknown\": 0,\n                \"ActivateContext\": 1,\n                \"ActivateDoubleClick\": 2,\n                \"ActivateTrigger\": 3,\n                \"ActivateMiddleClick\": 4\n            }\n        }\n        Property { name: \"visible\"; type: \"bool\" }\n        Property { name: \"icon\"; type: \"QUrl\" }\n        Property { name: \"badgeCount\"; type: \"int\" }\n        Property { name: \"badgeFillColor\"; type: \"QColor\" }\n        Property { name: \"badgeStrokeColor\"; type: \"QColor\" }\n        Property { name: \"badgeTextColor\"; type: \"QColor\" }\n        Property { name: \"menu\"; type: \"QStringList\" }\n        Signal {\n            name: \"activated\"\n            Parameter { name: \"reason\"; type: \"int\" }\n        }\n        Signal {\n            name: \"menuTriggered\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/import/AsemanQml/Widgets/qmldir",
    "content": "module AsemanQml.Widgets\nclassname AsemanWidgetsPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlwidgets\n"
  },
  {
    "path": "src/asemanqml/materialicons/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/materialiconsplugin.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/materialiconsplugin.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/qmake_asemanmaterialicons.qrc\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n\n"
  },
  {
    "path": "src/asemanqml/materialicons/MaterialIcons/MaterialIcons.qml",
    "content": "pragma Singleton\nimport QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nAsemanObject {\n    readonly property string family: Devices.isQt6? materialDesign.name : google.name + \", \" + materialDesign.name\n\n    FontLoader {\n        id: google\n        source: \"MaterialIcons-Regular.ttf\"\n    }\n\n    FontLoader {\n        id: materialDesign\n        source: \"materialdesignicons-webfont.ttf\"\n    }\n\n    function init() {}\n\n    readonly property string mi_3d_rotation: \"\\ue84d\"\n    readonly property string mi_ac_unit: \"\\ueb3b\"\n    readonly property string mi_access_alarm: \"\\ue190\"\n    readonly property string mi_access_alarms: \"\\ue191\"\n    readonly property string mi_access_time: \"\\ue192\"\n    readonly property string mi_accessibility: \"\\ue84e\"\n    readonly property string mi_accessible: \"\\ue914\"\n    readonly property string mi_account_balance: \"\\ue84f\"\n    readonly property string mi_account_balance_wallet: \"\\ue850\"\n    readonly property string mi_account_box: \"\\ue851\"\n    readonly property string mi_account_circle: \"\\ue853\"\n    readonly property string mi_adb: \"\\ue60e\"\n    readonly property string mi_add: \"\\ue145\"\n    readonly property string mi_add_a_photo: \"\\ue439\"\n    readonly property string mi_add_alarm: \"\\ue193\"\n    readonly property string mi_add_alert: \"\\ue003\"\n    readonly property string mi_add_box: \"\\ue146\"\n    readonly property string mi_add_circle: \"\\ue147\"\n    readonly property string mi_add_circle_outline: \"\\ue148\"\n    readonly property string mi_add_location: \"\\ue567\"\n    readonly property string mi_add_shopping_cart: \"\\ue854\"\n    readonly property string mi_add_to_photos: \"\\ue39d\"\n    readonly property string mi_add_to_queue: \"\\ue05c\"\n    readonly property string mi_adjust: \"\\ue39e\"\n    readonly property string mi_airline_seat_flat: \"\\ue630\"\n    readonly property string mi_airline_seat_flat_angled: \"\\ue631\"\n    readonly property string mi_airline_seat_individual_suite: \"\\ue632\"\n    readonly property string mi_airline_seat_legroom_extra: \"\\ue633\"\n    readonly property string mi_airline_seat_legroom_normal: \"\\ue634\"\n    readonly property string mi_airline_seat_legroom_reduced: \"\\ue635\"\n    readonly property string mi_airline_seat_recline_extra: \"\\ue636\"\n    readonly property string mi_airline_seat_recline_normal: \"\\ue637\"\n    readonly property string mi_airplanemode_active: \"\\ue195\"\n    readonly property string mi_airplanemode_inactive: \"\\ue194\"\n    readonly property string mi_airplay: \"\\ue055\"\n    readonly property string mi_airport_shuttle: \"\\ueb3c\"\n    readonly property string mi_alarm: \"\\ue855\"\n    readonly property string mi_alarm_add: \"\\ue856\"\n    readonly property string mi_alarm_off: \"\\ue857\"\n    readonly property string mi_alarm_on: \"\\ue858\"\n    readonly property string mi_album: \"\\ue019\"\n    readonly property string mi_all_inclusive: \"\\ueb3d\"\n    readonly property string mi_all_out: \"\\ue90b\"\n    readonly property string mi_android: \"\\ue859\"\n    readonly property string mi_announcement: \"\\ue85a\"\n    readonly property string mi_apps: \"\\ue5c3\"\n    readonly property string mi_archive: \"\\ue149\"\n    readonly property string mi_arrow_back: \"\\ue5c4\"\n    readonly property string mi_arrow_downward: \"\\ue5db\"\n    readonly property string mi_arrow_drop_down: \"\\ue5c5\"\n    readonly property string mi_arrow_drop_down_circle: \"\\ue5c6\"\n    readonly property string mi_arrow_drop_up: \"\\ue5c7\"\n    readonly property string mi_arrow_forward: \"\\ue5c8\"\n    readonly property string mi_arrow_upward: \"\\ue5d8\"\n    readonly property string mi_art_track: \"\\ue060\"\n    readonly property string mi_aspect_ratio: \"\\ue85b\"\n    readonly property string mi_assessment: \"\\ue85c\"\n    readonly property string mi_assignment: \"\\ue85d\"\n    readonly property string mi_assignment_ind: \"\\ue85e\"\n    readonly property string mi_assignment_late: \"\\ue85f\"\n    readonly property string mi_assignment_return: \"\\ue860\"\n    readonly property string mi_assignment_returned: \"\\ue861\"\n    readonly property string mi_assignment_turned_in: \"\\ue862\"\n    readonly property string mi_assistant: \"\\ue39f\"\n    readonly property string mi_assistant_photo: \"\\ue3a0\"\n    readonly property string mi_attach_file: \"\\ue226\"\n    readonly property string mi_attach_money: \"\\ue227\"\n    readonly property string mi_attachment: \"\\ue2bc\"\n    readonly property string mi_audiotrack: \"\\ue3a1\"\n    readonly property string mi_autorenew: \"\\ue863\"\n    readonly property string mi_av_timer: \"\\ue01b\"\n    readonly property string mi_backspace: \"\\ue14a\"\n    readonly property string mi_backup: \"\\ue864\"\n    readonly property string mi_battery_alert: \"\\ue19c\"\n    readonly property string mi_battery_charging_full: \"\\ue1a3\"\n    readonly property string mi_battery_full: \"\\ue1a4\"\n    readonly property string mi_battery_std: \"\\ue1a5\"\n    readonly property string mi_battery_unknown: \"\\ue1a6\"\n    readonly property string mi_beach_access: \"\\ueb3e\"\n    readonly property string mi_beenhere: \"\\ue52d\"\n    readonly property string mi_block: \"\\ue14b\"\n    readonly property string mi_bluetooth: \"\\ue1a7\"\n    readonly property string mi_bluetooth_audio: \"\\ue60f\"\n    readonly property string mi_bluetooth_connected: \"\\ue1a8\"\n    readonly property string mi_bluetooth_disabled: \"\\ue1a9\"\n    readonly property string mi_bluetooth_searching: \"\\ue1aa\"\n    readonly property string mi_blur_circular: \"\\ue3a2\"\n    readonly property string mi_blur_linear: \"\\ue3a3\"\n    readonly property string mi_blur_off: \"\\ue3a4\"\n    readonly property string mi_blur_on: \"\\ue3a5\"\n    readonly property string mi_book: \"\\ue865\"\n    readonly property string mi_bookmark: \"\\ue866\"\n    readonly property string mi_bookmark_border: \"\\ue867\"\n    readonly property string mi_border_all: \"\\ue228\"\n    readonly property string mi_border_bottom: \"\\ue229\"\n    readonly property string mi_border_clear: \"\\ue22a\"\n    readonly property string mi_border_color: \"\\ue22b\"\n    readonly property string mi_border_horizontal: \"\\ue22c\"\n    readonly property string mi_border_inner: \"\\ue22d\"\n    readonly property string mi_border_left: \"\\ue22e\"\n    readonly property string mi_border_outer: \"\\ue22f\"\n    readonly property string mi_border_right: \"\\ue230\"\n    readonly property string mi_border_style: \"\\ue231\"\n    readonly property string mi_border_top: \"\\ue232\"\n    readonly property string mi_border_vertical: \"\\ue233\"\n    readonly property string mi_branding_watermark: \"\\ue06b\"\n    readonly property string mi_brightness_1: \"\\ue3a6\"\n    readonly property string mi_brightness_2: \"\\ue3a7\"\n    readonly property string mi_brightness_3: \"\\ue3a8\"\n    readonly property string mi_brightness_4: \"\\ue3a9\"\n    readonly property string mi_brightness_5: \"\\ue3aa\"\n    readonly property string mi_brightness_6: \"\\ue3ab\"\n    readonly property string mi_brightness_7: \"\\ue3ac\"\n    readonly property string mi_brightness_auto: \"\\ue1ab\"\n    readonly property string mi_brightness_high: \"\\ue1ac\"\n    readonly property string mi_brightness_low: \"\\ue1ad\"\n    readonly property string mi_brightness_medium: \"\\ue1ae\"\n    readonly property string mi_broken_image: \"\\ue3ad\"\n    readonly property string mi_brush: \"\\ue3ae\"\n    readonly property string mi_bubble_chart: \"\\ue6dd\"\n    readonly property string mi_bug_report: \"\\ue868\"\n    readonly property string mi_build: \"\\ue869\"\n    readonly property string mi_burst_mode: \"\\ue43c\"\n    readonly property string mi_business: \"\\ue0af\"\n    readonly property string mi_business_center: \"\\ueb3f\"\n    readonly property string mi_cached: \"\\ue86a\"\n    readonly property string mi_cake: \"\\ue7e9\"\n    readonly property string mi_call: \"\\ue0b0\"\n    readonly property string mi_call_end: \"\\ue0b1\"\n    readonly property string mi_call_made: \"\\ue0b2\"\n    readonly property string mi_call_merge: \"\\ue0b3\"\n    readonly property string mi_call_missed: \"\\ue0b4\"\n    readonly property string mi_call_missed_outgoing: \"\\ue0e4\"\n    readonly property string mi_call_received: \"\\ue0b5\"\n    readonly property string mi_call_split: \"\\ue0b6\"\n    readonly property string mi_call_to_action: \"\\ue06c\"\n    readonly property string mi_camera: \"\\ue3af\"\n    readonly property string mi_camera_alt: \"\\ue3b0\"\n    readonly property string mi_camera_enhance: \"\\ue8fc\"\n    readonly property string mi_camera_front: \"\\ue3b1\"\n    readonly property string mi_camera_rear: \"\\ue3b2\"\n    readonly property string mi_camera_roll: \"\\ue3b3\"\n    readonly property string mi_cancel: \"\\ue5c9\"\n    readonly property string mi_card_giftcard: \"\\ue8f6\"\n    readonly property string mi_card_membership: \"\\ue8f7\"\n    readonly property string mi_card_travel: \"\\ue8f8\"\n    readonly property string mi_casino: \"\\ueb40\"\n    readonly property string mi_cast: \"\\ue307\"\n    readonly property string mi_cast_connected: \"\\ue308\"\n    readonly property string mi_center_focus_strong: \"\\ue3b4\"\n    readonly property string mi_center_focus_weak: \"\\ue3b5\"\n    readonly property string mi_change_history: \"\\ue86b\"\n    readonly property string mi_chat: \"\\ue0b7\"\n    readonly property string mi_chat_bubble: \"\\ue0ca\"\n    readonly property string mi_chat_bubble_outline: \"\\ue0cb\"\n    readonly property string mi_check: \"\\ue5ca\"\n    readonly property string mi_check_box: \"\\ue834\"\n    readonly property string mi_check_box_outline_blank: \"\\ue835\"\n    readonly property string mi_check_circle: \"\\ue86c\"\n    readonly property string mi_chevron_left: \"\\ue5cb\"\n    readonly property string mi_chevron_right: \"\\ue5cc\"\n    readonly property string mi_child_care: \"\\ueb41\"\n    readonly property string mi_child_friendly: \"\\ueb42\"\n    readonly property string mi_chrome_reader_mode: \"\\ue86d\"\n    readonly property string mi_class: \"\\ue86e\"\n    readonly property string mi_clear: \"\\ue14c\"\n    readonly property string mi_clear_all: \"\\ue0b8\"\n    readonly property string mi_close: \"\\ue5cd\"\n    readonly property string mi_closed_caption: \"\\ue01c\"\n    readonly property string mi_cloud: \"\\ue2bd\"\n    readonly property string mi_cloud_circle: \"\\ue2be\"\n    readonly property string mi_cloud_done: \"\\ue2bf\"\n    readonly property string mi_cloud_download: \"\\ue2c0\"\n    readonly property string mi_cloud_off: \"\\ue2c1\"\n    readonly property string mi_cloud_queue: \"\\ue2c2\"\n    readonly property string mi_cloud_upload: \"\\ue2c3\"\n    readonly property string mi_code: \"\\ue86f\"\n    readonly property string mi_collections: \"\\ue3b6\"\n    readonly property string mi_collections_bookmark: \"\\ue431\"\n    readonly property string mi_color_lens: \"\\ue3b7\"\n    readonly property string mi_colorize: \"\\ue3b8\"\n    readonly property string mi_comment: \"\\ue0b9\"\n    readonly property string mi_compare: \"\\ue3b9\"\n    readonly property string mi_compare_arrows: \"\\ue915\"\n    readonly property string mi_computer: \"\\ue30a\"\n    readonly property string mi_confirmation_number: \"\\ue638\"\n    readonly property string mi_contact_mail: \"\\ue0d0\"\n    readonly property string mi_contact_phone: \"\\ue0cf\"\n    readonly property string mi_contacts: \"\\ue0ba\"\n    readonly property string mi_content_copy: \"\\ue14d\"\n    readonly property string mi_content_cut: \"\\ue14e\"\n    readonly property string mi_content_paste: \"\\ue14f\"\n    readonly property string mi_control_point: \"\\ue3ba\"\n    readonly property string mi_control_point_duplicate: \"\\ue3bb\"\n    readonly property string mi_copyright: \"\\ue90c\"\n    readonly property string mi_create: \"\\ue150\"\n    readonly property string mi_create_new_folder: \"\\ue2cc\"\n    readonly property string mi_credit_card: \"\\ue870\"\n    readonly property string mi_crop: \"\\ue3be\"\n    readonly property string mi_crop_16_9: \"\\ue3bc\"\n    readonly property string mi_crop_3_2: \"\\ue3bd\"\n    readonly property string mi_crop_5_4: \"\\ue3bf\"\n    readonly property string mi_crop_7_5: \"\\ue3c0\"\n    readonly property string mi_crop_din: \"\\ue3c1\"\n    readonly property string mi_crop_free: \"\\ue3c2\"\n    readonly property string mi_crop_landscape: \"\\ue3c3\"\n    readonly property string mi_crop_original: \"\\ue3c4\"\n    readonly property string mi_crop_portrait: \"\\ue3c5\"\n    readonly property string mi_crop_rotate: \"\\ue437\"\n    readonly property string mi_crop_square: \"\\ue3c6\"\n    readonly property string mi_dashboard: \"\\ue871\"\n    readonly property string mi_data_usage: \"\\ue1af\"\n    readonly property string mi_date_range: \"\\ue916\"\n    readonly property string mi_dehaze: \"\\ue3c7\"\n    readonly property string mi_delete: \"\\ue872\"\n    readonly property string mi_delete_forever: \"\\ue92b\"\n    readonly property string mi_delete_sweep: \"\\ue16c\"\n    readonly property string mi_description: \"\\ue873\"\n    readonly property string mi_desktop_mac: \"\\ue30b\"\n    readonly property string mi_desktop_windows: \"\\ue30c\"\n    readonly property string mi_details: \"\\ue3c8\"\n    readonly property string mi_developer_board: \"\\ue30d\"\n    readonly property string mi_developer_mode: \"\\ue1b0\"\n    readonly property string mi_device_hub: \"\\ue335\"\n    readonly property string mi_devices: \"\\ue1b1\"\n    readonly property string mi_devices_other: \"\\ue337\"\n    readonly property string mi_dialer_sip: \"\\ue0bb\"\n    readonly property string mi_dialpad: \"\\ue0bc\"\n    readonly property string mi_directions: \"\\ue52e\"\n    readonly property string mi_directions_bike: \"\\ue52f\"\n    readonly property string mi_directions_boat: \"\\ue532\"\n    readonly property string mi_directions_bus: \"\\ue530\"\n    readonly property string mi_directions_car: \"\\ue531\"\n    readonly property string mi_directions_railway: \"\\ue534\"\n    readonly property string mi_directions_run: \"\\ue566\"\n    readonly property string mi_directions_subway: \"\\ue533\"\n    readonly property string mi_directions_transit: \"\\ue535\"\n    readonly property string mi_directions_walk: \"\\ue536\"\n    readonly property string mi_disc_full: \"\\ue610\"\n    readonly property string mi_dns: \"\\ue875\"\n    readonly property string mi_do_not_disturb: \"\\ue612\"\n    readonly property string mi_do_not_disturb_alt: \"\\ue611\"\n    readonly property string mi_do_not_disturb_off: \"\\ue643\"\n    readonly property string mi_do_not_disturb_on: \"\\ue644\"\n    readonly property string mi_dock: \"\\ue30e\"\n    readonly property string mi_domain: \"\\ue7ee\"\n    readonly property string mi_done: \"\\ue876\"\n    readonly property string mi_done_all: \"\\ue877\"\n    readonly property string mi_donut_large: \"\\ue917\"\n    readonly property string mi_donut_small: \"\\ue918\"\n    readonly property string mi_drafts: \"\\ue151\"\n    readonly property string mi_drag_handle: \"\\ue25d\"\n    readonly property string mi_drive_eta: \"\\ue613\"\n    readonly property string mi_dvr: \"\\ue1b2\"\n    readonly property string mi_edit: \"\\ue3c9\"\n    readonly property string mi_edit_location: \"\\ue568\"\n    readonly property string mi_eject: \"\\ue8fb\"\n    readonly property string mi_email: \"\\ue0be\"\n    readonly property string mi_enhanced_encryption: \"\\ue63f\"\n    readonly property string mi_equalizer: \"\\ue01d\"\n    readonly property string mi_error: \"\\ue000\"\n    readonly property string mi_error_outline: \"\\ue001\"\n    readonly property string mi_euro_symbol: \"\\ue926\"\n    readonly property string mi_ev_station: \"\\ue56d\"\n    readonly property string mi_event: \"\\ue878\"\n    readonly property string mi_event_available: \"\\ue614\"\n    readonly property string mi_event_busy: \"\\ue615\"\n    readonly property string mi_event_note: \"\\ue616\"\n    readonly property string mi_event_seat: \"\\ue903\"\n    readonly property string mi_exit_to_app: \"\\ue879\"\n    readonly property string mi_expand_less: \"\\ue5ce\"\n    readonly property string mi_expand_more: \"\\ue5cf\"\n    readonly property string mi_explicit: \"\\ue01e\"\n    readonly property string mi_explore: \"\\ue87a\"\n    readonly property string mi_exposure: \"\\ue3ca\"\n    readonly property string mi_exposure_neg_1: \"\\ue3cb\"\n    readonly property string mi_exposure_neg_2: \"\\ue3cc\"\n    readonly property string mi_exposure_plus_1: \"\\ue3cd\"\n    readonly property string mi_exposure_plus_2: \"\\ue3ce\"\n    readonly property string mi_exposure_zero: \"\\ue3cf\"\n    readonly property string mi_extension: \"\\ue87b\"\n    readonly property string mi_face: \"\\ue87c\"\n    readonly property string mi_fast_forward: \"\\ue01f\"\n    readonly property string mi_fast_rewind: \"\\ue020\"\n    readonly property string mi_favorite: \"\\ue87d\"\n    readonly property string mi_favorite_border: \"\\ue87e\"\n    readonly property string mi_featured_play_list: \"\\ue06d\"\n    readonly property string mi_featured_video: \"\\ue06e\"\n    readonly property string mi_feedback: \"\\ue87f\"\n    readonly property string mi_fiber_dvr: \"\\ue05d\"\n    readonly property string mi_fiber_manual_record: \"\\ue061\"\n    readonly property string mi_fiber_new: \"\\ue05e\"\n    readonly property string mi_fiber_pin: \"\\ue06a\"\n    readonly property string mi_fiber_smart_record: \"\\ue062\"\n    readonly property string mi_file_download: \"\\ue2c4\"\n    readonly property string mi_file_upload: \"\\ue2c6\"\n    readonly property string mi_filter: \"\\ue3d3\"\n    readonly property string mi_filter_1: \"\\ue3d0\"\n    readonly property string mi_filter_2: \"\\ue3d1\"\n    readonly property string mi_filter_3: \"\\ue3d2\"\n    readonly property string mi_filter_4: \"\\ue3d4\"\n    readonly property string mi_filter_5: \"\\ue3d5\"\n    readonly property string mi_filter_6: \"\\ue3d6\"\n    readonly property string mi_filter_7: \"\\ue3d7\"\n    readonly property string mi_filter_8: \"\\ue3d8\"\n    readonly property string mi_filter_9: \"\\ue3d9\"\n    readonly property string mi_filter_9_plus: \"\\ue3da\"\n    readonly property string mi_filter_b_and_w: \"\\ue3db\"\n    readonly property string mi_filter_center_focus: \"\\ue3dc\"\n    readonly property string mi_filter_drama: \"\\ue3dd\"\n    readonly property string mi_filter_frames: \"\\ue3de\"\n    readonly property string mi_filter_hdr: \"\\ue3df\"\n    readonly property string mi_filter_list: \"\\ue152\"\n    readonly property string mi_filter_none: \"\\ue3e0\"\n    readonly property string mi_filter_tilt_shift: \"\\ue3e2\"\n    readonly property string mi_filter_vintage: \"\\ue3e3\"\n    readonly property string mi_find_in_page: \"\\ue880\"\n    readonly property string mi_find_replace: \"\\ue881\"\n    readonly property string mi_fingerprint: \"\\ue90d\"\n    readonly property string mi_first_page: \"\\ue5dc\"\n    readonly property string mi_fitness_center: \"\\ueb43\"\n    readonly property string mi_flag: \"\\ue153\"\n    readonly property string mi_flare: \"\\ue3e4\"\n    readonly property string mi_flash_auto: \"\\ue3e5\"\n    readonly property string mi_flash_off: \"\\ue3e6\"\n    readonly property string mi_flash_on: \"\\ue3e7\"\n    readonly property string mi_flight: \"\\ue539\"\n    readonly property string mi_flight_land: \"\\ue904\"\n    readonly property string mi_flight_takeoff: \"\\ue905\"\n    readonly property string mi_flip: \"\\ue3e8\"\n    readonly property string mi_flip_to_back: \"\\ue882\"\n    readonly property string mi_flip_to_front: \"\\ue883\"\n    readonly property string mi_folder: \"\\ue2c7\"\n    readonly property string mi_folder_open: \"\\ue2c8\"\n    readonly property string mi_folder_shared: \"\\ue2c9\"\n    readonly property string mi_folder_special: \"\\ue617\"\n    readonly property string mi_font_download: \"\\ue167\"\n    readonly property string mi_format_align_center: \"\\ue234\"\n    readonly property string mi_format_align_justify: \"\\ue235\"\n    readonly property string mi_format_align_left: \"\\ue236\"\n    readonly property string mi_format_align_right: \"\\ue237\"\n    readonly property string mi_format_bold: \"\\ue238\"\n    readonly property string mi_format_clear: \"\\ue239\"\n    readonly property string mi_format_color_fill: \"\\ue23a\"\n    readonly property string mi_format_color_reset: \"\\ue23b\"\n    readonly property string mi_format_color_text: \"\\ue23c\"\n    readonly property string mi_format_indent_decrease: \"\\ue23d\"\n    readonly property string mi_format_indent_increase: \"\\ue23e\"\n    readonly property string mi_format_italic: \"\\ue23f\"\n    readonly property string mi_format_line_spacing: \"\\ue240\"\n    readonly property string mi_format_list_bulleted: \"\\ue241\"\n    readonly property string mi_format_list_numbered: \"\\ue242\"\n    readonly property string mi_format_paint: \"\\ue243\"\n    readonly property string mi_format_quote: \"\\ue244\"\n    readonly property string mi_format_shapes: \"\\ue25e\"\n    readonly property string mi_format_size: \"\\ue245\"\n    readonly property string mi_format_strikethrough: \"\\ue246\"\n    readonly property string mi_format_textdirection_l_to_r: \"\\ue247\"\n    readonly property string mi_format_textdirection_r_to_l: \"\\ue248\"\n    readonly property string mi_format_underlined: \"\\ue249\"\n    readonly property string mi_forum: \"\\ue0bf\"\n    readonly property string mi_forward: \"\\ue154\"\n    readonly property string mi_forward_10: \"\\ue056\"\n    readonly property string mi_forward_30: \"\\ue057\"\n    readonly property string mi_forward_5: \"\\ue058\"\n    readonly property string mi_free_breakfast: \"\\ueb44\"\n    readonly property string mi_fullscreen: \"\\ue5d0\"\n    readonly property string mi_fullscreen_exit: \"\\ue5d1\"\n    readonly property string mi_functions: \"\\ue24a\"\n    readonly property string mi_g_translate: \"\\ue927\"\n    readonly property string mi_gamepad: \"\\ue30f\"\n    readonly property string mi_games: \"\\ue021\"\n    readonly property string mi_gavel: \"\\ue90e\"\n    readonly property string mi_gesture: \"\\ue155\"\n    readonly property string mi_get_app: \"\\ue884\"\n    readonly property string mi_gif: \"\\ue908\"\n    readonly property string mi_golf_course: \"\\ueb45\"\n    readonly property string mi_gps_fixed: \"\\ue1b3\"\n    readonly property string mi_gps_not_fixed: \"\\ue1b4\"\n    readonly property string mi_gps_off: \"\\ue1b5\"\n    readonly property string mi_grade: \"\\ue885\"\n    readonly property string mi_gradient: \"\\ue3e9\"\n    readonly property string mi_grain: \"\\ue3ea\"\n    readonly property string mi_graphic_eq: \"\\ue1b8\"\n    readonly property string mi_grid_off: \"\\ue3eb\"\n    readonly property string mi_grid_on: \"\\ue3ec\"\n    readonly property string mi_group: \"\\ue7ef\"\n    readonly property string mi_group_add: \"\\ue7f0\"\n    readonly property string mi_group_work: \"\\ue886\"\n    readonly property string mi_hd: \"\\ue052\"\n    readonly property string mi_hdr_off: \"\\ue3ed\"\n    readonly property string mi_hdr_on: \"\\ue3ee\"\n    readonly property string mi_hdr_strong: \"\\ue3f1\"\n    readonly property string mi_hdr_weak: \"\\ue3f2\"\n    readonly property string mi_headset: \"\\ue310\"\n    readonly property string mi_headset_mic: \"\\ue311\"\n    readonly property string mi_healing: \"\\ue3f3\"\n    readonly property string mi_hearing: \"\\ue023\"\n    readonly property string mi_help: \"\\ue887\"\n    readonly property string mi_help_outline: \"\\ue8fd\"\n    readonly property string mi_high_quality: \"\\ue024\"\n    readonly property string mi_highlight: \"\\ue25f\"\n    readonly property string mi_highlight_off: \"\\ue888\"\n    readonly property string mi_history: \"\\ue889\"\n    readonly property string mi_home: \"\\ue88a\"\n    readonly property string mi_hot_tub: \"\\ueb46\"\n    readonly property string mi_hotel: \"\\ue53a\"\n    readonly property string mi_hourglass_empty: \"\\ue88b\"\n    readonly property string mi_hourglass_full: \"\\ue88c\"\n    readonly property string mi_http: \"\\ue902\"\n    readonly property string mi_https: \"\\ue88d\"\n    readonly property string mi_image: \"\\ue3f4\"\n    readonly property string mi_image_aspect_ratio: \"\\ue3f5\"\n    readonly property string mi_import_contacts: \"\\ue0e0\"\n    readonly property string mi_import_export: \"\\ue0c3\"\n    readonly property string mi_important_devices: \"\\ue912\"\n    readonly property string mi_inbox: \"\\ue156\"\n    readonly property string mi_indeterminate_check_box: \"\\ue909\"\n    readonly property string mi_info: \"\\ue88e\"\n    readonly property string mi_info_outline: \"\\ue88f\"\n    readonly property string mi_input: \"\\ue890\"\n    readonly property string mi_insert_chart: \"\\ue24b\"\n    readonly property string mi_insert_comment: \"\\ue24c\"\n    readonly property string mi_insert_drive_file: \"\\ue24d\"\n    readonly property string mi_insert_emoticon: \"\\ue24e\"\n    readonly property string mi_insert_invitation: \"\\ue24f\"\n    readonly property string mi_insert_link: \"\\ue250\"\n    readonly property string mi_insert_photo: \"\\ue251\"\n    readonly property string mi_invert_colors: \"\\ue891\"\n    readonly property string mi_invert_colors_off: \"\\ue0c4\"\n    readonly property string mi_iso: \"\\ue3f6\"\n    readonly property string mi_keyboard: \"\\ue312\"\n    readonly property string mi_keyboard_arrow_down: \"\\ue313\"\n    readonly property string mi_keyboard_arrow_left: \"\\ue314\"\n    readonly property string mi_keyboard_arrow_right: \"\\ue315\"\n    readonly property string mi_keyboard_arrow_up: \"\\ue316\"\n    readonly property string mi_keyboard_backspace: \"\\ue317\"\n    readonly property string mi_keyboard_capslock: \"\\ue318\"\n    readonly property string mi_keyboard_hide: \"\\ue31a\"\n    readonly property string mi_keyboard_return: \"\\ue31b\"\n    readonly property string mi_keyboard_tab: \"\\ue31c\"\n    readonly property string mi_keyboard_voice: \"\\ue31d\"\n    readonly property string mi_kitchen: \"\\ueb47\"\n    readonly property string mi_label: \"\\ue892\"\n    readonly property string mi_label_outline: \"\\ue893\"\n    readonly property string mi_landscape: \"\\ue3f7\"\n    readonly property string mi_language: \"\\ue894\"\n    readonly property string mi_laptop: \"\\ue31e\"\n    readonly property string mi_laptop_chromebook: \"\\ue31f\"\n    readonly property string mi_laptop_mac: \"\\ue320\"\n    readonly property string mi_laptop_windows: \"\\ue321\"\n    readonly property string mi_last_page: \"\\ue5dd\"\n    readonly property string mi_launch: \"\\ue895\"\n    readonly property string mi_layers: \"\\ue53b\"\n    readonly property string mi_layers_clear: \"\\ue53c\"\n    readonly property string mi_leak_add: \"\\ue3f8\"\n    readonly property string mi_leak_remove: \"\\ue3f9\"\n    readonly property string mi_lens: \"\\ue3fa\"\n    readonly property string mi_library_add: \"\\ue02e\"\n    readonly property string mi_library_books: \"\\ue02f\"\n    readonly property string mi_library_music: \"\\ue030\"\n    readonly property string mi_lightbulb_outline: \"\\ue90f\"\n    readonly property string mi_line_style: \"\\ue919\"\n    readonly property string mi_line_weight: \"\\ue91a\"\n    readonly property string mi_linear_scale: \"\\ue260\"\n    readonly property string mi_link: \"\\ue157\"\n    readonly property string mi_linked_camera: \"\\ue438\"\n    readonly property string mi_list: \"\\ue896\"\n    readonly property string mi_live_help: \"\\ue0c6\"\n    readonly property string mi_live_tv: \"\\ue639\"\n    readonly property string mi_local_activity: \"\\ue53f\"\n    readonly property string mi_local_airport: \"\\ue53d\"\n    readonly property string mi_local_atm: \"\\ue53e\"\n    readonly property string mi_local_bar: \"\\ue540\"\n    readonly property string mi_local_cafe: \"\\ue541\"\n    readonly property string mi_local_car_wash: \"\\ue542\"\n    readonly property string mi_local_convenience_store: \"\\ue543\"\n    readonly property string mi_local_dining: \"\\ue556\"\n    readonly property string mi_local_drink: \"\\ue544\"\n    readonly property string mi_local_florist: \"\\ue545\"\n    readonly property string mi_local_gas_station: \"\\ue546\"\n    readonly property string mi_local_grocery_store: \"\\ue547\"\n    readonly property string mi_local_hospital: \"\\ue548\"\n    readonly property string mi_local_hotel: \"\\ue549\"\n    readonly property string mi_local_laundry_service: \"\\ue54a\"\n    readonly property string mi_local_library: \"\\ue54b\"\n    readonly property string mi_local_mall: \"\\ue54c\"\n    readonly property string mi_local_movies: \"\\ue54d\"\n    readonly property string mi_local_offer: \"\\ue54e\"\n    readonly property string mi_local_parking: \"\\ue54f\"\n    readonly property string mi_local_pharmacy: \"\\ue550\"\n    readonly property string mi_local_phone: \"\\ue551\"\n    readonly property string mi_local_pizza: \"\\ue552\"\n    readonly property string mi_local_play: \"\\ue553\"\n    readonly property string mi_local_post_office: \"\\ue554\"\n    readonly property string mi_local_printshop: \"\\ue555\"\n    readonly property string mi_local_see: \"\\ue557\"\n    readonly property string mi_local_shipping: \"\\ue558\"\n    readonly property string mi_local_taxi: \"\\ue559\"\n    readonly property string mi_location_city: \"\\ue7f1\"\n    readonly property string mi_location_disabled: \"\\ue1b6\"\n    readonly property string mi_location_off: \"\\ue0c7\"\n    readonly property string mi_location_on: \"\\ue0c8\"\n    readonly property string mi_location_searching: \"\\ue1b7\"\n    readonly property string mi_lock: \"\\ue897\"\n    readonly property string mi_lock_open: \"\\ue898\"\n    readonly property string mi_lock_outline: \"\\ue899\"\n    readonly property string mi_looks: \"\\ue3fc\"\n    readonly property string mi_looks_3: \"\\ue3fb\"\n    readonly property string mi_looks_4: \"\\ue3fd\"\n    readonly property string mi_looks_5: \"\\ue3fe\"\n    readonly property string mi_looks_6: \"\\ue3ff\"\n    readonly property string mi_looks_one: \"\\ue400\"\n    readonly property string mi_looks_two: \"\\ue401\"\n    readonly property string mi_loop: \"\\ue028\"\n    readonly property string mi_loupe: \"\\ue402\"\n    readonly property string mi_low_priority: \"\\ue16d\"\n    readonly property string mi_loyalty: \"\\ue89a\"\n    readonly property string mi_mail: \"\\ue158\"\n    readonly property string mi_mail_outline: \"\\ue0e1\"\n    readonly property string mi_map: \"\\ue55b\"\n    readonly property string mi_markunread: \"\\ue159\"\n    readonly property string mi_markunread_mailbox: \"\\ue89b\"\n    readonly property string mi_memory: \"\\ue322\"\n    readonly property string mi_menu: \"\\ue5d2\"\n    readonly property string mi_merge_type: \"\\ue252\"\n    readonly property string mi_message: \"\\ue0c9\"\n    readonly property string mi_mic: \"\\ue029\"\n    readonly property string mi_mic_none: \"\\ue02a\"\n    readonly property string mi_mic_off: \"\\ue02b\"\n    readonly property string mi_mms: \"\\ue618\"\n    readonly property string mi_mode_comment: \"\\ue253\"\n    readonly property string mi_mode_edit: \"\\ue254\"\n    readonly property string mi_monetization_on: \"\\ue263\"\n    readonly property string mi_money_off: \"\\ue25c\"\n    readonly property string mi_monochrome_photos: \"\\ue403\"\n    readonly property string mi_mood: \"\\ue7f2\"\n    readonly property string mi_mood_bad: \"\\ue7f3\"\n    readonly property string mi_more: \"\\ue619\"\n    readonly property string mi_more_horiz: \"\\ue5d3\"\n    readonly property string mi_more_vert: \"\\ue5d4\"\n    readonly property string mi_motorcycle: \"\\ue91b\"\n    readonly property string mi_mouse: \"\\ue323\"\n    readonly property string mi_move_to_inbox: \"\\ue168\"\n    readonly property string mi_movie: \"\\ue02c\"\n    readonly property string mi_movie_creation: \"\\ue404\"\n    readonly property string mi_movie_filter: \"\\ue43a\"\n    readonly property string mi_multiline_chart: \"\\ue6df\"\n    readonly property string mi_music_note: \"\\ue405\"\n    readonly property string mi_music_video: \"\\ue063\"\n    readonly property string mi_my_location: \"\\ue55c\"\n    readonly property string mi_nature: \"\\ue406\"\n    readonly property string mi_nature_people: \"\\ue407\"\n    readonly property string mi_navigate_before: \"\\ue408\"\n    readonly property string mi_navigate_next: \"\\ue409\"\n    readonly property string mi_navigation: \"\\ue55d\"\n    readonly property string mi_near_me: \"\\ue569\"\n    readonly property string mi_network_cell: \"\\ue1b9\"\n    readonly property string mi_network_check: \"\\ue640\"\n    readonly property string mi_network_locked: \"\\ue61a\"\n    readonly property string mi_network_wifi: \"\\ue1ba\"\n    readonly property string mi_new_releases: \"\\ue031\"\n    readonly property string mi_next_week: \"\\ue16a\"\n    readonly property string mi_nfc: \"\\ue1bb\"\n    readonly property string mi_no_encryption: \"\\ue641\"\n    readonly property string mi_no_sim: \"\\ue0cc\"\n    readonly property string mi_not_interested: \"\\ue033\"\n    readonly property string mi_note: \"\\ue06f\"\n    readonly property string mi_note_add: \"\\ue89c\"\n    readonly property string mi_notifications: \"\\ue7f4\"\n    readonly property string mi_notifications_active: \"\\ue7f7\"\n    readonly property string mi_notifications_none: \"\\ue7f5\"\n    readonly property string mi_notifications_off: \"\\ue7f6\"\n    readonly property string mi_notifications_paused: \"\\ue7f8\"\n    readonly property string mi_offline_pin: \"\\ue90a\"\n    readonly property string mi_ondemand_video: \"\\ue63a\"\n    readonly property string mi_opacity: \"\\ue91c\"\n    readonly property string mi_open_in_browser: \"\\ue89d\"\n    readonly property string mi_open_in_new: \"\\ue89e\"\n    readonly property string mi_open_with: \"\\ue89f\"\n    readonly property string mi_pages: \"\\ue7f9\"\n    readonly property string mi_pageview: \"\\ue8a0\"\n    readonly property string mi_palette: \"\\ue40a\"\n    readonly property string mi_pan_tool: \"\\ue925\"\n    readonly property string mi_panorama: \"\\ue40b\"\n    readonly property string mi_panorama_fish_eye: \"\\ue40c\"\n    readonly property string mi_panorama_horizontal: \"\\ue40d\"\n    readonly property string mi_panorama_vertical: \"\\ue40e\"\n    readonly property string mi_panorama_wide_angle: \"\\ue40f\"\n    readonly property string mi_party_mode: \"\\ue7fa\"\n    readonly property string mi_pause: \"\\ue034\"\n    readonly property string mi_pause_circle_filled: \"\\ue035\"\n    readonly property string mi_pause_circle_outline: \"\\ue036\"\n    readonly property string mi_payment: \"\\ue8a1\"\n    readonly property string mi_people: \"\\ue7fb\"\n    readonly property string mi_people_outline: \"\\ue7fc\"\n    readonly property string mi_perm_camera_mic: \"\\ue8a2\"\n    readonly property string mi_perm_contact_calendar: \"\\ue8a3\"\n    readonly property string mi_perm_data_setting: \"\\ue8a4\"\n    readonly property string mi_perm_device_information: \"\\ue8a5\"\n    readonly property string mi_perm_identity: \"\\ue8a6\"\n    readonly property string mi_perm_media: \"\\ue8a7\"\n    readonly property string mi_perm_phone_msg: \"\\ue8a8\"\n    readonly property string mi_perm_scan_wifi: \"\\ue8a9\"\n    readonly property string mi_person: \"\\ue7fd\"\n    readonly property string mi_person_add: \"\\ue7fe\"\n    readonly property string mi_person_outline: \"\\ue7ff\"\n    readonly property string mi_person_pin: \"\\ue55a\"\n    readonly property string mi_person_pin_circle: \"\\ue56a\"\n    readonly property string mi_personal_video: \"\\ue63b\"\n    readonly property string mi_pets: \"\\ue91d\"\n    readonly property string mi_phone: \"\\ue0cd\"\n    readonly property string mi_phone_android: \"\\ue324\"\n    readonly property string mi_phone_bluetooth_speaker: \"\\ue61b\"\n    readonly property string mi_phone_forwarded: \"\\ue61c\"\n    readonly property string mi_phone_in_talk: \"\\ue61d\"\n    readonly property string mi_phone_iphone: \"\\ue325\"\n    readonly property string mi_phone_locked: \"\\ue61e\"\n    readonly property string mi_phone_missed: \"\\ue61f\"\n    readonly property string mi_phone_paused: \"\\ue620\"\n    readonly property string mi_phonelink: \"\\ue326\"\n    readonly property string mi_phonelink_erase: \"\\ue0db\"\n    readonly property string mi_phonelink_lock: \"\\ue0dc\"\n    readonly property string mi_phonelink_off: \"\\ue327\"\n    readonly property string mi_phonelink_ring: \"\\ue0dd\"\n    readonly property string mi_phonelink_setup: \"\\ue0de\"\n    readonly property string mi_photo: \"\\ue410\"\n    readonly property string mi_photo_album: \"\\ue411\"\n    readonly property string mi_photo_camera: \"\\ue412\"\n    readonly property string mi_photo_filter: \"\\ue43b\"\n    readonly property string mi_photo_library: \"\\ue413\"\n    readonly property string mi_photo_size_select_actual: \"\\ue432\"\n    readonly property string mi_photo_size_select_large: \"\\ue433\"\n    readonly property string mi_photo_size_select_small: \"\\ue434\"\n    readonly property string mi_picture_as_pdf: \"\\ue415\"\n    readonly property string mi_picture_in_picture: \"\\ue8aa\"\n    readonly property string mi_picture_in_picture_alt: \"\\ue911\"\n    readonly property string mi_pie_chart: \"\\ue6c4\"\n    readonly property string mi_pie_chart_outlined: \"\\ue6c5\"\n    readonly property string mi_pin_drop: \"\\ue55e\"\n    readonly property string mi_place: \"\\ue55f\"\n    readonly property string mi_play_arrow: \"\\ue037\"\n    readonly property string mi_play_circle_filled: \"\\ue038\"\n    readonly property string mi_play_circle_outline: \"\\ue039\"\n    readonly property string mi_play_for_work: \"\\ue906\"\n    readonly property string mi_playlist_add: \"\\ue03b\"\n    readonly property string mi_playlist_add_check: \"\\ue065\"\n    readonly property string mi_playlist_play: \"\\ue05f\"\n    readonly property string mi_plus_one: \"\\ue800\"\n    readonly property string mi_poll: \"\\ue801\"\n    readonly property string mi_polymer: \"\\ue8ab\"\n    readonly property string mi_pool: \"\\ueb48\"\n    readonly property string mi_portable_wifi_off: \"\\ue0ce\"\n    readonly property string mi_portrait: \"\\ue416\"\n    readonly property string mi_power: \"\\ue63c\"\n    readonly property string mi_power_input: \"\\ue336\"\n    readonly property string mi_power_settings_new: \"\\ue8ac\"\n    readonly property string mi_pregnant_woman: \"\\ue91e\"\n    readonly property string mi_present_to_all: \"\\ue0df\"\n    readonly property string mi_print: \"\\ue8ad\"\n    readonly property string mi_priority_high: \"\\ue645\"\n    readonly property string mi_public: \"\\ue80b\"\n    readonly property string mi_publish: \"\\ue255\"\n    readonly property string mi_query_builder: \"\\ue8ae\"\n    readonly property string mi_question_answer: \"\\ue8af\"\n    readonly property string mi_queue: \"\\ue03c\"\n    readonly property string mi_queue_music: \"\\ue03d\"\n    readonly property string mi_queue_play_next: \"\\ue066\"\n    readonly property string mi_radio: \"\\ue03e\"\n    readonly property string mi_radio_button_checked: \"\\ue837\"\n    readonly property string mi_radio_button_unchecked: \"\\ue836\"\n    readonly property string mi_rate_review: \"\\ue560\"\n    readonly property string mi_receipt: \"\\ue8b0\"\n    readonly property string mi_recent_actors: \"\\ue03f\"\n    readonly property string mi_record_voice_over: \"\\ue91f\"\n    readonly property string mi_redeem: \"\\ue8b1\"\n    readonly property string mi_redo: \"\\ue15a\"\n    readonly property string mi_refresh: \"\\ue5d5\"\n    readonly property string mi_remove: \"\\ue15b\"\n    readonly property string mi_remove_circle: \"\\ue15c\"\n    readonly property string mi_remove_circle_outline: \"\\ue15d\"\n    readonly property string mi_remove_from_queue: \"\\ue067\"\n    readonly property string mi_remove_red_eye: \"\\ue417\"\n    readonly property string mi_remove_shopping_cart: \"\\ue928\"\n    readonly property string mi_reorder: \"\\ue8fe\"\n    readonly property string mi_repeat: \"\\ue040\"\n    readonly property string mi_repeat_one: \"\\ue041\"\n    readonly property string mi_replay: \"\\ue042\"\n    readonly property string mi_replay_10: \"\\ue059\"\n    readonly property string mi_replay_30: \"\\ue05a\"\n    readonly property string mi_replay_5: \"\\ue05b\"\n    readonly property string mi_reply: \"\\ue15e\"\n    readonly property string mi_reply_all: \"\\ue15f\"\n    readonly property string mi_report: \"\\ue160\"\n    readonly property string mi_report_problem: \"\\ue8b2\"\n    readonly property string mi_restaurant: \"\\ue56c\"\n    readonly property string mi_restaurant_menu: \"\\ue561\"\n    readonly property string mi_restore: \"\\ue8b3\"\n    readonly property string mi_restore_page: \"\\ue929\"\n    readonly property string mi_ring_volume: \"\\ue0d1\"\n    readonly property string mi_room: \"\\ue8b4\"\n    readonly property string mi_room_service: \"\\ueb49\"\n    readonly property string mi_rotate_90_degrees_ccw: \"\\ue418\"\n    readonly property string mi_rotate_left: \"\\ue419\"\n    readonly property string mi_rotate_right: \"\\ue41a\"\n    readonly property string mi_rounded_corner: \"\\ue920\"\n    readonly property string mi_router: \"\\ue328\"\n    readonly property string mi_rowing: \"\\ue921\"\n    readonly property string mi_rss_feed: \"\\ue0e5\"\n    readonly property string mi_rv_hookup: \"\\ue642\"\n    readonly property string mi_satellite: \"\\ue562\"\n    readonly property string mi_save: \"\\ue161\"\n    readonly property string mi_scanner: \"\\ue329\"\n    readonly property string mi_schedule: \"\\ue8b5\"\n    readonly property string mi_school: \"\\ue80c\"\n    readonly property string mi_screen_lock_landscape: \"\\ue1be\"\n    readonly property string mi_screen_lock_portrait: \"\\ue1bf\"\n    readonly property string mi_screen_lock_rotation: \"\\ue1c0\"\n    readonly property string mi_screen_rotation: \"\\ue1c1\"\n    readonly property string mi_screen_share: \"\\ue0e2\"\n    readonly property string mi_sd_card: \"\\ue623\"\n    readonly property string mi_sd_storage: \"\\ue1c2\"\n    readonly property string mi_search: \"\\ue8b6\"\n    readonly property string mi_security: \"\\ue32a\"\n    readonly property string mi_select_all: \"\\ue162\"\n    readonly property string mi_send: \"\\ue163\"\n    readonly property string mi_sentiment_dissatisfied: \"\\ue811\"\n    readonly property string mi_sentiment_neutral: \"\\ue812\"\n    readonly property string mi_sentiment_satisfied: \"\\ue813\"\n    readonly property string mi_sentiment_very_dissatisfied: \"\\ue814\"\n    readonly property string mi_sentiment_very_satisfied: \"\\ue815\"\n    readonly property string mi_settings: \"\\ue8b8\"\n    readonly property string mi_settings_applications: \"\\ue8b9\"\n    readonly property string mi_settings_backup_restore: \"\\ue8ba\"\n    readonly property string mi_settings_bluetooth: \"\\ue8bb\"\n    readonly property string mi_settings_brightness: \"\\ue8bd\"\n    readonly property string mi_settings_cell: \"\\ue8bc\"\n    readonly property string mi_settings_ethernet: \"\\ue8be\"\n    readonly property string mi_settings_input_antenna: \"\\ue8bf\"\n    readonly property string mi_settings_input_component: \"\\ue8c0\"\n    readonly property string mi_settings_input_composite: \"\\ue8c1\"\n    readonly property string mi_settings_input_hdmi: \"\\ue8c2\"\n    readonly property string mi_settings_input_svideo: \"\\ue8c3\"\n    readonly property string mi_settings_overscan: \"\\ue8c4\"\n    readonly property string mi_settings_phone: \"\\ue8c5\"\n    readonly property string mi_settings_power: \"\\ue8c6\"\n    readonly property string mi_settings_remote: \"\\ue8c7\"\n    readonly property string mi_settings_system_daydream: \"\\ue1c3\"\n    readonly property string mi_settings_voice: \"\\ue8c8\"\n    readonly property string mi_share: \"\\ue80d\"\n    readonly property string mi_shop: \"\\ue8c9\"\n    readonly property string mi_shop_two: \"\\ue8ca\"\n    readonly property string mi_shopping_basket: \"\\ue8cb\"\n    readonly property string mi_shopping_cart: \"\\ue8cc\"\n    readonly property string mi_short_text: \"\\ue261\"\n    readonly property string mi_show_chart: \"\\ue6e1\"\n    readonly property string mi_shuffle: \"\\ue043\"\n    readonly property string mi_signal_cellular_4_bar: \"\\ue1c8\"\n    readonly property string mi_signal_cellular_connected_no_internet_4_bar: \"\\ue1cd\"\n    readonly property string mi_signal_cellular_no_sim: \"\\ue1ce\"\n    readonly property string mi_signal_cellular_null: \"\\ue1cf\"\n    readonly property string mi_signal_cellular_off: \"\\ue1d0\"\n    readonly property string mi_signal_wifi_4_bar: \"\\ue1d8\"\n    readonly property string mi_signal_wifi_4_bar_lock: \"\\ue1d9\"\n    readonly property string mi_signal_wifi_off: \"\\ue1da\"\n    readonly property string mi_sim_card: \"\\ue32b\"\n    readonly property string mi_sim_card_alert: \"\\ue624\"\n    readonly property string mi_skip_next: \"\\ue044\"\n    readonly property string mi_skip_previous: \"\\ue045\"\n    readonly property string mi_slideshow: \"\\ue41b\"\n    readonly property string mi_slow_motion_video: \"\\ue068\"\n    readonly property string mi_smartphone: \"\\ue32c\"\n    readonly property string mi_smoke_free: \"\\ueb4a\"\n    readonly property string mi_smoking_rooms: \"\\ueb4b\"\n    readonly property string mi_sms: \"\\ue625\"\n    readonly property string mi_sms_failed: \"\\ue626\"\n    readonly property string mi_snooze: \"\\ue046\"\n    readonly property string mi_sort: \"\\ue164\"\n    readonly property string mi_sort_by_alpha: \"\\ue053\"\n    readonly property string mi_spa: \"\\ueb4c\"\n    readonly property string mi_space_bar: \"\\ue256\"\n    readonly property string mi_speaker: \"\\ue32d\"\n    readonly property string mi_speaker_group: \"\\ue32e\"\n    readonly property string mi_speaker_notes: \"\\ue8cd\"\n    readonly property string mi_speaker_notes_off: \"\\ue92a\"\n    readonly property string mi_speaker_phone: \"\\ue0d2\"\n    readonly property string mi_spellcheck: \"\\ue8ce\"\n    readonly property string mi_star: \"\\ue838\"\n    readonly property string mi_star_border: \"\\ue83a\"\n    readonly property string mi_star_half: \"\\ue839\"\n    readonly property string mi_stars: \"\\ue8d0\"\n    readonly property string mi_stay_current_landscape: \"\\ue0d3\"\n    readonly property string mi_stay_current_portrait: \"\\ue0d4\"\n    readonly property string mi_stay_primary_landscape: \"\\ue0d5\"\n    readonly property string mi_stay_primary_portrait: \"\\ue0d6\"\n    readonly property string mi_stop: \"\\ue047\"\n    readonly property string mi_stop_screen_share: \"\\ue0e3\"\n    readonly property string mi_storage: \"\\ue1db\"\n    readonly property string mi_store: \"\\ue8d1\"\n    readonly property string mi_store_mall_directory: \"\\ue563\"\n    readonly property string mi_straighten: \"\\ue41c\"\n    readonly property string mi_streetview: \"\\ue56e\"\n    readonly property string mi_strikethrough_s: \"\\ue257\"\n    readonly property string mi_style: \"\\ue41d\"\n    readonly property string mi_subdirectory_arrow_left: \"\\ue5d9\"\n    readonly property string mi_subdirectory_arrow_right: \"\\ue5da\"\n    readonly property string mi_subject: \"\\ue8d2\"\n    readonly property string mi_subscriptions: \"\\ue064\"\n    readonly property string mi_subtitles: \"\\ue048\"\n    readonly property string mi_subway: \"\\ue56f\"\n    readonly property string mi_supervisor_account: \"\\ue8d3\"\n    readonly property string mi_surround_sound: \"\\ue049\"\n    readonly property string mi_swap_calls: \"\\ue0d7\"\n    readonly property string mi_swap_horiz: \"\\ue8d4\"\n    readonly property string mi_swap_vert: \"\\ue8d5\"\n    readonly property string mi_swap_vertical_circle: \"\\ue8d6\"\n    readonly property string mi_switch_camera: \"\\ue41e\"\n    readonly property string mi_switch_video: \"\\ue41f\"\n    readonly property string mi_sync: \"\\ue627\"\n    readonly property string mi_sync_disabled: \"\\ue628\"\n    readonly property string mi_sync_problem: \"\\ue629\"\n    readonly property string mi_system_update: \"\\ue62a\"\n    readonly property string mi_system_update_alt: \"\\ue8d7\"\n    readonly property string mi_tab: \"\\ue8d8\"\n    readonly property string mi_tab_unselected: \"\\ue8d9\"\n    readonly property string mi_tablet: \"\\ue32f\"\n    readonly property string mi_tablet_android: \"\\ue330\"\n    readonly property string mi_tablet_mac: \"\\ue331\"\n    readonly property string mi_tag_faces: \"\\ue420\"\n    readonly property string mi_tap_and_play: \"\\ue62b\"\n    readonly property string mi_terrain: \"\\ue564\"\n    readonly property string mi_text_fields: \"\\ue262\"\n    readonly property string mi_text_format: \"\\ue165\"\n    readonly property string mi_textsms: \"\\ue0d8\"\n    readonly property string mi_texture: \"\\ue421\"\n    readonly property string mi_theaters: \"\\ue8da\"\n    readonly property string mi_thumb_down: \"\\ue8db\"\n    readonly property string mi_thumb_up: \"\\ue8dc\"\n    readonly property string mi_thumbs_up_down: \"\\ue8dd\"\n    readonly property string mi_time_to_leave: \"\\ue62c\"\n    readonly property string mi_timelapse: \"\\ue422\"\n    readonly property string mi_timeline: \"\\ue922\"\n    readonly property string mi_timer: \"\\ue425\"\n    readonly property string mi_timer_10: \"\\ue423\"\n    readonly property string mi_timer_3: \"\\ue424\"\n    readonly property string mi_timer_off: \"\\ue426\"\n    readonly property string mi_title: \"\\ue264\"\n    readonly property string mi_toc: \"\\ue8de\"\n    readonly property string mi_today: \"\\ue8df\"\n    readonly property string mi_toll: \"\\ue8e0\"\n    readonly property string mi_tonality: \"\\ue427\"\n    readonly property string mi_touch_app: \"\\ue913\"\n    readonly property string mi_toys: \"\\ue332\"\n    readonly property string mi_track_changes: \"\\ue8e1\"\n    readonly property string mi_traffic: \"\\ue565\"\n    readonly property string mi_train: \"\\ue570\"\n    readonly property string mi_tram: \"\\ue571\"\n    readonly property string mi_transfer_within_a_station: \"\\ue572\"\n    readonly property string mi_transform: \"\\ue428\"\n    readonly property string mi_translate: \"\\ue8e2\"\n    readonly property string mi_trending_down: \"\\ue8e3\"\n    readonly property string mi_trending_flat: \"\\ue8e4\"\n    readonly property string mi_trending_up: \"\\ue8e5\"\n    readonly property string mi_tune: \"\\ue429\"\n    readonly property string mi_turned_in: \"\\ue8e6\"\n    readonly property string mi_turned_in_not: \"\\ue8e7\"\n    readonly property string mi_tv: \"\\ue333\"\n    readonly property string mi_unarchive: \"\\ue169\"\n    readonly property string mi_undo: \"\\ue166\"\n    readonly property string mi_unfold_less: \"\\ue5d6\"\n    readonly property string mi_unfold_more: \"\\ue5d7\"\n    readonly property string mi_update: \"\\ue923\"\n    readonly property string mi_usb: \"\\ue1e0\"\n    readonly property string mi_verified_user: \"\\ue8e8\"\n    readonly property string mi_vertical_align_bottom: \"\\ue258\"\n    readonly property string mi_vertical_align_center: \"\\ue259\"\n    readonly property string mi_vertical_align_top: \"\\ue25a\"\n    readonly property string mi_vibration: \"\\ue62d\"\n    readonly property string mi_video_call: \"\\ue070\"\n    readonly property string mi_video_label: \"\\ue071\"\n    readonly property string mi_video_library: \"\\ue04a\"\n    readonly property string mi_videocam: \"\\ue04b\"\n    readonly property string mi_videocam_off: \"\\ue04c\"\n    readonly property string mi_videogame_asset: \"\\ue338\"\n    readonly property string mi_view_agenda: \"\\ue8e9\"\n    readonly property string mi_view_array: \"\\ue8ea\"\n    readonly property string mi_view_carousel: \"\\ue8eb\"\n    readonly property string mi_view_column: \"\\ue8ec\"\n    readonly property string mi_view_comfy: \"\\ue42a\"\n    readonly property string mi_view_compact: \"\\ue42b\"\n    readonly property string mi_view_day: \"\\ue8ed\"\n    readonly property string mi_view_headline: \"\\ue8ee\"\n    readonly property string mi_view_list: \"\\ue8ef\"\n    readonly property string mi_view_module: \"\\ue8f0\"\n    readonly property string mi_view_quilt: \"\\ue8f1\"\n    readonly property string mi_view_stream: \"\\ue8f2\"\n    readonly property string mi_view_week: \"\\ue8f3\"\n    readonly property string mi_vignette: \"\\ue435\"\n    readonly property string mi_visibility: \"\\ue8f4\"\n    readonly property string mi_visibility_off: \"\\ue8f5\"\n    readonly property string mi_voice_chat: \"\\ue62e\"\n    readonly property string mi_voicemail: \"\\ue0d9\"\n    readonly property string mi_volume_down: \"\\ue04d\"\n    readonly property string mi_volume_mute: \"\\ue04e\"\n    readonly property string mi_volume_off: \"\\ue04f\"\n    readonly property string mi_volume_up: \"\\ue050\"\n    readonly property string mi_vpn_key: \"\\ue0da\"\n    readonly property string mi_vpn_lock: \"\\ue62f\"\n    readonly property string mi_wallpaper: \"\\ue1bc\"\n    readonly property string mi_warning: \"\\ue002\"\n    readonly property string mi_watch: \"\\ue334\"\n    readonly property string mi_watch_later: \"\\ue924\"\n    readonly property string mi_wb_auto: \"\\ue42c\"\n    readonly property string mi_wb_cloudy: \"\\ue42d\"\n    readonly property string mi_wb_incandescent: \"\\ue42e\"\n    readonly property string mi_wb_iridescent: \"\\ue436\"\n    readonly property string mi_wb_sunny: \"\\ue430\"\n    readonly property string mi_wc: \"\\ue63d\"\n    readonly property string mi_web: \"\\ue051\"\n    readonly property string mi_web_asset: \"\\ue069\"\n    readonly property string mi_weekend: \"\\ue16b\"\n    readonly property string mi_whatshot: \"\\ue80e\"\n    readonly property string mi_widgets: \"\\ue1bd\"\n    readonly property string mi_wifi: \"\\ue63e\"\n    readonly property string mi_wifi_lock: \"\\ue1e1\"\n    readonly property string mi_wifi_tethering: \"\\ue1e2\"\n    readonly property string mi_work: \"\\ue8f9\"\n    readonly property string mi_wrap_text: \"\\ue25b\"\n    readonly property string mi_youtube_searched_for: \"\\ue8fa\"\n    readonly property string mi_zoom_in: \"\\ue8ff\"\n    readonly property string mi_zoom_out: \"\\ue900\"\n    readonly property string mi_zoom_out_map: \"\\ue56b\"\n\t\n\treadonly property string mdi_access_point: \"\\uF002\"\n    readonly property string mdi_access_point_network: \"\\uF003\"\n    readonly property string mdi_access_point_network_off: \"\\uFBBD\"\n    readonly property string mdi_account: \"\\uF004\"\n    readonly property string mdi_account_alert: \"\\uF005\"\n    readonly property string mdi_account_alert_outline: \"\\uFB2C\"\n    readonly property string mdi_account_arrow_left: \"\\uFB2D\"\n    readonly property string mdi_account_arrow_left_outline: \"\\uFB2E\"\n    readonly property string mdi_account_arrow_right: \"\\uFB2F\"\n    readonly property string mdi_account_arrow_right_outline: \"\\uFB30\"\n    readonly property string mdi_account_badge: \"\\uFD83\"\n    readonly property string mdi_account_badge_alert: \"\\uFD84\"\n    readonly property string mdi_account_badge_alert_outline: \"\\uFD85\"\n    readonly property string mdi_account_badge_outline: \"\\uFD86\"\n    readonly property string mdi_account_box: \"\\uF006\"\n    readonly property string mdi_account_box_multiple: \"\\uF933\"\n    readonly property string mdi_account_box_outline: \"\\uF007\"\n    readonly property string mdi_account_card_details: \"\\uF5D2\"\n    readonly property string mdi_account_card_details_outline: \"\\uFD87\"\n    readonly property string mdi_account_check: \"\\uF008\"\n    readonly property string mdi_account_check_outline: \"\\uFBBE\"\n    readonly property string mdi_account_child: \"\\uFA88\"\n    readonly property string mdi_account_child_circle: \"\\uFA89\"\n    readonly property string mdi_account_circle: \"\\uF009\"\n    readonly property string mdi_account_circle_outline: \"\\uFB31\"\n    readonly property string mdi_account_clock: \"\\uFB32\"\n    readonly property string mdi_account_clock_outline: \"\\uFB33\"\n    readonly property string mdi_account_convert: \"\\uF00A\"\n    readonly property string mdi_account_details: \"\\uF631\"\n    readonly property string mdi_account_edit: \"\\uF6BB\"\n    readonly property string mdi_account_group: \"\\uF848\"\n    readonly property string mdi_account_group_outline: \"\\uFB34\"\n    readonly property string mdi_account_heart: \"\\uF898\"\n    readonly property string mdi_account_heart_outline: \"\\uFBBF\"\n    readonly property string mdi_account_key: \"\\uF00B\"\n    readonly property string mdi_account_key_outline: \"\\uFBC0\"\n    readonly property string mdi_account_minus: \"\\uF00D\"\n    readonly property string mdi_account_minus_outline: \"\\uFAEB\"\n    readonly property string mdi_account_multiple: \"\\uF00E\"\n    readonly property string mdi_account_multiple_check: \"\\uF8C4\"\n    readonly property string mdi_account_multiple_minus: \"\\uF5D3\"\n    readonly property string mdi_account_multiple_minus_outline: \"\\uFBC1\"\n    readonly property string mdi_account_multiple_outline: \"\\uF00F\"\n    readonly property string mdi_account_multiple_plus: \"\\uF010\"\n    readonly property string mdi_account_multiple_plus_outline: \"\\uF7FF\"\n    readonly property string mdi_account_network: \"\\uF011\"\n    readonly property string mdi_account_network_outline: \"\\uFBC2\"\n    readonly property string mdi_account_off: \"\\uF012\"\n    readonly property string mdi_account_off_outline: \"\\uFBC3\"\n    readonly property string mdi_account_outline: \"\\uF013\"\n    readonly property string mdi_account_plus: \"\\uF014\"\n    readonly property string mdi_account_plus_outline: \"\\uF800\"\n    readonly property string mdi_account_question: \"\\uFB35\"\n    readonly property string mdi_account_question_outline: \"\\uFB36\"\n    readonly property string mdi_account_remove: \"\\uF015\"\n    readonly property string mdi_account_remove_outline: \"\\uFAEC\"\n    readonly property string mdi_account_search: \"\\uF016\"\n    readonly property string mdi_account_search_outline: \"\\uF934\"\n    readonly property string mdi_account_settings: \"\\uF630\"\n    readonly property string mdi_account_star: \"\\uF017\"\n    readonly property string mdi_account_star_outline: \"\\uFBC4\"\n    readonly property string mdi_account_supervisor: \"\\uFA8A\"\n    readonly property string mdi_account_supervisor_circle: \"\\uFA8B\"\n    readonly property string mdi_account_switch: \"\\uF019\"\n    readonly property string mdi_account_tie: \"\\uFCBF\"\n    readonly property string mdi_accusoft: \"\\uF849\"\n    readonly property string mdi_adchoices: \"\\uFD1E\"\n    readonly property string mdi_adjust: \"\\uF01A\"\n    readonly property string mdi_adobe: \"\\uF935\"\n    readonly property string mdi_air_conditioner: \"\\uF01B\"\n    readonly property string mdi_air_filter: \"\\uFD1F\"\n    readonly property string mdi_air_horn: \"\\uFD88\"\n    readonly property string mdi_air_purifier: \"\\uFD20\"\n    readonly property string mdi_airbag: \"\\uFBC5\"\n    readonly property string mdi_airballoon: \"\\uF01C\"\n    readonly property string mdi_airplane: \"\\uF01D\"\n    readonly property string mdi_airplane_landing: \"\\uF5D4\"\n    readonly property string mdi_airplane_off: \"\\uF01E\"\n    readonly property string mdi_airplane_takeoff: \"\\uF5D5\"\n    readonly property string mdi_airplay: \"\\uF01F\"\n    readonly property string mdi_airport: \"\\uF84A\"\n    readonly property string mdi_alarm: \"\\uF020\"\n    readonly property string mdi_alarm_bell: \"\\uF78D\"\n    readonly property string mdi_alarm_check: \"\\uF021\"\n    readonly property string mdi_alarm_light: \"\\uF78E\"\n    readonly property string mdi_alarm_light_outline: \"\\uFBC6\"\n    readonly property string mdi_alarm_multiple: \"\\uF022\"\n    readonly property string mdi_alarm_off: \"\\uF023\"\n    readonly property string mdi_alarm_plus: \"\\uF024\"\n    readonly property string mdi_alarm_snooze: \"\\uF68D\"\n    readonly property string mdi_album: \"\\uF025\"\n    readonly property string mdi_alert: \"\\uF026\"\n    readonly property string mdi_alert_box: \"\\uF027\"\n    readonly property string mdi_alert_box_outline: \"\\uFCC0\"\n    readonly property string mdi_alert_circle: \"\\uF028\"\n    readonly property string mdi_alert_circle_outline: \"\\uF5D6\"\n    readonly property string mdi_alert_decagram: \"\\uF6BC\"\n    readonly property string mdi_alert_decagram_outline: \"\\uFCC1\"\n    readonly property string mdi_alert_octagon: \"\\uF029\"\n    readonly property string mdi_alert_octagon_outline: \"\\uFCC2\"\n    readonly property string mdi_alert_octagram: \"\\uF766\"\n    readonly property string mdi_alert_octagram_outline: \"\\uFCC3\"\n    readonly property string mdi_alert_outline: \"\\uF02A\"\n    readonly property string mdi_alien: \"\\uF899\"\n    readonly property string mdi_all_inclusive: \"\\uF6BD\"\n    readonly property string mdi_alpha: \"\\uF02B\"\n    readonly property string mdi_alpha_a: \"\\u0041\"\n    readonly property string mdi_alpha_a_box: \"\\uFAED\"\n    readonly property string mdi_alpha_a_box_outline: \"\\uFBC7\"\n    readonly property string mdi_alpha_a_circle: \"\\uFBC8\"\n    readonly property string mdi_alpha_a_circle_outline: \"\\uFBC9\"\n    readonly property string mdi_alpha_b: \"\\u0042\"\n    readonly property string mdi_alpha_b_box: \"\\uFAEE\"\n    readonly property string mdi_alpha_b_box_outline: \"\\uFBCA\"\n    readonly property string mdi_alpha_b_circle: \"\\uFBCB\"\n    readonly property string mdi_alpha_b_circle_outline: \"\\uFBCC\"\n    readonly property string mdi_alpha_c: \"\\u0043\"\n    readonly property string mdi_alpha_c_box: \"\\uFAEF\"\n    readonly property string mdi_alpha_c_box_outline: \"\\uFBCD\"\n    readonly property string mdi_alpha_c_circle: \"\\uFBCE\"\n    readonly property string mdi_alpha_c_circle_outline: \"\\uFBCF\"\n    readonly property string mdi_alpha_d: \"\\u0044\"\n    readonly property string mdi_alpha_d_box: \"\\uFAF0\"\n    readonly property string mdi_alpha_d_box_outline: \"\\uFBD0\"\n    readonly property string mdi_alpha_d_circle: \"\\uFBD1\"\n    readonly property string mdi_alpha_d_circle_outline: \"\\uFBD2\"\n    readonly property string mdi_alpha_e: \"\\u0045\"\n    readonly property string mdi_alpha_e_box: \"\\uFAF1\"\n    readonly property string mdi_alpha_e_box_outline: \"\\uFBD3\"\n    readonly property string mdi_alpha_e_circle: \"\\uFBD4\"\n    readonly property string mdi_alpha_e_circle_outline: \"\\uFBD5\"\n    readonly property string mdi_alpha_f: \"\\u0046\"\n    readonly property string mdi_alpha_f_box: \"\\uFAF2\"\n    readonly property string mdi_alpha_f_box_outline: \"\\uFBD6\"\n    readonly property string mdi_alpha_f_circle: \"\\uFBD7\"\n    readonly property string mdi_alpha_f_circle_outline: \"\\uFBD8\"\n    readonly property string mdi_alpha_g: \"\\u0047\"\n    readonly property string mdi_alpha_g_box: \"\\uFAF3\"\n    readonly property string mdi_alpha_g_box_outline: \"\\uFBD9\"\n    readonly property string mdi_alpha_g_circle: \"\\uFBDA\"\n    readonly property string mdi_alpha_g_circle_outline: \"\\uFBDB\"\n    readonly property string mdi_alpha_h: \"\\u0048\"\n    readonly property string mdi_alpha_h_box: \"\\uFAF4\"\n    readonly property string mdi_alpha_h_box_outline: \"\\uFBDC\"\n    readonly property string mdi_alpha_h_circle: \"\\uFBDD\"\n    readonly property string mdi_alpha_h_circle_outline: \"\\uFBDE\"\n    readonly property string mdi_alpha_i: \"\\u0049\"\n    readonly property string mdi_alpha_i_box: \"\\uFAF5\"\n    readonly property string mdi_alpha_i_box_outline: \"\\uFBDF\"\n    readonly property string mdi_alpha_i_circle: \"\\uFBE0\"\n    readonly property string mdi_alpha_i_circle_outline: \"\\uFBE1\"\n    readonly property string mdi_alpha_j: \"\\u004A\"\n    readonly property string mdi_alpha_j_box: \"\\uFAF6\"\n    readonly property string mdi_alpha_j_box_outline: \"\\uFBE2\"\n    readonly property string mdi_alpha_j_circle: \"\\uFBE3\"\n    readonly property string mdi_alpha_j_circle_outline: \"\\uFBE4\"\n    readonly property string mdi_alpha_k: \"\\u004B\"\n    readonly property string mdi_alpha_k_box: \"\\uFAF7\"\n    readonly property string mdi_alpha_k_box_outline: \"\\uFBE5\"\n    readonly property string mdi_alpha_k_circle: \"\\uFBE6\"\n    readonly property string mdi_alpha_k_circle_outline: \"\\uFBE7\"\n    readonly property string mdi_alpha_l: \"\\u004C\"\n    readonly property string mdi_alpha_l_box: \"\\uFAF8\"\n    readonly property string mdi_alpha_l_box_outline: \"\\uFBE8\"\n    readonly property string mdi_alpha_l_circle: \"\\uFBE9\"\n    readonly property string mdi_alpha_l_circle_outline: \"\\uFBEA\"\n    readonly property string mdi_alpha_m: \"\\u004D\"\n    readonly property string mdi_alpha_m_box: \"\\uFAF9\"\n    readonly property string mdi_alpha_m_box_outline: \"\\uFBEB\"\n    readonly property string mdi_alpha_m_circle: \"\\uFBEC\"\n    readonly property string mdi_alpha_m_circle_outline: \"\\uFBED\"\n    readonly property string mdi_alpha_n: \"\\u004E\"\n    readonly property string mdi_alpha_n_box: \"\\uFAFA\"\n    readonly property string mdi_alpha_n_box_outline: \"\\uFBEE\"\n    readonly property string mdi_alpha_n_circle: \"\\uFBEF\"\n    readonly property string mdi_alpha_n_circle_outline: \"\\uFBF0\"\n    readonly property string mdi_alpha_o: \"\\u004F\"\n    readonly property string mdi_alpha_o_box: \"\\uFAFB\"\n    readonly property string mdi_alpha_o_box_outline: \"\\uFBF1\"\n    readonly property string mdi_alpha_o_circle: \"\\uFBF2\"\n    readonly property string mdi_alpha_o_circle_outline: \"\\uFBF3\"\n    readonly property string mdi_alpha_p: \"\\u0050\"\n    readonly property string mdi_alpha_p_box: \"\\uFAFC\"\n    readonly property string mdi_alpha_p_box_outline: \"\\uFBF4\"\n    readonly property string mdi_alpha_p_circle: \"\\uFBF5\"\n    readonly property string mdi_alpha_p_circle_outline: \"\\uFBF6\"\n    readonly property string mdi_alpha_q: \"\\u0051\"\n    readonly property string mdi_alpha_q_box: \"\\uFAFD\"\n    readonly property string mdi_alpha_q_box_outline: \"\\uFBF7\"\n    readonly property string mdi_alpha_q_circle: \"\\uFBF8\"\n    readonly property string mdi_alpha_q_circle_outline: \"\\uFBF9\"\n    readonly property string mdi_alpha_r: \"\\u0052\"\n    readonly property string mdi_alpha_r_box: \"\\uFAFE\"\n    readonly property string mdi_alpha_r_box_outline: \"\\uFBFA\"\n    readonly property string mdi_alpha_r_circle: \"\\uFBFB\"\n    readonly property string mdi_alpha_r_circle_outline: \"\\uFBFC\"\n    readonly property string mdi_alpha_s: \"\\u0053\"\n    readonly property string mdi_alpha_s_box: \"\\uFAFF\"\n    readonly property string mdi_alpha_s_box_outline: \"\\uFBFD\"\n    readonly property string mdi_alpha_s_circle: \"\\uFBFE\"\n    readonly property string mdi_alpha_s_circle_outline: \"\\uFBFF\"\n    readonly property string mdi_alpha_t: \"\\u0054\"\n    readonly property string mdi_alpha_t_box: \"\\uFB00\"\n    readonly property string mdi_alpha_t_box_outline: \"\\uFC00\"\n    readonly property string mdi_alpha_t_circle: \"\\uFC01\"\n    readonly property string mdi_alpha_t_circle_outline: \"\\uFC02\"\n    readonly property string mdi_alpha_u: \"\\u0055\"\n    readonly property string mdi_alpha_u_box: \"\\uFB01\"\n    readonly property string mdi_alpha_u_box_outline: \"\\uFC03\"\n    readonly property string mdi_alpha_u_circle: \"\\uFC04\"\n    readonly property string mdi_alpha_u_circle_outline: \"\\uFC05\"\n    readonly property string mdi_alpha_v: \"\\u0056\"\n    readonly property string mdi_alpha_v_box: \"\\uFB02\"\n    readonly property string mdi_alpha_v_box_outline: \"\\uFC06\"\n    readonly property string mdi_alpha_v_circle: \"\\uFC07\"\n    readonly property string mdi_alpha_v_circle_outline: \"\\uFC08\"\n    readonly property string mdi_alpha_w: \"\\u0057\"\n    readonly property string mdi_alpha_w_box: \"\\uFB03\"\n    readonly property string mdi_alpha_w_box_outline: \"\\uFC09\"\n    readonly property string mdi_alpha_w_circle: \"\\uFC0A\"\n    readonly property string mdi_alpha_w_circle_outline: \"\\uFC0B\"\n    readonly property string mdi_alpha_x: \"\\u0058\"\n    readonly property string mdi_alpha_x_box: \"\\uFB04\"\n    readonly property string mdi_alpha_x_box_outline: \"\\uFC0C\"\n    readonly property string mdi_alpha_x_circle: \"\\uFC0D\"\n    readonly property string mdi_alpha_x_circle_outline: \"\\uFC0E\"\n    readonly property string mdi_alpha_y: \"\\u0059\"\n    readonly property string mdi_alpha_y_box: \"\\uFB05\"\n    readonly property string mdi_alpha_y_box_outline: \"\\uFC0F\"\n    readonly property string mdi_alpha_y_circle: \"\\uFC10\"\n    readonly property string mdi_alpha_y_circle_outline: \"\\uFC11\"\n    readonly property string mdi_alpha_z: \"\\u005A\"\n    readonly property string mdi_alpha_z_box: \"\\uFB06\"\n    readonly property string mdi_alpha_z_box_outline: \"\\uFC12\"\n    readonly property string mdi_alpha_z_circle: \"\\uFC13\"\n    readonly property string mdi_alpha_z_circle_outline: \"\\uFC14\"\n    readonly property string mdi_alphabetical: \"\\uF02C\"\n    readonly property string mdi_altimeter: \"\\uF5D7\"\n    readonly property string mdi_amazon: \"\\uF02D\"\n    readonly property string mdi_amazon_alexa: \"\\uF8C5\"\n    readonly property string mdi_amazon_drive: \"\\uF02E\"\n    readonly property string mdi_ambulance: \"\\uF02F\"\n    readonly property string mdi_ammunition: \"\\uFCC4\"\n    readonly property string mdi_ampersand: \"\\uFA8C\"\n    readonly property string mdi_amplifier: \"\\uF030\"\n    readonly property string mdi_anchor: \"\\uF031\"\n    readonly property string mdi_android: \"\\uF032\"\n    readonly property string mdi_android_auto: \"\\uFA8D\"\n    readonly property string mdi_android_debug_bridge: \"\\uF033\"\n    readonly property string mdi_android_head: \"\\uF78F\"\n    readonly property string mdi_android_messages: \"\\uFD21\"\n    readonly property string mdi_android_studio: \"\\uF034\"\n    readonly property string mdi_angle_acute: \"\\uF936\"\n    readonly property string mdi_angle_obtuse: \"\\uF937\"\n    readonly property string mdi_angle_right: \"\\uF938\"\n    readonly property string mdi_angular: \"\\uF6B1\"\n    readonly property string mdi_angularjs: \"\\uF6BE\"\n    readonly property string mdi_animation: \"\\uF5D8\"\n    readonly property string mdi_animation_outline: \"\\uFA8E\"\n    readonly property string mdi_animation_play: \"\\uF939\"\n    readonly property string mdi_animation_play_outline: \"\\uFA8F\"\n    readonly property string mdi_anvil: \"\\uF89A\"\n    readonly property string mdi_apple: \"\\uF035\"\n    readonly property string mdi_apple_finder: \"\\uF036\"\n    readonly property string mdi_apple_icloud: \"\\uF038\"\n    readonly property string mdi_apple_ios: \"\\uF037\"\n    readonly property string mdi_apple_keyboard_caps: \"\\uF632\"\n    readonly property string mdi_apple_keyboard_command: \"\\uF633\"\n    readonly property string mdi_apple_keyboard_control: \"\\uF634\"\n    readonly property string mdi_apple_keyboard_option: \"\\uF635\"\n    readonly property string mdi_apple_keyboard_shift: \"\\uF636\"\n    readonly property string mdi_apple_safari: \"\\uF039\"\n    readonly property string mdi_application: \"\\uF614\"\n    readonly property string mdi_application_export: \"\\uFD89\"\n    readonly property string mdi_application_import: \"\\uFD8A\"\n    readonly property string mdi_apps: \"\\uF03B\"\n    readonly property string mdi_apps_box: \"\\uFD22\"\n    readonly property string mdi_arch: \"\\uF8C6\"\n    readonly property string mdi_archive: \"\\uF03C\"\n    readonly property string mdi_arrange_bring_forward: \"\\uF03D\"\n    readonly property string mdi_arrange_bring_to_front: \"\\uF03E\"\n    readonly property string mdi_arrange_send_backward: \"\\uF03F\"\n    readonly property string mdi_arrange_send_to_back: \"\\uF040\"\n    readonly property string mdi_arrow_all: \"\\uF041\"\n    readonly property string mdi_arrow_bottom_left: \"\\uF042\"\n    readonly property string mdi_arrow_bottom_left_bold_outline: \"\\uF9B6\"\n    readonly property string mdi_arrow_bottom_left_thick: \"\\uF9B7\"\n    readonly property string mdi_arrow_bottom_right: \"\\uF043\"\n    readonly property string mdi_arrow_bottom_right_bold_outline: \"\\uF9B8\"\n    readonly property string mdi_arrow_bottom_right_thick: \"\\uF9B9\"\n    readonly property string mdi_arrow_collapse: \"\\uF615\"\n    readonly property string mdi_arrow_collapse_all: \"\\uF044\"\n    readonly property string mdi_arrow_collapse_down: \"\\uF791\"\n    readonly property string mdi_arrow_collapse_horizontal: \"\\uF84B\"\n    readonly property string mdi_arrow_collapse_left: \"\\uF792\"\n    readonly property string mdi_arrow_collapse_right: \"\\uF793\"\n    readonly property string mdi_arrow_collapse_up: \"\\uF794\"\n    readonly property string mdi_arrow_collapse_vertical: \"\\uF84C\"\n    readonly property string mdi_arrow_decision: \"\\uF9BA\"\n    readonly property string mdi_arrow_decision_auto: \"\\uF9BB\"\n    readonly property string mdi_arrow_decision_auto_outline: \"\\uF9BC\"\n    readonly property string mdi_arrow_decision_outline: \"\\uF9BD\"\n    readonly property string mdi_arrow_down: \"\\uF045\"\n    readonly property string mdi_arrow_down_bold: \"\\uF72D\"\n    readonly property string mdi_arrow_down_bold_box: \"\\uF72E\"\n    readonly property string mdi_arrow_down_bold_box_outline: \"\\uF72F\"\n    readonly property string mdi_arrow_down_bold_circle: \"\\uF047\"\n    readonly property string mdi_arrow_down_bold_circle_outline: \"\\uF048\"\n    readonly property string mdi_arrow_down_bold_hexagon_outline: \"\\uF049\"\n    readonly property string mdi_arrow_down_bold_outline: \"\\uF9BE\"\n    readonly property string mdi_arrow_down_box: \"\\uF6BF\"\n    readonly property string mdi_arrow_down_circle: \"\\uFCB7\"\n    readonly property string mdi_arrow_down_circle_outline: \"\\uFCB8\"\n    readonly property string mdi_arrow_down_drop_circle: \"\\uF04A\"\n    readonly property string mdi_arrow_down_drop_circle_outline: \"\\uF04B\"\n    readonly property string mdi_arrow_down_thick: \"\\uF046\"\n    readonly property string mdi_arrow_expand: \"\\uF616\"\n    readonly property string mdi_arrow_expand_all: \"\\uF04C\"\n    readonly property string mdi_arrow_expand_down: \"\\uF795\"\n    readonly property string mdi_arrow_expand_horizontal: \"\\uF84D\"\n    readonly property string mdi_arrow_expand_left: \"\\uF796\"\n    readonly property string mdi_arrow_expand_right: \"\\uF797\"\n    readonly property string mdi_arrow_expand_up: \"\\uF798\"\n    readonly property string mdi_arrow_expand_vertical: \"\\uF84E\"\n    readonly property string mdi_arrow_left: \"\\uF04D\"\n    readonly property string mdi_arrow_left_bold: \"\\uF730\"\n    readonly property string mdi_arrow_left_bold_box: \"\\uF731\"\n    readonly property string mdi_arrow_left_bold_box_outline: \"\\uF732\"\n    readonly property string mdi_arrow_left_bold_circle: \"\\uF04F\"\n    readonly property string mdi_arrow_left_bold_circle_outline: \"\\uF050\"\n    readonly property string mdi_arrow_left_bold_hexagon_outline: \"\\uF051\"\n    readonly property string mdi_arrow_left_bold_outline: \"\\uF9BF\"\n    readonly property string mdi_arrow_left_box: \"\\uF6C0\"\n    readonly property string mdi_arrow_left_circle: \"\\uFCB9\"\n    readonly property string mdi_arrow_left_circle_outline: \"\\uFCBA\"\n    readonly property string mdi_arrow_left_drop_circle: \"\\uF052\"\n    readonly property string mdi_arrow_left_drop_circle_outline: \"\\uF053\"\n    readonly property string mdi_arrow_left_right_bold_outline: \"\\uF9C0\"\n    readonly property string mdi_arrow_left_thick: \"\\uF04E\"\n    readonly property string mdi_arrow_right: \"\\uF054\"\n    readonly property string mdi_arrow_right_bold: \"\\uF733\"\n    readonly property string mdi_arrow_right_bold_box: \"\\uF734\"\n    readonly property string mdi_arrow_right_bold_box_outline: \"\\uF735\"\n    readonly property string mdi_arrow_right_bold_circle: \"\\uF056\"\n    readonly property string mdi_arrow_right_bold_circle_outline: \"\\uF057\"\n    readonly property string mdi_arrow_right_bold_hexagon_outline: \"\\uF058\"\n    readonly property string mdi_arrow_right_bold_outline: \"\\uF9C1\"\n    readonly property string mdi_arrow_right_box: \"\\uF6C1\"\n    readonly property string mdi_arrow_right_circle: \"\\uFCBB\"\n    readonly property string mdi_arrow_right_circle_outline: \"\\uFCBC\"\n    readonly property string mdi_arrow_right_drop_circle: \"\\uF059\"\n    readonly property string mdi_arrow_right_drop_circle_outline: \"\\uF05A\"\n    readonly property string mdi_arrow_right_thick: \"\\uF055\"\n    readonly property string mdi_arrow_split_horizontal: \"\\uF93A\"\n    readonly property string mdi_arrow_split_vertical: \"\\uF93B\"\n    readonly property string mdi_arrow_top_left: \"\\uF05B\"\n    readonly property string mdi_arrow_top_left_bold_outline: \"\\uF9C2\"\n    readonly property string mdi_arrow_top_left_thick: \"\\uF9C3\"\n    readonly property string mdi_arrow_top_right: \"\\uF05C\"\n    readonly property string mdi_arrow_top_right_bold_outline: \"\\uF9C4\"\n    readonly property string mdi_arrow_top_right_thick: \"\\uF9C5\"\n    readonly property string mdi_arrow_up: \"\\uF05D\"\n    readonly property string mdi_arrow_up_bold: \"\\uF736\"\n    readonly property string mdi_arrow_up_bold_box: \"\\uF737\"\n    readonly property string mdi_arrow_up_bold_box_outline: \"\\uF738\"\n    readonly property string mdi_arrow_up_bold_circle: \"\\uF05F\"\n    readonly property string mdi_arrow_up_bold_circle_outline: \"\\uF060\"\n    readonly property string mdi_arrow_up_bold_hexagon_outline: \"\\uF061\"\n    readonly property string mdi_arrow_up_bold_outline: \"\\uF9C6\"\n    readonly property string mdi_arrow_up_box: \"\\uF6C2\"\n    readonly property string mdi_arrow_up_circle: \"\\uFCBD\"\n    readonly property string mdi_arrow_up_circle_outline: \"\\uFCBE\"\n    readonly property string mdi_arrow_up_down_bold_outline: \"\\uF9C7\"\n    readonly property string mdi_arrow_up_drop_circle: \"\\uF062\"\n    readonly property string mdi_arrow_up_drop_circle_outline: \"\\uF063\"\n    readonly property string mdi_arrow_up_thick: \"\\uF05E\"\n    readonly property string mdi_artist: \"\\uF802\"\n    readonly property string mdi_artist_outline: \"\\uFCC5\"\n    readonly property string mdi_artstation: \"\\uFB37\"\n    readonly property string mdi_aspect_ratio: \"\\uFA23\"\n    readonly property string mdi_assistant: \"\\uF064\"\n    readonly property string mdi_asterisk: \"\\uF6C3\"\n    readonly property string mdi_at: \"\\uF065\"\n    readonly property string mdi_atlassian: \"\\uF803\"\n    readonly property string mdi_atm: \"\\uFD23\"\n    readonly property string mdi_atom: \"\\uF767\"\n    readonly property string mdi_attachment: \"\\uF066\"\n    readonly property string mdi_audio_video: \"\\uF93C\"\n    readonly property string mdi_audiobook: \"\\uF067\"\n    readonly property string mdi_augmented_reality: \"\\uF84F\"\n    readonly property string mdi_auto_fix: \"\\uF068\"\n    readonly property string mdi_auto_upload: \"\\uF069\"\n    readonly property string mdi_autorenew: \"\\uF06A\"\n    readonly property string mdi_av_timer: \"\\uF06B\"\n    readonly property string mdi_axe: \"\\uF8C7\"\n    readonly property string mdi_axis: \"\\uFD24\"\n    readonly property string mdi_axis_arrow: \"\\uFD25\"\n    readonly property string mdi_axis_arrow_lock: \"\\uFD26\"\n    readonly property string mdi_axis_lock: \"\\uFD27\"\n    readonly property string mdi_axis_x_arrow: \"\\uFD28\"\n    readonly property string mdi_axis_x_arrow_lock: \"\\uFD29\"\n    readonly property string mdi_axis_x_rotate_clockwise: \"\\uFD2A\"\n    readonly property string mdi_axis_x_rotate_counterclockwise: \"\\uFD2B\"\n    readonly property string mdi_axis_x_y_arrow_lock: \"\\uFD2C\"\n    readonly property string mdi_axis_y_arrow: \"\\uFD2D\"\n    readonly property string mdi_axis_y_arrow_lock: \"\\uFD2E\"\n    readonly property string mdi_axis_y_rotate_clockwise: \"\\uFD2F\"\n    readonly property string mdi_axis_y_rotate_counterclockwise: \"\\uFD30\"\n    readonly property string mdi_axis_z_arrow: \"\\uFD31\"\n    readonly property string mdi_axis_z_arrow_lock: \"\\uFD32\"\n    readonly property string mdi_axis_z_rotate_clockwise: \"\\uFD33\"\n    readonly property string mdi_axis_z_rotate_counterclockwise: \"\\uFD34\"\n    readonly property string mdi_azure: \"\\uF804\"\n    readonly property string mdi_babel: \"\\uFA24\"\n    readonly property string mdi_baby: \"\\uF06C\"\n    readonly property string mdi_baby_buggy: \"\\uF68E\"\n    readonly property string mdi_backburger: \"\\uF06D\"\n    readonly property string mdi_backspace: \"\\uF06E\"\n    readonly property string mdi_backspace_outline: \"\\uFB38\"\n    readonly property string mdi_backup_restore: \"\\uF06F\"\n    readonly property string mdi_badminton: \"\\uF850\"\n    readonly property string mdi_balloon: \"\\uFA25\"\n    readonly property string mdi_ballot: \"\\uF9C8\"\n    readonly property string mdi_ballot_outline: \"\\uF9C9\"\n    readonly property string mdi_ballot_recount: \"\\uFC15\"\n    readonly property string mdi_ballot_recount_outline: \"\\uFC16\"\n    readonly property string mdi_bandage: \"\\uFD8B\"\n    readonly property string mdi_bandcamp: \"\\uF674\"\n    readonly property string mdi_bank: \"\\uF070\"\n    readonly property string mdi_bank_minus: \"\\uFD8C\"\n    readonly property string mdi_bank_plus: \"\\uFD8D\"\n    readonly property string mdi_bank_remove: \"\\uFD8E\"\n    readonly property string mdi_bank_transfer: \"\\uFA26\"\n    readonly property string mdi_bank_transfer_in: \"\\uFA27\"\n    readonly property string mdi_bank_transfer_out: \"\\uFA28\"\n    readonly property string mdi_barcode: \"\\uF071\"\n    readonly property string mdi_barcode_scan: \"\\uF072\"\n    readonly property string mdi_barley: \"\\uF073\"\n    readonly property string mdi_barley_off: \"\\uFB39\"\n    readonly property string mdi_barn: \"\\uFB3A\"\n    readonly property string mdi_barrel: \"\\uF074\"\n    readonly property string mdi_baseball: \"\\uF851\"\n    readonly property string mdi_baseball_bat: \"\\uF852\"\n    readonly property string mdi_basecamp: \"\\uF075\"\n    readonly property string mdi_basket: \"\\uF076\"\n    readonly property string mdi_basket_fill: \"\\uF077\"\n    readonly property string mdi_basket_unfill: \"\\uF078\"\n    readonly property string mdi_basketball: \"\\uF805\"\n    readonly property string mdi_basketball_hoop: \"\\uFC17\"\n    readonly property string mdi_basketball_hoop_outline: \"\\uFC18\"\n    readonly property string mdi_bat: \"\\uFB3B\"\n    readonly property string mdi_battery: \"\\uF079\"\n    readonly property string mdi_battery_10: \"\\uF07A\"\n    readonly property string mdi_battery_10_bluetooth: \"\\uF93D\"\n    readonly property string mdi_battery_20: \"\\uF07B\"\n    readonly property string mdi_battery_20_bluetooth: \"\\uF93E\"\n    readonly property string mdi_battery_30: \"\\uF07C\"\n    readonly property string mdi_battery_30_bluetooth: \"\\uF93F\"\n    readonly property string mdi_battery_40: \"\\uF07D\"\n    readonly property string mdi_battery_40_bluetooth: \"\\uF940\"\n    readonly property string mdi_battery_50: \"\\uF07E\"\n    readonly property string mdi_battery_50_bluetooth: \"\\uF941\"\n    readonly property string mdi_battery_60: \"\\uF07F\"\n    readonly property string mdi_battery_60_bluetooth: \"\\uF942\"\n    readonly property string mdi_battery_70: \"\\uF080\"\n    readonly property string mdi_battery_70_bluetooth: \"\\uF943\"\n    readonly property string mdi_battery_80: \"\\uF081\"\n    readonly property string mdi_battery_80_bluetooth: \"\\uF944\"\n    readonly property string mdi_battery_90: \"\\uF082\"\n    readonly property string mdi_battery_90_bluetooth: \"\\uF945\"\n    readonly property string mdi_battery_alert: \"\\uF083\"\n    readonly property string mdi_battery_alert_bluetooth: \"\\uF946\"\n    readonly property string mdi_battery_bluetooth: \"\\uF947\"\n    readonly property string mdi_battery_bluetooth_variant: \"\\uF948\"\n    readonly property string mdi_battery_charging: \"\\uF084\"\n    readonly property string mdi_battery_charging_10: \"\\uF89B\"\n    readonly property string mdi_battery_charging_100: \"\\uF085\"\n    readonly property string mdi_battery_charging_20: \"\\uF086\"\n    readonly property string mdi_battery_charging_30: \"\\uF087\"\n    readonly property string mdi_battery_charging_40: \"\\uF088\"\n    readonly property string mdi_battery_charging_50: \"\\uF89C\"\n    readonly property string mdi_battery_charging_60: \"\\uF089\"\n    readonly property string mdi_battery_charging_70: \"\\uF89D\"\n    readonly property string mdi_battery_charging_80: \"\\uF08A\"\n    readonly property string mdi_battery_charging_90: \"\\uF08B\"\n    readonly property string mdi_battery_charging_outline: \"\\uF89E\"\n    readonly property string mdi_battery_charging_wireless: \"\\uF806\"\n    readonly property string mdi_battery_charging_wireless_10: \"\\uF807\"\n    readonly property string mdi_battery_charging_wireless_20: \"\\uF808\"\n    readonly property string mdi_battery_charging_wireless_30: \"\\uF809\"\n    readonly property string mdi_battery_charging_wireless_40: \"\\uF80A\"\n    readonly property string mdi_battery_charging_wireless_50: \"\\uF80B\"\n    readonly property string mdi_battery_charging_wireless_60: \"\\uF80C\"\n    readonly property string mdi_battery_charging_wireless_70: \"\\uF80D\"\n    readonly property string mdi_battery_charging_wireless_80: \"\\uF80E\"\n    readonly property string mdi_battery_charging_wireless_90: \"\\uF80F\"\n    readonly property string mdi_battery_charging_wireless_alert: \"\\uF810\"\n    readonly property string mdi_battery_charging_wireless_outline: \"\\uF811\"\n    readonly property string mdi_battery_minus: \"\\uF08C\"\n    readonly property string mdi_battery_negative: \"\\uF08D\"\n    readonly property string mdi_battery_outline: \"\\uF08E\"\n    readonly property string mdi_battery_plus: \"\\uF08F\"\n    readonly property string mdi_battery_positive: \"\\uF090\"\n    readonly property string mdi_battery_unknown: \"\\uF091\"\n    readonly property string mdi_battery_unknown_bluetooth: \"\\uF949\"\n    readonly property string mdi_battlenet: \"\\uFB3C\"\n    readonly property string mdi_beach: \"\\uF092\"\n    readonly property string mdi_beaker: \"\\uFCC6\"\n    readonly property string mdi_beaker_outline: \"\\uF68F\"\n    readonly property string mdi_beats: \"\\uF097\"\n    readonly property string mdi_bed_empty: \"\\uF89F\"\n    readonly property string mdi_beer: \"\\uF098\"\n    readonly property string mdi_behance: \"\\uF099\"\n    readonly property string mdi_bell: \"\\uF09A\"\n    readonly property string mdi_bell_alert: \"\\uFD35\"\n    readonly property string mdi_bell_circle: \"\\uFD36\"\n    readonly property string mdi_bell_circle_outline: \"\\uFD37\"\n    readonly property string mdi_bell_off: \"\\uF09B\"\n    readonly property string mdi_bell_off_outline: \"\\uFA90\"\n    readonly property string mdi_bell_outline: \"\\uF09C\"\n    readonly property string mdi_bell_plus: \"\\uF09D\"\n    readonly property string mdi_bell_plus_outline: \"\\uFA91\"\n    readonly property string mdi_bell_ring: \"\\uF09E\"\n    readonly property string mdi_bell_ring_outline: \"\\uF09F\"\n    readonly property string mdi_bell_sleep: \"\\uF0A0\"\n    readonly property string mdi_bell_sleep_outline: \"\\uFA92\"\n    readonly property string mdi_beta: \"\\uF0A1\"\n    readonly property string mdi_betamax: \"\\uF9CA\"\n    readonly property string mdi_bible: \"\\uF0A2\"\n    readonly property string mdi_bike: \"\\uF0A3\"\n    readonly property string mdi_billiards: \"\\uFB3D\"\n    readonly property string mdi_billiards_rack: \"\\uFB3E\"\n    readonly property string mdi_bing: \"\\uF0A4\"\n    readonly property string mdi_binoculars: \"\\uF0A5\"\n    readonly property string mdi_bio: \"\\uF0A6\"\n    readonly property string mdi_biohazard: \"\\uF0A7\"\n    readonly property string mdi_bitbucket: \"\\uF0A8\"\n    readonly property string mdi_bitcoin: \"\\uF812\"\n    readonly property string mdi_black_mesa: \"\\uF0A9\"\n    readonly property string mdi_blackberry: \"\\uF0AA\"\n    readonly property string mdi_blender: \"\\uFCC7\"\n    readonly property string mdi_blender_software: \"\\uF0AB\"\n    readonly property string mdi_blinds: \"\\uF0AC\"\n    readonly property string mdi_block_helper: \"\\uF0AD\"\n    readonly property string mdi_blogger: \"\\uF0AE\"\n    readonly property string mdi_blood_bag: \"\\uFCC8\"\n    readonly property string mdi_bluetooth: \"\\uF0AF\"\n    readonly property string mdi_bluetooth_audio: \"\\uF0B0\"\n    readonly property string mdi_bluetooth_connect: \"\\uF0B1\"\n    readonly property string mdi_bluetooth_off: \"\\uF0B2\"\n    readonly property string mdi_bluetooth_settings: \"\\uF0B3\"\n    readonly property string mdi_bluetooth_transfer: \"\\uF0B4\"\n    readonly property string mdi_blur: \"\\uF0B5\"\n    readonly property string mdi_blur_linear: \"\\uF0B6\"\n    readonly property string mdi_blur_off: \"\\uF0B7\"\n    readonly property string mdi_blur_radial: \"\\uF0B8\"\n    readonly property string mdi_bolnisi_cross: \"\\uFCC9\"\n    readonly property string mdi_bolt: \"\\uFD8F\"\n    readonly property string mdi_bomb: \"\\uF690\"\n    readonly property string mdi_bomb_off: \"\\uF6C4\"\n    readonly property string mdi_bone: \"\\uF0B9\"\n    readonly property string mdi_book: \"\\uF0BA\"\n    readonly property string mdi_book_lock: \"\\uF799\"\n    readonly property string mdi_book_lock_open: \"\\uF79A\"\n    readonly property string mdi_book_minus: \"\\uF5D9\"\n    readonly property string mdi_book_multiple: \"\\uF0BB\"\n    readonly property string mdi_book_multiple_minus: \"\\uFA93\"\n    readonly property string mdi_book_multiple_plus: \"\\uFA94\"\n    readonly property string mdi_book_multiple_remove: \"\\uFA95\"\n    readonly property string mdi_book_multiple_variant: \"\\uF0BC\"\n    readonly property string mdi_book_open: \"\\uF0BD\"\n    readonly property string mdi_book_open_outline: \"\\uFB3F\"\n    readonly property string mdi_book_open_page_variant: \"\\uF5DA\"\n    readonly property string mdi_book_open_variant: \"\\uF0BE\"\n    readonly property string mdi_book_outline: \"\\uFB40\"\n    readonly property string mdi_book_plus: \"\\uF5DB\"\n    readonly property string mdi_book_remove: \"\\uFA96\"\n    readonly property string mdi_book_variant: \"\\uF0BF\"\n    readonly property string mdi_bookmark: \"\\uF0C0\"\n    readonly property string mdi_bookmark_check: \"\\uF0C1\"\n    readonly property string mdi_bookmark_minus: \"\\uF9CB\"\n    readonly property string mdi_bookmark_minus_outline: \"\\uF9CC\"\n    readonly property string mdi_bookmark_music: \"\\uF0C2\"\n    readonly property string mdi_bookmark_off: \"\\uF9CD\"\n    readonly property string mdi_bookmark_off_outline: \"\\uF9CE\"\n    readonly property string mdi_bookmark_outline: \"\\uF0C3\"\n    readonly property string mdi_bookmark_plus: \"\\uF0C5\"\n    readonly property string mdi_bookmark_plus_outline: \"\\uF0C4\"\n    readonly property string mdi_bookmark_remove: \"\\uF0C6\"\n    readonly property string mdi_boombox: \"\\uF5DC\"\n    readonly property string mdi_bootstrap: \"\\uF6C5\"\n    readonly property string mdi_border_all: \"\\uF0C7\"\n    readonly property string mdi_border_all_variant: \"\\uF8A0\"\n    readonly property string mdi_border_bottom: \"\\uF0C8\"\n    readonly property string mdi_border_bottom_variant: \"\\uF8A1\"\n    readonly property string mdi_border_color: \"\\uF0C9\"\n    readonly property string mdi_border_horizontal: \"\\uF0CA\"\n    readonly property string mdi_border_inside: \"\\uF0CB\"\n    readonly property string mdi_border_left: \"\\uF0CC\"\n    readonly property string mdi_border_left_variant: \"\\uF8A2\"\n    readonly property string mdi_border_none: \"\\uF0CD\"\n    readonly property string mdi_border_none_variant: \"\\uF8A3\"\n    readonly property string mdi_border_outside: \"\\uF0CE\"\n    readonly property string mdi_border_right: \"\\uF0CF\"\n    readonly property string mdi_border_right_variant: \"\\uF8A4\"\n    readonly property string mdi_border_style: \"\\uF0D0\"\n    readonly property string mdi_border_top: \"\\uF0D1\"\n    readonly property string mdi_border_top_variant: \"\\uF8A5\"\n    readonly property string mdi_border_vertical: \"\\uF0D2\"\n    readonly property string mdi_bottle_wine: \"\\uF853\"\n    readonly property string mdi_bow_tie: \"\\uF677\"\n    readonly property string mdi_bowl: \"\\uF617\"\n    readonly property string mdi_bowling: \"\\uF0D3\"\n    readonly property string mdi_box: \"\\uF0D4\"\n    readonly property string mdi_box_cutter: \"\\uF0D5\"\n    readonly property string mdi_box_shadow: \"\\uF637\"\n    readonly property string mdi_boxing_glove: \"\\uFB41\"\n    readonly property string mdi_braille: \"\\uF9CF\"\n    readonly property string mdi_brain: \"\\uF9D0\"\n    readonly property string mdi_bread_slice: \"\\uFCCA\"\n    readonly property string mdi_bread_slice_outline: \"\\uFCCB\"\n    readonly property string mdi_bridge: \"\\uF618\"\n    readonly property string mdi_briefcase: \"\\uF0D6\"\n    readonly property string mdi_briefcase_account: \"\\uFCCC\"\n    readonly property string mdi_briefcase_account_outline: \"\\uFCCD\"\n    readonly property string mdi_briefcase_check: \"\\uF0D7\"\n    readonly property string mdi_briefcase_download: \"\\uF0D8\"\n    readonly property string mdi_briefcase_download_outline: \"\\uFC19\"\n    readonly property string mdi_briefcase_edit: \"\\uFA97\"\n    readonly property string mdi_briefcase_edit_outline: \"\\uFC1A\"\n    readonly property string mdi_briefcase_minus: \"\\uFA29\"\n    readonly property string mdi_briefcase_minus_outline: \"\\uFC1B\"\n    readonly property string mdi_briefcase_outline: \"\\uF813\"\n    readonly property string mdi_briefcase_plus: \"\\uFA2A\"\n    readonly property string mdi_briefcase_plus_outline: \"\\uFC1C\"\n    readonly property string mdi_briefcase_remove: \"\\uFA2B\"\n    readonly property string mdi_briefcase_remove_outline: \"\\uFC1D\"\n    readonly property string mdi_briefcase_search: \"\\uFA2C\"\n    readonly property string mdi_briefcase_search_outline: \"\\uFC1E\"\n    readonly property string mdi_briefcase_upload: \"\\uF0D9\"\n    readonly property string mdi_briefcase_upload_outline: \"\\uFC1F\"\n    readonly property string mdi_brightness_1: \"\\uF0DA\"\n    readonly property string mdi_brightness_2: \"\\uF0DB\"\n    readonly property string mdi_brightness_3: \"\\uF0DC\"\n    readonly property string mdi_brightness_4: \"\\uF0DD\"\n    readonly property string mdi_brightness_5: \"\\uF0DE\"\n    readonly property string mdi_brightness_6: \"\\uF0DF\"\n    readonly property string mdi_brightness_7: \"\\uF0E0\"\n    readonly property string mdi_brightness_auto: \"\\uF0E1\"\n    readonly property string mdi_brightness_percent: \"\\uFCCE\"\n    readonly property string mdi_broom: \"\\uF0E2\"\n    readonly property string mdi_brush: \"\\uF0E3\"\n    readonly property string mdi_buddhism: \"\\uF94A\"\n    readonly property string mdi_buffer: \"\\uF619\"\n    readonly property string mdi_bug: \"\\uF0E4\"\n    readonly property string mdi_bug_check: \"\\uFA2D\"\n    readonly property string mdi_bug_check_outline: \"\\uFA2E\"\n    readonly property string mdi_bug_outline: \"\\uFA2F\"\n    readonly property string mdi_bugle: \"\\uFD90\"\n    readonly property string mdi_bulldozer: \"\\uFB07\"\n    readonly property string mdi_bullet: \"\\uFCCF\"\n    readonly property string mdi_bulletin_board: \"\\uF0E5\"\n    readonly property string mdi_bullhorn: \"\\uF0E6\"\n    readonly property string mdi_bullhorn_outline: \"\\uFB08\"\n    readonly property string mdi_bullseye: \"\\uF5DD\"\n    readonly property string mdi_bullseye_arrow: \"\\uF8C8\"\n    readonly property string mdi_bus: \"\\uF0E7\"\n    readonly property string mdi_bus_alert: \"\\uFA98\"\n    readonly property string mdi_bus_articulated_end: \"\\uF79B\"\n    readonly property string mdi_bus_articulated_front: \"\\uF79C\"\n    readonly property string mdi_bus_clock: \"\\uF8C9\"\n    readonly property string mdi_bus_double_decker: \"\\uF79D\"\n    readonly property string mdi_bus_school: \"\\uF79E\"\n    readonly property string mdi_bus_side: \"\\uF79F\"\n    readonly property string mdi_cached: \"\\uF0E8\"\n    readonly property string mdi_cactus: \"\\uFD91\"\n    readonly property string mdi_cake: \"\\uF0E9\"\n    readonly property string mdi_cake_layered: \"\\uF0EA\"\n    readonly property string mdi_cake_variant: \"\\uF0EB\"\n    readonly property string mdi_calculator: \"\\uF0EC\"\n    readonly property string mdi_calculator_variant: \"\\uFA99\"\n    readonly property string mdi_calendar: \"\\uF0ED\"\n    readonly property string mdi_calendar_alert: \"\\uFA30\"\n    readonly property string mdi_calendar_blank: \"\\uF0EE\"\n    readonly property string mdi_calendar_blank_outline: \"\\uFB42\"\n    readonly property string mdi_calendar_check: \"\\uF0EF\"\n    readonly property string mdi_calendar_check_outline: \"\\uFC20\"\n    readonly property string mdi_calendar_clock: \"\\uF0F0\"\n    readonly property string mdi_calendar_edit: \"\\uF8A6\"\n    readonly property string mdi_calendar_export: \"\\uFB09\"\n    readonly property string mdi_calendar_heart: \"\\uF9D1\"\n    readonly property string mdi_calendar_import: \"\\uFB0A\"\n    readonly property string mdi_calendar_minus: \"\\uFD38\"\n    readonly property string mdi_calendar_multiple: \"\\uF0F1\"\n    readonly property string mdi_calendar_multiple_check: \"\\uF0F2\"\n    readonly property string mdi_calendar_multiselect: \"\\uFA31\"\n    readonly property string mdi_calendar_outline: \"\\uFB43\"\n    readonly property string mdi_calendar_plus: \"\\uF0F3\"\n    readonly property string mdi_calendar_question: \"\\uF691\"\n    readonly property string mdi_calendar_range: \"\\uF678\"\n    readonly property string mdi_calendar_range_outline: \"\\uFB44\"\n    readonly property string mdi_calendar_remove: \"\\uF0F4\"\n    readonly property string mdi_calendar_remove_outline: \"\\uFC21\"\n    readonly property string mdi_calendar_search: \"\\uF94B\"\n    readonly property string mdi_calendar_star: \"\\uF9D2\"\n    readonly property string mdi_calendar_text: \"\\uF0F5\"\n    readonly property string mdi_calendar_text_outline: \"\\uFC22\"\n    readonly property string mdi_calendar_today: \"\\uF0F6\"\n    readonly property string mdi_calendar_week: \"\\uFA32\"\n    readonly property string mdi_calendar_week_begin: \"\\uFA33\"\n    readonly property string mdi_call_made: \"\\uF0F7\"\n    readonly property string mdi_call_merge: \"\\uF0F8\"\n    readonly property string mdi_call_missed: \"\\uF0F9\"\n    readonly property string mdi_call_received: \"\\uF0FA\"\n    readonly property string mdi_call_split: \"\\uF0FB\"\n    readonly property string mdi_camcorder: \"\\uF0FC\"\n    readonly property string mdi_camcorder_box: \"\\uF0FD\"\n    readonly property string mdi_camcorder_box_off: \"\\uF0FE\"\n    readonly property string mdi_camcorder_off: \"\\uF0FF\"\n    readonly property string mdi_camera: \"\\uF100\"\n    readonly property string mdi_camera_account: \"\\uF8CA\"\n    readonly property string mdi_camera_burst: \"\\uF692\"\n    readonly property string mdi_camera_control: \"\\uFB45\"\n    readonly property string mdi_camera_enhance: \"\\uF101\"\n    readonly property string mdi_camera_enhance_outline: \"\\uFB46\"\n    readonly property string mdi_camera_front: \"\\uF102\"\n    readonly property string mdi_camera_front_variant: \"\\uF103\"\n    readonly property string mdi_camera_gopro: \"\\uF7A0\"\n    readonly property string mdi_camera_image: \"\\uF8CB\"\n    readonly property string mdi_camera_iris: \"\\uF104\"\n    readonly property string mdi_camera_metering_center: \"\\uF7A1\"\n    readonly property string mdi_camera_metering_matrix: \"\\uF7A2\"\n    readonly property string mdi_camera_metering_partial: \"\\uF7A3\"\n    readonly property string mdi_camera_metering_spot: \"\\uF7A4\"\n    readonly property string mdi_camera_off: \"\\uF5DF\"\n    readonly property string mdi_camera_outline: \"\\uFD39\"\n    readonly property string mdi_camera_party_mode: \"\\uF105\"\n    readonly property string mdi_camera_rear: \"\\uF106\"\n    readonly property string mdi_camera_rear_variant: \"\\uF107\"\n    readonly property string mdi_camera_switch: \"\\uF108\"\n    readonly property string mdi_camera_timer: \"\\uF109\"\n    readonly property string mdi_camera_wireless: \"\\uFD92\"\n    readonly property string mdi_camera_wireless_outline: \"\\uFD93\"\n    readonly property string mdi_cancel: \"\\uF739\"\n    readonly property string mdi_candle: \"\\uF5E2\"\n    readonly property string mdi_candycane: \"\\uF10A\"\n    readonly property string mdi_cannabis: \"\\uF7A5\"\n    readonly property string mdi_caps_lock: \"\\uFA9A\"\n    readonly property string mdi_car: \"\\uF10B\"\n    readonly property string mdi_car_battery: \"\\uF10C\"\n    readonly property string mdi_car_brake_abs: \"\\uFC23\"\n    readonly property string mdi_car_brake_alert: \"\\uFC24\"\n    readonly property string mdi_car_brake_hold: \"\\uFD3A\"\n    readonly property string mdi_car_brake_parking: \"\\uFD3B\"\n    readonly property string mdi_car_connected: \"\\uF10D\"\n    readonly property string mdi_car_convertible: \"\\uF7A6\"\n    readonly property string mdi_car_cruise_control: \"\\uFD3C\"\n    readonly property string mdi_car_defrost_front: \"\\uFD3D\"\n    readonly property string mdi_car_defrost_rear: \"\\uFD3E\"\n    readonly property string mdi_car_door: \"\\uFB47\"\n    readonly property string mdi_car_electric: \"\\uFB48\"\n    readonly property string mdi_car_esp: \"\\uFC25\"\n    readonly property string mdi_car_estate: \"\\uF7A7\"\n    readonly property string mdi_car_hatchback: \"\\uF7A8\"\n    readonly property string mdi_car_key: \"\\uFB49\"\n    readonly property string mdi_car_light_dimmed: \"\\uFC26\"\n    readonly property string mdi_car_light_fog: \"\\uFC27\"\n    readonly property string mdi_car_light_high: \"\\uFC28\"\n    readonly property string mdi_car_limousine: \"\\uF8CC\"\n    readonly property string mdi_car_multiple: \"\\uFB4A\"\n    readonly property string mdi_car_parking_lights: \"\\uFD3F\"\n    readonly property string mdi_car_pickup: \"\\uF7A9\"\n    readonly property string mdi_car_side: \"\\uF7AA\"\n    readonly property string mdi_car_sports: \"\\uF7AB\"\n    readonly property string mdi_car_tire_alert: \"\\uFC29\"\n    readonly property string mdi_car_traction_control: \"\\uFD40\"\n    readonly property string mdi_car_wash: \"\\uF10E\"\n    readonly property string mdi_caravan: \"\\uF7AC\"\n    readonly property string mdi_card: \"\\uFB4B\"\n    readonly property string mdi_card_bulleted: \"\\uFB4C\"\n    readonly property string mdi_card_bulleted_off: \"\\uFB4D\"\n    readonly property string mdi_card_bulleted_off_outline: \"\\uFB4E\"\n    readonly property string mdi_card_bulleted_outline: \"\\uFB4F\"\n    readonly property string mdi_card_bulleted_settings: \"\\uFB50\"\n    readonly property string mdi_card_bulleted_settings_outline: \"\\uFB51\"\n    readonly property string mdi_card_outline: \"\\uFB52\"\n    readonly property string mdi_card_text: \"\\uFB53\"\n    readonly property string mdi_card_text_outline: \"\\uFB54\"\n    readonly property string mdi_cards: \"\\uF638\"\n    readonly property string mdi_cards_club: \"\\uF8CD\"\n    readonly property string mdi_cards_diamond: \"\\uF8CE\"\n    readonly property string mdi_cards_heart: \"\\uF8CF\"\n    readonly property string mdi_cards_outline: \"\\uF639\"\n    readonly property string mdi_cards_playing_outline: \"\\uF63A\"\n    readonly property string mdi_cards_spade: \"\\uF8D0\"\n    readonly property string mdi_cards_variant: \"\\uF6C6\"\n    readonly property string mdi_carrot: \"\\uF10F\"\n    readonly property string mdi_carry_on_bag_check: \"\\uFD41\"\n    readonly property string mdi_cart: \"\\uF110\"\n    readonly property string mdi_cart_arrow_down: \"\\uFD42\"\n    readonly property string mdi_cart_arrow_right: \"\\uFC2A\"\n    readonly property string mdi_cart_arrow_up: \"\\uFD43\"\n    readonly property string mdi_cart_minus: \"\\uFD44\"\n    readonly property string mdi_cart_off: \"\\uF66B\"\n    readonly property string mdi_cart_outline: \"\\uF111\"\n    readonly property string mdi_cart_plus: \"\\uF112\"\n    readonly property string mdi_cart_remove: \"\\uFD45\"\n    readonly property string mdi_case_sensitive_alt: \"\\uF113\"\n    readonly property string mdi_cash: \"\\uF114\"\n    readonly property string mdi_cash_100: \"\\uF115\"\n    readonly property string mdi_cash_marker: \"\\uFD94\"\n    readonly property string mdi_cash_multiple: \"\\uF116\"\n    readonly property string mdi_cash_refund: \"\\uFA9B\"\n    readonly property string mdi_cash_register: \"\\uFCD0\"\n    readonly property string mdi_cash_usd: \"\\uF117\"\n    readonly property string mdi_cassette: \"\\uF9D3\"\n    readonly property string mdi_cast: \"\\uF118\"\n    readonly property string mdi_cast_connected: \"\\uF119\"\n    readonly property string mdi_cast_off: \"\\uF789\"\n    readonly property string mdi_castle: \"\\uF11A\"\n    readonly property string mdi_cat: \"\\uF11B\"\n    readonly property string mdi_cctv: \"\\uF7AD\"\n    readonly property string mdi_ceiling_light: \"\\uF768\"\n    readonly property string mdi_cellphone: \"\\uF11C\"\n    readonly property string mdi_cellphone_android: \"\\uF11D\"\n    readonly property string mdi_cellphone_arrow_down: \"\\uF9D4\"\n    readonly property string mdi_cellphone_basic: \"\\uF11E\"\n    readonly property string mdi_cellphone_dock: \"\\uF11F\"\n    readonly property string mdi_cellphone_erase: \"\\uF94C\"\n    readonly property string mdi_cellphone_iphone: \"\\uF120\"\n    readonly property string mdi_cellphone_key: \"\\uF94D\"\n    readonly property string mdi_cellphone_link: \"\\uF121\"\n    readonly property string mdi_cellphone_link_off: \"\\uF122\"\n    readonly property string mdi_cellphone_lock: \"\\uF94E\"\n    readonly property string mdi_cellphone_message: \"\\uF8D2\"\n    readonly property string mdi_cellphone_off: \"\\uF94F\"\n    readonly property string mdi_cellphone_screenshot: \"\\uFA34\"\n    readonly property string mdi_cellphone_settings: \"\\uF123\"\n    readonly property string mdi_cellphone_settings_variant: \"\\uF950\"\n    readonly property string mdi_cellphone_sound: \"\\uF951\"\n    readonly property string mdi_cellphone_text: \"\\uF8D1\"\n    readonly property string mdi_cellphone_wireless: \"\\uF814\"\n    readonly property string mdi_celtic_cross: \"\\uFCD1\"\n    readonly property string mdi_certificate: \"\\uF124\"\n    readonly property string mdi_chair_school: \"\\uF125\"\n    readonly property string mdi_charity: \"\\uFC2B\"\n    readonly property string mdi_chart_arc: \"\\uF126\"\n    readonly property string mdi_chart_areaspline: \"\\uF127\"\n    readonly property string mdi_chart_bar: \"\\uF128\"\n    readonly property string mdi_chart_bar_stacked: \"\\uF769\"\n    readonly property string mdi_chart_bell_curve: \"\\uFC2C\"\n    readonly property string mdi_chart_bubble: \"\\uF5E3\"\n    readonly property string mdi_chart_donut: \"\\uF7AE\"\n    readonly property string mdi_chart_donut_variant: \"\\uF7AF\"\n    readonly property string mdi_chart_gantt: \"\\uF66C\"\n    readonly property string mdi_chart_histogram: \"\\uF129\"\n    readonly property string mdi_chart_line: \"\\uF12A\"\n    readonly property string mdi_chart_line_stacked: \"\\uF76A\"\n    readonly property string mdi_chart_line_variant: \"\\uF7B0\"\n    readonly property string mdi_chart_multiline: \"\\uF8D3\"\n    readonly property string mdi_chart_pie: \"\\uF12B\"\n    readonly property string mdi_chart_scatterplot_hexbin: \"\\uF66D\"\n    readonly property string mdi_chart_timeline: \"\\uF66E\"\n    readonly property string mdi_chat: \"\\uFB55\"\n    readonly property string mdi_chat_alert: \"\\uFB56\"\n    readonly property string mdi_chat_processing: \"\\uFB57\"\n    readonly property string mdi_check: \"\\uF12C\"\n    readonly property string mdi_check_all: \"\\uF12D\"\n    readonly property string mdi_check_box_multiple_outline: \"\\uFC2D\"\n    readonly property string mdi_check_box_outline: \"\\uFC2E\"\n    readonly property string mdi_check_circle: \"\\uF5E0\"\n    readonly property string mdi_check_circle_outline: \"\\uF5E1\"\n    readonly property string mdi_check_decagram: \"\\uF790\"\n    readonly property string mdi_check_network: \"\\uFC2F\"\n    readonly property string mdi_check_network_outline: \"\\uFC30\"\n    readonly property string mdi_check_outline: \"\\uF854\"\n    readonly property string mdi_checkbook: \"\\uFA9C\"\n    readonly property string mdi_checkbox_blank: \"\\uF12E\"\n    readonly property string mdi_checkbox_blank_circle: \"\\uF12F\"\n    readonly property string mdi_checkbox_blank_circle_outline: \"\\uF130\"\n    readonly property string mdi_checkbox_blank_outline: \"\\uF131\"\n    readonly property string mdi_checkbox_intermediate: \"\\uF855\"\n    readonly property string mdi_checkbox_marked: \"\\uF132\"\n    readonly property string mdi_checkbox_marked_circle: \"\\uF133\"\n    readonly property string mdi_checkbox_marked_circle_outline: \"\\uF134\"\n    readonly property string mdi_checkbox_marked_outline: \"\\uF135\"\n    readonly property string mdi_checkbox_multiple_blank: \"\\uF136\"\n    readonly property string mdi_checkbox_multiple_blank_circle: \"\\uF63B\"\n    readonly property string mdi_checkbox_multiple_blank_circle_outline: \"\\uF63C\"\n    readonly property string mdi_checkbox_multiple_blank_outline: \"\\uF137\"\n    readonly property string mdi_checkbox_multiple_marked: \"\\uF138\"\n    readonly property string mdi_checkbox_multiple_marked_circle: \"\\uF63D\"\n    readonly property string mdi_checkbox_multiple_marked_circle_outline: \"\\uF63E\"\n    readonly property string mdi_checkbox_multiple_marked_outline: \"\\uF139\"\n    readonly property string mdi_checkerboard: \"\\uF13A\"\n    readonly property string mdi_chef_hat: \"\\uFB58\"\n    readonly property string mdi_chemical_weapon: \"\\uF13B\"\n    readonly property string mdi_chess_bishop: \"\\uF85B\"\n    readonly property string mdi_chess_king: \"\\uF856\"\n    readonly property string mdi_chess_knight: \"\\uF857\"\n    readonly property string mdi_chess_pawn: \"\\uF858\"\n    readonly property string mdi_chess_queen: \"\\uF859\"\n    readonly property string mdi_chess_rook: \"\\uF85A\"\n    readonly property string mdi_chevron_double_down: \"\\uF13C\"\n    readonly property string mdi_chevron_double_left: \"\\uF13D\"\n    readonly property string mdi_chevron_double_right: \"\\uF13E\"\n    readonly property string mdi_chevron_double_up: \"\\uF13F\"\n    readonly property string mdi_chevron_down: \"\\uF140\"\n    readonly property string mdi_chevron_down_box: \"\\uF9D5\"\n    readonly property string mdi_chevron_down_box_outline: \"\\uF9D6\"\n    readonly property string mdi_chevron_down_circle: \"\\uFB0B\"\n    readonly property string mdi_chevron_down_circle_outline: \"\\uFB0C\"\n    readonly property string mdi_chevron_left: \"\\uF141\"\n    readonly property string mdi_chevron_left_box: \"\\uF9D7\"\n    readonly property string mdi_chevron_left_box_outline: \"\\uF9D8\"\n    readonly property string mdi_chevron_left_circle: \"\\uFB0D\"\n    readonly property string mdi_chevron_left_circle_outline: \"\\uFB0E\"\n    readonly property string mdi_chevron_right: \"\\uF142\"\n    readonly property string mdi_chevron_right_box: \"\\uF9D9\"\n    readonly property string mdi_chevron_right_box_outline: \"\\uF9DA\"\n    readonly property string mdi_chevron_right_circle: \"\\uFB0F\"\n    readonly property string mdi_chevron_right_circle_outline: \"\\uFB10\"\n    readonly property string mdi_chevron_triple_down: \"\\uFD95\"\n    readonly property string mdi_chevron_triple_left: \"\\uFD96\"\n    readonly property string mdi_chevron_triple_right: \"\\uFD97\"\n    readonly property string mdi_chevron_triple_up: \"\\uFD98\"\n    readonly property string mdi_chevron_up: \"\\uF143\"\n    readonly property string mdi_chevron_up_box: \"\\uF9DB\"\n    readonly property string mdi_chevron_up_box_outline: \"\\uF9DC\"\n    readonly property string mdi_chevron_up_circle: \"\\uFB11\"\n    readonly property string mdi_chevron_up_circle_outline: \"\\uFB12\"\n    readonly property string mdi_chili_hot: \"\\uF7B1\"\n    readonly property string mdi_chili_medium: \"\\uF7B2\"\n    readonly property string mdi_chili_mild: \"\\uF7B3\"\n    readonly property string mdi_chip: \"\\uF61A\"\n    readonly property string mdi_christianity: \"\\uF952\"\n    readonly property string mdi_christianity_outline: \"\\uFCD2\"\n    readonly property string mdi_church: \"\\uF144\"\n    readonly property string mdi_circle: \"\\uF764\"\n    readonly property string mdi_circle_edit_outline: \"\\uF8D4\"\n    readonly property string mdi_circle_medium: \"\\uF9DD\"\n    readonly property string mdi_circle_outline: \"\\uF765\"\n    readonly property string mdi_circle_slice_1: \"\\uFA9D\"\n    readonly property string mdi_circle_slice_2: \"\\uFA9E\"\n    readonly property string mdi_circle_slice_3: \"\\uFA9F\"\n    readonly property string mdi_circle_slice_4: \"\\uFAA0\"\n    readonly property string mdi_circle_slice_5: \"\\uFAA1\"\n    readonly property string mdi_circle_slice_6: \"\\uFAA2\"\n    readonly property string mdi_circle_slice_7: \"\\uFAA3\"\n    readonly property string mdi_circle_slice_8: \"\\uFAA4\"\n    readonly property string mdi_circle_small: \"\\uF9DE\"\n    readonly property string mdi_cisco_webex: \"\\uF145\"\n    readonly property string mdi_city: \"\\uF146\"\n    readonly property string mdi_city_variant: \"\\uFA35\"\n    readonly property string mdi_city_variant_outline: \"\\uFA36\"\n    readonly property string mdi_clipboard: \"\\uF147\"\n    readonly property string mdi_clipboard_account: \"\\uF148\"\n    readonly property string mdi_clipboard_account_outline: \"\\uFC31\"\n    readonly property string mdi_clipboard_alert: \"\\uF149\"\n    readonly property string mdi_clipboard_alert_outline: \"\\uFCD3\"\n    readonly property string mdi_clipboard_arrow_down: \"\\uF14A\"\n    readonly property string mdi_clipboard_arrow_down_outline: \"\\uFC32\"\n    readonly property string mdi_clipboard_arrow_left: \"\\uF14B\"\n    readonly property string mdi_clipboard_arrow_left_outline: \"\\uFCD4\"\n    readonly property string mdi_clipboard_arrow_right: \"\\uFCD5\"\n    readonly property string mdi_clipboard_arrow_right_outline: \"\\uFCD6\"\n    readonly property string mdi_clipboard_arrow_up: \"\\uFC33\"\n    readonly property string mdi_clipboard_arrow_up_outline: \"\\uFC34\"\n    readonly property string mdi_clipboard_check: \"\\uF14C\"\n    readonly property string mdi_clipboard_check_outline: \"\\uF8A7\"\n    readonly property string mdi_clipboard_flow: \"\\uF6C7\"\n    readonly property string mdi_clipboard_outline: \"\\uF14D\"\n    readonly property string mdi_clipboard_play: \"\\uFC35\"\n    readonly property string mdi_clipboard_play_outline: \"\\uFC36\"\n    readonly property string mdi_clipboard_plus: \"\\uF750\"\n    readonly property string mdi_clipboard_pulse: \"\\uF85C\"\n    readonly property string mdi_clipboard_pulse_outline: \"\\uF85D\"\n    readonly property string mdi_clipboard_text: \"\\uF14E\"\n    readonly property string mdi_clipboard_text_outline: \"\\uFA37\"\n    readonly property string mdi_clipboard_text_play: \"\\uFC37\"\n    readonly property string mdi_clipboard_text_play_outline: \"\\uFC38\"\n    readonly property string mdi_clippy: \"\\uF14F\"\n    readonly property string mdi_clock: \"\\uF953\"\n    readonly property string mdi_clock_alert: \"\\uF954\"\n    readonly property string mdi_clock_alert_outline: \"\\uF5CE\"\n    readonly property string mdi_clock_end: \"\\uF151\"\n    readonly property string mdi_clock_fast: \"\\uF152\"\n    readonly property string mdi_clock_in: \"\\uF153\"\n    readonly property string mdi_clock_out: \"\\uF154\"\n    readonly property string mdi_clock_outline: \"\\uF150\"\n    readonly property string mdi_clock_start: \"\\uF155\"\n    readonly property string mdi_close: \"\\uF156\"\n    readonly property string mdi_close_box: \"\\uF157\"\n    readonly property string mdi_close_box_multiple: \"\\uFC39\"\n    readonly property string mdi_close_box_multiple_outline: \"\\uFC3A\"\n    readonly property string mdi_close_box_outline: \"\\uF158\"\n    readonly property string mdi_close_circle: \"\\uF159\"\n    readonly property string mdi_close_circle_outline: \"\\uF15A\"\n    readonly property string mdi_close_network: \"\\uF15B\"\n    readonly property string mdi_close_network_outline: \"\\uFC3B\"\n    readonly property string mdi_close_octagon: \"\\uF15C\"\n    readonly property string mdi_close_octagon_outline: \"\\uF15D\"\n    readonly property string mdi_close_outline: \"\\uF6C8\"\n    readonly property string mdi_closed_caption: \"\\uF15E\"\n    readonly property string mdi_closed_caption_outline: \"\\uFD99\"\n    readonly property string mdi_cloud: \"\\uF15F\"\n    readonly property string mdi_cloud_alert: \"\\uF9DF\"\n    readonly property string mdi_cloud_braces: \"\\uF7B4\"\n    readonly property string mdi_cloud_check: \"\\uF160\"\n    readonly property string mdi_cloud_circle: \"\\uF161\"\n    readonly property string mdi_cloud_download: \"\\uF162\"\n    readonly property string mdi_cloud_download_outline: \"\\uFB59\"\n    readonly property string mdi_cloud_off_outline: \"\\uF164\"\n    readonly property string mdi_cloud_outline: \"\\uF163\"\n    readonly property string mdi_cloud_print: \"\\uF165\"\n    readonly property string mdi_cloud_print_outline: \"\\uF166\"\n    readonly property string mdi_cloud_question: \"\\uFA38\"\n    readonly property string mdi_cloud_search: \"\\uF955\"\n    readonly property string mdi_cloud_search_outline: \"\\uF956\"\n    readonly property string mdi_cloud_sync: \"\\uF63F\"\n    readonly property string mdi_cloud_tags: \"\\uF7B5\"\n    readonly property string mdi_cloud_upload: \"\\uF167\"\n    readonly property string mdi_cloud_upload_outline: \"\\uFB5A\"\n    readonly property string mdi_clover: \"\\uF815\"\n    readonly property string mdi_code_array: \"\\uF168\"\n    readonly property string mdi_code_braces: \"\\uF169\"\n    readonly property string mdi_code_brackets: \"\\uF16A\"\n    readonly property string mdi_code_equal: \"\\uF16B\"\n    readonly property string mdi_code_greater_than: \"\\uF16C\"\n    readonly property string mdi_code_greater_than_or_equal: \"\\uF16D\"\n    readonly property string mdi_code_less_than: \"\\uF16E\"\n    readonly property string mdi_code_less_than_or_equal: \"\\uF16F\"\n    readonly property string mdi_code_not_equal: \"\\uF170\"\n    readonly property string mdi_code_not_equal_variant: \"\\uF171\"\n    readonly property string mdi_code_parentheses: \"\\uF172\"\n    readonly property string mdi_code_string: \"\\uF173\"\n    readonly property string mdi_code_tags: \"\\uF174\"\n    readonly property string mdi_code_tags_check: \"\\uF693\"\n    readonly property string mdi_codepen: \"\\uF175\"\n    readonly property string mdi_coffee: \"\\uF176\"\n    readonly property string mdi_coffee_outline: \"\\uF6C9\"\n    readonly property string mdi_coffee_to_go: \"\\uF177\"\n    readonly property string mdi_coffin: \"\\uFB5B\"\n    readonly property string mdi_cogs: \"\\uF8D5\"\n    readonly property string mdi_coin: \"\\uF178\"\n    readonly property string mdi_coins: \"\\uF694\"\n    readonly property string mdi_collage: \"\\uF640\"\n    readonly property string mdi_collapse_all: \"\\uFAA5\"\n    readonly property string mdi_collapse_all_outline: \"\\uFAA6\"\n    readonly property string mdi_color_helper: \"\\uF179\"\n    readonly property string mdi_comment: \"\\uF17A\"\n    readonly property string mdi_comment_account: \"\\uF17B\"\n    readonly property string mdi_comment_account_outline: \"\\uF17C\"\n    readonly property string mdi_comment_alert: \"\\uF17D\"\n    readonly property string mdi_comment_alert_outline: \"\\uF17E\"\n    readonly property string mdi_comment_arrow_left: \"\\uF9E0\"\n    readonly property string mdi_comment_arrow_left_outline: \"\\uF9E1\"\n    readonly property string mdi_comment_arrow_right: \"\\uF9E2\"\n    readonly property string mdi_comment_arrow_right_outline: \"\\uF9E3\"\n    readonly property string mdi_comment_check: \"\\uF17F\"\n    readonly property string mdi_comment_check_outline: \"\\uF180\"\n    readonly property string mdi_comment_eye: \"\\uFA39\"\n    readonly property string mdi_comment_eye_outline: \"\\uFA3A\"\n    readonly property string mdi_comment_multiple: \"\\uF85E\"\n    readonly property string mdi_comment_multiple_outline: \"\\uF181\"\n    readonly property string mdi_comment_outline: \"\\uF182\"\n    readonly property string mdi_comment_plus: \"\\uF9E4\"\n    readonly property string mdi_comment_plus_outline: \"\\uF183\"\n    readonly property string mdi_comment_processing: \"\\uF184\"\n    readonly property string mdi_comment_processing_outline: \"\\uF185\"\n    readonly property string mdi_comment_question: \"\\uF816\"\n    readonly property string mdi_comment_question_outline: \"\\uF186\"\n    readonly property string mdi_comment_remove: \"\\uF5DE\"\n    readonly property string mdi_comment_remove_outline: \"\\uF187\"\n    readonly property string mdi_comment_search: \"\\uFA3B\"\n    readonly property string mdi_comment_search_outline: \"\\uFA3C\"\n    readonly property string mdi_comment_text: \"\\uF188\"\n    readonly property string mdi_comment_text_multiple: \"\\uF85F\"\n    readonly property string mdi_comment_text_multiple_outline: \"\\uF860\"\n    readonly property string mdi_comment_text_outline: \"\\uF189\"\n    readonly property string mdi_compare: \"\\uF18A\"\n    readonly property string mdi_compass: \"\\uF18B\"\n    readonly property string mdi_compass_off: \"\\uFB5C\"\n    readonly property string mdi_compass_off_outline: \"\\uFB5D\"\n    readonly property string mdi_compass_outline: \"\\uF18C\"\n    readonly property string mdi_console: \"\\uF18D\"\n    readonly property string mdi_console_line: \"\\uF7B6\"\n    readonly property string mdi_console_network: \"\\uF8A8\"\n    readonly property string mdi_console_network_outline: \"\\uFC3C\"\n    readonly property string mdi_contact_mail: \"\\uF18E\"\n    readonly property string mdi_contactless_payment: \"\\uFD46\"\n    readonly property string mdi_contacts: \"\\uF6CA\"\n    readonly property string mdi_contain: \"\\uFA3D\"\n    readonly property string mdi_contain_end: \"\\uFA3E\"\n    readonly property string mdi_contain_start: \"\\uFA3F\"\n    readonly property string mdi_content_copy: \"\\uF18F\"\n    readonly property string mdi_content_cut: \"\\uF190\"\n    readonly property string mdi_content_duplicate: \"\\uF191\"\n    readonly property string mdi_content_paste: \"\\uF192\"\n    readonly property string mdi_content_save: \"\\uF193\"\n    readonly property string mdi_content_save_all: \"\\uF194\"\n    readonly property string mdi_content_save_edit: \"\\uFCD7\"\n    readonly property string mdi_content_save_edit_outline: \"\\uFCD8\"\n    readonly property string mdi_content_save_outline: \"\\uF817\"\n    readonly property string mdi_content_save_settings: \"\\uF61B\"\n    readonly property string mdi_content_save_settings_outline: \"\\uFB13\"\n    readonly property string mdi_contrast: \"\\uF195\"\n    readonly property string mdi_contrast_box: \"\\uF196\"\n    readonly property string mdi_contrast_circle: \"\\uF197\"\n    readonly property string mdi_controller_classic: \"\\uFB5E\"\n    readonly property string mdi_controller_classic_outline: \"\\uFB5F\"\n    readonly property string mdi_cookie: \"\\uF198\"\n    readonly property string mdi_copyright: \"\\uF5E6\"\n    readonly property string mdi_cordova: \"\\uF957\"\n    readonly property string mdi_corn: \"\\uF7B7\"\n    readonly property string mdi_counter: \"\\uF199\"\n    readonly property string mdi_cow: \"\\uF19A\"\n    readonly property string mdi_crane: \"\\uF861\"\n    readonly property string mdi_creation: \"\\uF1C9\"\n    readonly property string mdi_creative_commons: \"\\uFD47\"\n    readonly property string mdi_credit_card: \"\\uF19B\"\n    readonly property string mdi_credit_card_marker: \"\\uFD9A\"\n    readonly property string mdi_credit_card_multiple: \"\\uF19C\"\n    readonly property string mdi_credit_card_off: \"\\uF5E4\"\n    readonly property string mdi_credit_card_plus: \"\\uF675\"\n    readonly property string mdi_credit_card_refund: \"\\uFAA7\"\n    readonly property string mdi_credit_card_scan: \"\\uF19D\"\n    readonly property string mdi_credit_card_settings: \"\\uF8D6\"\n    readonly property string mdi_credit_card_wireless: \"\\uFD48\"\n    readonly property string mdi_cricket: \"\\uFD49\"\n    readonly property string mdi_crop: \"\\uF19E\"\n    readonly property string mdi_crop_free: \"\\uF19F\"\n    readonly property string mdi_crop_landscape: \"\\uF1A0\"\n    readonly property string mdi_crop_portrait: \"\\uF1A1\"\n    readonly property string mdi_crop_rotate: \"\\uF695\"\n    readonly property string mdi_crop_square: \"\\uF1A2\"\n    readonly property string mdi_crosshairs: \"\\uF1A3\"\n    readonly property string mdi_crosshairs_gps: \"\\uF1A4\"\n    readonly property string mdi_crown: \"\\uF1A5\"\n    readonly property string mdi_cryengine: \"\\uF958\"\n    readonly property string mdi_crystal_ball: \"\\uFB14\"\n    readonly property string mdi_cube: \"\\uF1A6\"\n    readonly property string mdi_cube_outline: \"\\uF1A7\"\n    readonly property string mdi_cube_scan: \"\\uFB60\"\n    readonly property string mdi_cube_send: \"\\uF1A8\"\n    readonly property string mdi_cube_unfolded: \"\\uF1A9\"\n    readonly property string mdi_cup: \"\\uF1AA\"\n    readonly property string mdi_cup_off: \"\\uF5E5\"\n    readonly property string mdi_cup_water: \"\\uF1AB\"\n    readonly property string mdi_cupcake: \"\\uF959\"\n    readonly property string mdi_curling: \"\\uF862\"\n    readonly property string mdi_currency_bdt: \"\\uF863\"\n    readonly property string mdi_currency_brl: \"\\uFB61\"\n    readonly property string mdi_currency_btc: \"\\uF1AC\"\n    readonly property string mdi_currency_chf: \"\\uF7B8\"\n    readonly property string mdi_currency_cny: \"\\uF7B9\"\n    readonly property string mdi_currency_eth: \"\\uF7BA\"\n    readonly property string mdi_currency_eur: \"\\uF1AD\"\n    readonly property string mdi_currency_gbp: \"\\uF1AE\"\n    readonly property string mdi_currency_ils: \"\\uFC3D\"\n    readonly property string mdi_currency_inr: \"\\uF1AF\"\n    readonly property string mdi_currency_jpy: \"\\uF7BB\"\n    readonly property string mdi_currency_krw: \"\\uF7BC\"\n    readonly property string mdi_currency_kzt: \"\\uF864\"\n    readonly property string mdi_currency_ngn: \"\\uF1B0\"\n    readonly property string mdi_currency_php: \"\\uF9E5\"\n    readonly property string mdi_currency_rub: \"\\uF1B1\"\n    readonly property string mdi_currency_sign: \"\\uF7BD\"\n    readonly property string mdi_currency_try: \"\\uF1B2\"\n    readonly property string mdi_currency_twd: \"\\uF7BE\"\n    readonly property string mdi_currency_usd: \"\\uF1B3\"\n    readonly property string mdi_currency_usd_off: \"\\uF679\"\n    readonly property string mdi_current_ac: \"\\uF95A\"\n    readonly property string mdi_current_dc: \"\\uF95B\"\n    readonly property string mdi_cursor_default: \"\\uF1B4\"\n    readonly property string mdi_cursor_default_click: \"\\uFCD9\"\n    readonly property string mdi_cursor_default_click_outline: \"\\uFCDA\"\n    readonly property string mdi_cursor_default_outline: \"\\uF1B5\"\n    readonly property string mdi_cursor_move: \"\\uF1B6\"\n    readonly property string mdi_cursor_pointer: \"\\uF1B7\"\n    readonly property string mdi_cursor_text: \"\\uF5E7\"\n    readonly property string mdi_database: \"\\uF1B8\"\n    readonly property string mdi_database_check: \"\\uFAA8\"\n    readonly property string mdi_database_edit: \"\\uFB62\"\n    readonly property string mdi_database_export: \"\\uF95D\"\n    readonly property string mdi_database_import: \"\\uF95C\"\n    readonly property string mdi_database_lock: \"\\uFAA9\"\n    readonly property string mdi_database_minus: \"\\uF1B9\"\n    readonly property string mdi_database_plus: \"\\uF1BA\"\n    readonly property string mdi_database_refresh: \"\\uFCDB\"\n    readonly property string mdi_database_remove: \"\\uFCDC\"\n    readonly property string mdi_database_search: \"\\uF865\"\n    readonly property string mdi_database_settings: \"\\uFCDD\"\n    readonly property string mdi_death_star: \"\\uF8D7\"\n    readonly property string mdi_death_star_variant: \"\\uF8D8\"\n    readonly property string mdi_deathly_hallows: \"\\uFB63\"\n    readonly property string mdi_debian: \"\\uF8D9\"\n    readonly property string mdi_debug_step_into: \"\\uF1BB\"\n    readonly property string mdi_debug_step_out: \"\\uF1BC\"\n    readonly property string mdi_debug_step_over: \"\\uF1BD\"\n    readonly property string mdi_decagram: \"\\uF76B\"\n    readonly property string mdi_decagram_outline: \"\\uF76C\"\n    readonly property string mdi_decimal_decrease: \"\\uF1BE\"\n    readonly property string mdi_decimal_increase: \"\\uF1BF\"\n    readonly property string mdi_delete: \"\\uF1C0\"\n    readonly property string mdi_delete_circle: \"\\uF682\"\n    readonly property string mdi_delete_circle_outline: \"\\uFB64\"\n    readonly property string mdi_delete_empty: \"\\uF6CB\"\n    readonly property string mdi_delete_forever: \"\\uF5E8\"\n    readonly property string mdi_delete_forever_outline: \"\\uFB65\"\n    readonly property string mdi_delete_outline: \"\\uF9E6\"\n    readonly property string mdi_delete_restore: \"\\uF818\"\n    readonly property string mdi_delete_sweep: \"\\uF5E9\"\n    readonly property string mdi_delete_sweep_outline: \"\\uFC3E\"\n    readonly property string mdi_delete_variant: \"\\uF1C1\"\n    readonly property string mdi_delta: \"\\uF1C2\"\n    readonly property string mdi_desk_lamp: \"\\uF95E\"\n    readonly property string mdi_deskphone: \"\\uF1C3\"\n    readonly property string mdi_desktop_classic: \"\\uF7BF\"\n    readonly property string mdi_desktop_mac: \"\\uF1C4\"\n    readonly property string mdi_desktop_mac_dashboard: \"\\uF9E7\"\n    readonly property string mdi_desktop_tower: \"\\uF1C5\"\n    readonly property string mdi_desktop_tower_monitor: \"\\uFAAA\"\n    readonly property string mdi_details: \"\\uF1C6\"\n    readonly property string mdi_dev_to: \"\\uFD4A\"\n    readonly property string mdi_developer_board: \"\\uF696\"\n    readonly property string mdi_deviantart: \"\\uF1C7\"\n    readonly property string mdi_dialpad: \"\\uF61C\"\n    readonly property string mdi_diameter: \"\\uFC3F\"\n    readonly property string mdi_diameter_outline: \"\\uFC40\"\n    readonly property string mdi_diameter_variant: \"\\uFC41\"\n    readonly property string mdi_diamond: \"\\uFB66\"\n    readonly property string mdi_diamond_outline: \"\\uFB67\"\n    readonly property string mdi_diamond_stone: \"\\uF1C8\"\n    readonly property string mdi_dice_1: \"\\uF1CA\"\n    readonly property string mdi_dice_2: \"\\uF1CB\"\n    readonly property string mdi_dice_3: \"\\uF1CC\"\n    readonly property string mdi_dice_4: \"\\uF1CD\"\n    readonly property string mdi_dice_5: \"\\uF1CE\"\n    readonly property string mdi_dice_6: \"\\uF1CF\"\n    readonly property string mdi_dice_d10: \"\\uF76E\"\n    readonly property string mdi_dice_d12: \"\\uF866\"\n    readonly property string mdi_dice_d20: \"\\uF5EA\"\n    readonly property string mdi_dice_d4: \"\\uF5EB\"\n    readonly property string mdi_dice_d6: \"\\uF5EC\"\n    readonly property string mdi_dice_d8: \"\\uF5ED\"\n    readonly property string mdi_dice_multiple: \"\\uF76D\"\n    readonly property string mdi_dictionary: \"\\uF61D\"\n    readonly property string mdi_dip_switch: \"\\uF7C0\"\n    readonly property string mdi_directions: \"\\uF1D0\"\n    readonly property string mdi_directions_fork: \"\\uF641\"\n    readonly property string mdi_disc: \"\\uF5EE\"\n    readonly property string mdi_disc_alert: \"\\uF1D1\"\n    readonly property string mdi_disc_player: \"\\uF95F\"\n    readonly property string mdi_discord: \"\\uF66F\"\n    readonly property string mdi_dishwasher: \"\\uFAAB\"\n    readonly property string mdi_disqus: \"\\uF1D2\"\n    readonly property string mdi_disqus_outline: \"\\uF1D3\"\n    readonly property string mdi_diving_flippers: \"\\uFD9B\"\n    readonly property string mdi_diving_helmet: \"\\uFD9C\"\n    readonly property string mdi_diving_scuba: \"\\uFD9D\"\n    readonly property string mdi_diving_scuba_flag: \"\\uFD9E\"\n    readonly property string mdi_diving_scuba_tank: \"\\uFD9F\"\n    readonly property string mdi_diving_scuba_tank_multiple: \"\\uFDA0\"\n    readonly property string mdi_diving_snorkel: \"\\uFDA1\"\n    readonly property string mdi_division: \"\\uF1D4\"\n    readonly property string mdi_division_box: \"\\uF1D5\"\n    readonly property string mdi_dlna: \"\\uFA40\"\n    readonly property string mdi_dna: \"\\uF683\"\n    readonly property string mdi_dns: \"\\uF1D6\"\n    readonly property string mdi_dns_outline: \"\\uFB68\"\n    readonly property string mdi_do_not_disturb: \"\\uF697\"\n    readonly property string mdi_do_not_disturb_off: \"\\uF698\"\n    readonly property string mdi_docker: \"\\uF867\"\n    readonly property string mdi_doctor: \"\\uFA41\"\n    readonly property string mdi_dog: \"\\uFA42\"\n    readonly property string mdi_dog_service: \"\\uFAAC\"\n    readonly property string mdi_dog_side: \"\\uFA43\"\n    readonly property string mdi_dolby: \"\\uF6B2\"\n    readonly property string mdi_domain: \"\\uF1D7\"\n    readonly property string mdi_domain_off: \"\\uFD4B\"\n    readonly property string mdi_donkey: \"\\uF7C1\"\n    readonly property string mdi_door: \"\\uF819\"\n    readonly property string mdi_door_closed: \"\\uF81A\"\n    readonly property string mdi_door_open: \"\\uF81B\"\n    readonly property string mdi_doorbell_video: \"\\uF868\"\n    readonly property string mdi_dot_net: \"\\uFAAD\"\n    readonly property string mdi_dots_horizontal: \"\\uF1D8\"\n    readonly property string mdi_dots_horizontal_circle: \"\\uF7C2\"\n    readonly property string mdi_dots_horizontal_circle_outline: \"\\uFB69\"\n    readonly property string mdi_dots_vertical: \"\\uF1D9\"\n    readonly property string mdi_dots_vertical_circle: \"\\uF7C3\"\n    readonly property string mdi_dots_vertical_circle_outline: \"\\uFB6A\"\n    readonly property string mdi_douban: \"\\uF699\"\n    readonly property string mdi_download: \"\\uF1DA\"\n    readonly property string mdi_download_multiple: \"\\uF9E8\"\n    readonly property string mdi_download_network: \"\\uF6F3\"\n    readonly property string mdi_download_network_outline: \"\\uFC42\"\n    readonly property string mdi_download_outline: \"\\uFB6B\"\n    readonly property string mdi_drag: \"\\uF1DB\"\n    readonly property string mdi_drag_horizontal: \"\\uF1DC\"\n    readonly property string mdi_drag_variant: \"\\uFB6C\"\n    readonly property string mdi_drag_vertical: \"\\uF1DD\"\n    readonly property string mdi_drama_masks: \"\\uFCDE\"\n    readonly property string mdi_drawing: \"\\uF1DE\"\n    readonly property string mdi_drawing_box: \"\\uF1DF\"\n    readonly property string mdi_dribbble: \"\\uF1E0\"\n    readonly property string mdi_dribbble_box: \"\\uF1E1\"\n    readonly property string mdi_drone: \"\\uF1E2\"\n    readonly property string mdi_dropbox: \"\\uF1E3\"\n    readonly property string mdi_drupal: \"\\uF1E4\"\n    readonly property string mdi_duck: \"\\uF1E5\"\n    readonly property string mdi_dumbbell: \"\\uF1E6\"\n    readonly property string mdi_dump_truck: \"\\uFC43\"\n    readonly property string mdi_ear_hearing: \"\\uF7C4\"\n    readonly property string mdi_ear_hearing_off: \"\\uFA44\"\n    readonly property string mdi_earth: \"\\uF1E7\"\n    readonly property string mdi_earth_box: \"\\uF6CC\"\n    readonly property string mdi_earth_box_off: \"\\uF6CD\"\n    readonly property string mdi_earth_off: \"\\uF1E8\"\n    readonly property string mdi_edge: \"\\uF1E9\"\n    readonly property string mdi_egg: \"\\uFAAE\"\n    readonly property string mdi_egg_easter: \"\\uFAAF\"\n    readonly property string mdi_eight_track: \"\\uF9E9\"\n    readonly property string mdi_eject: \"\\uF1EA\"\n    readonly property string mdi_eject_outline: \"\\uFB6D\"\n    readonly property string mdi_elephant: \"\\uF7C5\"\n    readonly property string mdi_elevation_decline: \"\\uF1EB\"\n    readonly property string mdi_elevation_rise: \"\\uF1EC\"\n    readonly property string mdi_elevator: \"\\uF1ED\"\n    readonly property string mdi_email: \"\\uF1EE\"\n    readonly property string mdi_email_alert: \"\\uF6CE\"\n    readonly property string mdi_email_box: \"\\uFCDF\"\n    readonly property string mdi_email_check: \"\\uFAB0\"\n    readonly property string mdi_email_check_outline: \"\\uFAB1\"\n    readonly property string mdi_email_lock: \"\\uF1F1\"\n    readonly property string mdi_email_mark_as_unread: \"\\uFB6E\"\n    readonly property string mdi_email_open: \"\\uF1EF\"\n    readonly property string mdi_email_open_outline: \"\\uF5EF\"\n    readonly property string mdi_email_outline: \"\\uF1F0\"\n    readonly property string mdi_email_plus: \"\\uF9EA\"\n    readonly property string mdi_email_plus_outline: \"\\uF9EB\"\n    readonly property string mdi_email_search: \"\\uF960\"\n    readonly property string mdi_email_search_outline: \"\\uF961\"\n    readonly property string mdi_email_variant: \"\\uF5F0\"\n    readonly property string mdi_ember: \"\\uFB15\"\n    readonly property string mdi_emby: \"\\uF6B3\"\n    readonly property string mdi_emoticon: \"\\uFC44\"\n    readonly property string mdi_emoticon_angry: \"\\uFC45\"\n    readonly property string mdi_emoticon_angry_outline: \"\\uFC46\"\n    readonly property string mdi_emoticon_cool: \"\\uFC47\"\n    readonly property string mdi_emoticon_cool_outline: \"\\uF1F3\"\n    readonly property string mdi_emoticon_cry: \"\\uFC48\"\n    readonly property string mdi_emoticon_cry_outline: \"\\uFC49\"\n    readonly property string mdi_emoticon_dead: \"\\uFC4A\"\n    readonly property string mdi_emoticon_dead_outline: \"\\uF69A\"\n    readonly property string mdi_emoticon_devil: \"\\uFC4B\"\n    readonly property string mdi_emoticon_devil_outline: \"\\uF1F4\"\n    readonly property string mdi_emoticon_excited: \"\\uFC4C\"\n    readonly property string mdi_emoticon_excited_outline: \"\\uF69B\"\n    readonly property string mdi_emoticon_happy: \"\\uFC4D\"\n    readonly property string mdi_emoticon_happy_outline: \"\\uF1F5\"\n    readonly property string mdi_emoticon_kiss: \"\\uFC4E\"\n    readonly property string mdi_emoticon_kiss_outline: \"\\uFC4F\"\n    readonly property string mdi_emoticon_neutral: \"\\uFC50\"\n    readonly property string mdi_emoticon_neutral_outline: \"\\uF1F6\"\n    readonly property string mdi_emoticon_outline: \"\\uF1F2\"\n    readonly property string mdi_emoticon_poop: \"\\uF1F7\"\n    readonly property string mdi_emoticon_poop_outline: \"\\uFC51\"\n    readonly property string mdi_emoticon_sad: \"\\uFC52\"\n    readonly property string mdi_emoticon_sad_outline: \"\\uF1F8\"\n    readonly property string mdi_emoticon_tongue: \"\\uF1F9\"\n    readonly property string mdi_emoticon_tongue_outline: \"\\uFC53\"\n    readonly property string mdi_emoticon_wink: \"\\uFC54\"\n    readonly property string mdi_emoticon_wink_outline: \"\\uFC55\"\n    readonly property string mdi_engine: \"\\uF1FA\"\n    readonly property string mdi_engine_off: \"\\uFA45\"\n    readonly property string mdi_engine_off_outline: \"\\uFA46\"\n    readonly property string mdi_engine_outline: \"\\uF1FB\"\n    readonly property string mdi_equal: \"\\uF1FC\"\n    readonly property string mdi_equal_box: \"\\uF1FD\"\n    readonly property string mdi_eraser: \"\\uF1FE\"\n    readonly property string mdi_eraser_variant: \"\\uF642\"\n    readonly property string mdi_escalator: \"\\uF1FF\"\n    readonly property string mdi_eslint: \"\\uFC56\"\n    readonly property string mdi_et: \"\\uFAB2\"\n    readonly property string mdi_ethereum: \"\\uF869\"\n    readonly property string mdi_ethernet: \"\\uF200\"\n    readonly property string mdi_ethernet_cable: \"\\uF201\"\n    readonly property string mdi_ethernet_cable_off: \"\\uF202\"\n    readonly property string mdi_etsy: \"\\uF203\"\n    readonly property string mdi_ev_station: \"\\uF5F1\"\n    readonly property string mdi_eventbrite: \"\\uF7C6\"\n    readonly property string mdi_evernote: \"\\uF204\"\n    readonly property string mdi_exclamation: \"\\uF205\"\n    readonly property string mdi_exit_run: \"\\uFA47\"\n    readonly property string mdi_exit_to_app: \"\\uF206\"\n    readonly property string mdi_expand_all: \"\\uFAB3\"\n    readonly property string mdi_expand_all_outline: \"\\uFAB4\"\n    readonly property string mdi_exponent: \"\\uF962\"\n    readonly property string mdi_exponent_box: \"\\uF963\"\n    readonly property string mdi_export: \"\\uF207\"\n    readonly property string mdi_export_variant: \"\\uFB6F\"\n    readonly property string mdi_eye: \"\\uF208\"\n    readonly property string mdi_eye_check: \"\\uFCE0\"\n    readonly property string mdi_eye_check_outline: \"\\uFCE1\"\n    readonly property string mdi_eye_circle: \"\\uFB70\"\n    readonly property string mdi_eye_circle_outline: \"\\uFB71\"\n    readonly property string mdi_eye_off: \"\\uF209\"\n    readonly property string mdi_eye_off_outline: \"\\uF6D0\"\n    readonly property string mdi_eye_outline: \"\\uF6CF\"\n    readonly property string mdi_eye_plus: \"\\uF86A\"\n    readonly property string mdi_eye_plus_outline: \"\\uF86B\"\n    readonly property string mdi_eye_settings: \"\\uF86C\"\n    readonly property string mdi_eye_settings_outline: \"\\uF86D\"\n    readonly property string mdi_eyedropper: \"\\uF20A\"\n    readonly property string mdi_eyedropper_variant: \"\\uF20B\"\n    readonly property string mdi_face: \"\\uF643\"\n    readonly property string mdi_face_agent: \"\\uFD4C\"\n    readonly property string mdi_face_outline: \"\\uFB72\"\n    readonly property string mdi_face_profile: \"\\uF644\"\n    readonly property string mdi_face_recognition: \"\\uFC57\"\n    readonly property string mdi_facebook: \"\\uF20C\"\n    readonly property string mdi_facebook_box: \"\\uF20D\"\n    readonly property string mdi_facebook_messenger: \"\\uF20E\"\n    readonly property string mdi_facebook_workplace: \"\\uFB16\"\n    readonly property string mdi_factory: \"\\uF20F\"\n    readonly property string mdi_fan: \"\\uF210\"\n    readonly property string mdi_fan_off: \"\\uF81C\"\n    readonly property string mdi_fast_forward: \"\\uF211\"\n    readonly property string mdi_fast_forward_10: \"\\uFD4D\"\n    readonly property string mdi_fast_forward_30: \"\\uFCE2\"\n    readonly property string mdi_fast_forward_outline: \"\\uF6D1\"\n    readonly property string mdi_fax: \"\\uF212\"\n    readonly property string mdi_feather: \"\\uF6D2\"\n    readonly property string mdi_feature_search: \"\\uFA48\"\n    readonly property string mdi_feature_search_outline: \"\\uFA49\"\n    readonly property string mdi_fedora: \"\\uF8DA\"\n    readonly property string mdi_ferry: \"\\uF213\"\n    readonly property string mdi_file: \"\\uF214\"\n    readonly property string mdi_file_account: \"\\uF73A\"\n    readonly property string mdi_file_alert: \"\\uFA4A\"\n    readonly property string mdi_file_alert_outline: \"\\uFA4B\"\n    readonly property string mdi_file_cabinet: \"\\uFAB5\"\n    readonly property string mdi_file_cancel: \"\\uFDA2\"\n    readonly property string mdi_file_cancel_outline: \"\\uFDA3\"\n    readonly property string mdi_file_chart: \"\\uF215\"\n    readonly property string mdi_file_check: \"\\uF216\"\n    readonly property string mdi_file_cloud: \"\\uF217\"\n    readonly property string mdi_file_compare: \"\\uF8A9\"\n    readonly property string mdi_file_delimited: \"\\uF218\"\n    readonly property string mdi_file_document: \"\\uF219\"\n    readonly property string mdi_file_document_box: \"\\uF21A\"\n    readonly property string mdi_file_document_box_multiple: \"\\uFAB6\"\n    readonly property string mdi_file_document_box_multiple_outline: \"\\uFAB7\"\n    readonly property string mdi_file_document_box_outline: \"\\uF9EC\"\n    readonly property string mdi_file_document_edit: \"\\uFDA4\"\n    readonly property string mdi_file_document_edit_outline: \"\\uFDA5\"\n    readonly property string mdi_file_document_outline: \"\\uF9ED\"\n    readonly property string mdi_file_download: \"\\uF964\"\n    readonly property string mdi_file_download_outline: \"\\uF965\"\n    readonly property string mdi_file_excel: \"\\uF21B\"\n    readonly property string mdi_file_excel_box: \"\\uF21C\"\n    readonly property string mdi_file_export: \"\\uF21D\"\n    readonly property string mdi_file_eye: \"\\uFDA6\"\n    readonly property string mdi_file_eye_outline: \"\\uFDA7\"\n    readonly property string mdi_file_find: \"\\uF21E\"\n    readonly property string mdi_file_find_outline: \"\\uFB73\"\n    readonly property string mdi_file_hidden: \"\\uF613\"\n    readonly property string mdi_file_image: \"\\uF21F\"\n    readonly property string mdi_file_import: \"\\uF220\"\n    readonly property string mdi_file_lock: \"\\uF221\"\n    readonly property string mdi_file_move: \"\\uFAB8\"\n    readonly property string mdi_file_multiple: \"\\uF222\"\n    readonly property string mdi_file_music: \"\\uF223\"\n    readonly property string mdi_file_outline: \"\\uF224\"\n    readonly property string mdi_file_pdf: \"\\uF225\"\n    readonly property string mdi_file_pdf_box: \"\\uF226\"\n    readonly property string mdi_file_percent: \"\\uF81D\"\n    readonly property string mdi_file_plus: \"\\uF751\"\n    readonly property string mdi_file_powerpoint: \"\\uF227\"\n    readonly property string mdi_file_powerpoint_box: \"\\uF228\"\n    readonly property string mdi_file_presentation_box: \"\\uF229\"\n    readonly property string mdi_file_question: \"\\uF86E\"\n    readonly property string mdi_file_remove: \"\\uFB74\"\n    readonly property string mdi_file_replace: \"\\uFB17\"\n    readonly property string mdi_file_replace_outline: \"\\uFB18\"\n    readonly property string mdi_file_restore: \"\\uF670\"\n    readonly property string mdi_file_search: \"\\uFC58\"\n    readonly property string mdi_file_search_outline: \"\\uFC59\"\n    readonly property string mdi_file_send: \"\\uF22A\"\n    readonly property string mdi_file_table: \"\\uFC5A\"\n    readonly property string mdi_file_table_outline: \"\\uFC5B\"\n    readonly property string mdi_file_tree: \"\\uF645\"\n    readonly property string mdi_file_undo: \"\\uF8DB\"\n    readonly property string mdi_file_upload: \"\\uFA4C\"\n    readonly property string mdi_file_upload_outline: \"\\uFA4D\"\n    readonly property string mdi_file_video: \"\\uF22B\"\n    readonly property string mdi_file_word: \"\\uF22C\"\n    readonly property string mdi_file_word_box: \"\\uF22D\"\n    readonly property string mdi_file_xml: \"\\uF22E\"\n    readonly property string mdi_film: \"\\uF22F\"\n    readonly property string mdi_filmstrip: \"\\uF230\"\n    readonly property string mdi_filmstrip_off: \"\\uF231\"\n    readonly property string mdi_filter: \"\\uF232\"\n    readonly property string mdi_filter_outline: \"\\uF233\"\n    readonly property string mdi_filter_remove: \"\\uF234\"\n    readonly property string mdi_filter_remove_outline: \"\\uF235\"\n    readonly property string mdi_filter_variant: \"\\uF236\"\n    readonly property string mdi_finance: \"\\uF81E\"\n    readonly property string mdi_find_replace: \"\\uF6D3\"\n    readonly property string mdi_fingerprint: \"\\uF237\"\n    readonly property string mdi_fire: \"\\uF238\"\n    readonly property string mdi_fire_truck: \"\\uF8AA\"\n    readonly property string mdi_firebase: \"\\uF966\"\n    readonly property string mdi_firefox: \"\\uF239\"\n    readonly property string mdi_fish: \"\\uF23A\"\n    readonly property string mdi_flag: \"\\uF23B\"\n    readonly property string mdi_flag_checkered: \"\\uF23C\"\n    readonly property string mdi_flag_minus: \"\\uFB75\"\n    readonly property string mdi_flag_outline: \"\\uF23D\"\n    readonly property string mdi_flag_plus: \"\\uFB76\"\n    readonly property string mdi_flag_remove: \"\\uFB77\"\n    readonly property string mdi_flag_triangle: \"\\uF23F\"\n    readonly property string mdi_flag_variant: \"\\uF240\"\n    readonly property string mdi_flag_variant_outline: \"\\uF23E\"\n    readonly property string mdi_flare: \"\\uFD4E\"\n    readonly property string mdi_flash: \"\\uF241\"\n    readonly property string mdi_flash_auto: \"\\uF242\"\n    readonly property string mdi_flash_circle: \"\\uF81F\"\n    readonly property string mdi_flash_off: \"\\uF243\"\n    readonly property string mdi_flash_outline: \"\\uF6D4\"\n    readonly property string mdi_flash_red_eye: \"\\uF67A\"\n    readonly property string mdi_flashlight: \"\\uF244\"\n    readonly property string mdi_flashlight_off: \"\\uF245\"\n    readonly property string mdi_flask: \"\\uF093\"\n    readonly property string mdi_flask_empty: \"\\uF094\"\n    readonly property string mdi_flask_empty_outline: \"\\uF095\"\n    readonly property string mdi_flask_outline: \"\\uF096\"\n    readonly property string mdi_flattr: \"\\uF246\"\n    readonly property string mdi_flickr: \"\\uFCE3\"\n    readonly property string mdi_flip_to_back: \"\\uF247\"\n    readonly property string mdi_flip_to_front: \"\\uF248\"\n    readonly property string mdi_floor_lamp: \"\\uF8DC\"\n    readonly property string mdi_floor_plan: \"\\uF820\"\n    readonly property string mdi_floppy: \"\\uF249\"\n    readonly property string mdi_floppy_variant: \"\\uF9EE\"\n    readonly property string mdi_flower: \"\\uF24A\"\n    readonly property string mdi_flower_outline: \"\\uF9EF\"\n    readonly property string mdi_flower_poppy: \"\\uFCE4\"\n    readonly property string mdi_flower_tulip: \"\\uF9F0\"\n    readonly property string mdi_flower_tulip_outline: \"\\uF9F1\"\n    readonly property string mdi_folder: \"\\uF24B\"\n    readonly property string mdi_folder_account: \"\\uF24C\"\n    readonly property string mdi_folder_account_outline: \"\\uFB78\"\n    readonly property string mdi_folder_alert: \"\\uFDA8\"\n    readonly property string mdi_folder_alert_outline: \"\\uFDA9\"\n    readonly property string mdi_folder_clock: \"\\uFAB9\"\n    readonly property string mdi_folder_clock_outline: \"\\uFABA\"\n    readonly property string mdi_folder_download: \"\\uF24D\"\n    readonly property string mdi_folder_edit: \"\\uF8DD\"\n    readonly property string mdi_folder_edit_outline: \"\\uFDAA\"\n    readonly property string mdi_folder_google_drive: \"\\uF24E\"\n    readonly property string mdi_folder_image: \"\\uF24F\"\n    readonly property string mdi_folder_key: \"\\uF8AB\"\n    readonly property string mdi_folder_key_network: \"\\uF8AC\"\n    readonly property string mdi_folder_key_network_outline: \"\\uFC5C\"\n    readonly property string mdi_folder_lock: \"\\uF250\"\n    readonly property string mdi_folder_lock_open: \"\\uF251\"\n    readonly property string mdi_folder_move: \"\\uF252\"\n    readonly property string mdi_folder_multiple: \"\\uF253\"\n    readonly property string mdi_folder_multiple_image: \"\\uF254\"\n    readonly property string mdi_folder_multiple_outline: \"\\uF255\"\n    readonly property string mdi_folder_network: \"\\uF86F\"\n    readonly property string mdi_folder_network_outline: \"\\uFC5D\"\n    readonly property string mdi_folder_open: \"\\uF76F\"\n    readonly property string mdi_folder_open_outline: \"\\uFDAB\"\n    readonly property string mdi_folder_outline: \"\\uF256\"\n    readonly property string mdi_folder_plus: \"\\uF257\"\n    readonly property string mdi_folder_plus_outline: \"\\uFB79\"\n    readonly property string mdi_folder_pound: \"\\uFCE5\"\n    readonly property string mdi_folder_pound_outline: \"\\uFCE6\"\n    readonly property string mdi_folder_remove: \"\\uF258\"\n    readonly property string mdi_folder_remove_outline: \"\\uFB7A\"\n    readonly property string mdi_folder_search: \"\\uF967\"\n    readonly property string mdi_folder_search_outline: \"\\uF968\"\n    readonly property string mdi_folder_star: \"\\uF69C\"\n    readonly property string mdi_folder_star_outline: \"\\uFB7B\"\n    readonly property string mdi_folder_sync: \"\\uFCE7\"\n    readonly property string mdi_folder_sync_outline: \"\\uFCE8\"\n    readonly property string mdi_folder_text: \"\\uFC5E\"\n    readonly property string mdi_folder_text_outline: \"\\uFC5F\"\n    readonly property string mdi_folder_upload: \"\\uF259\"\n    readonly property string mdi_font_awesome: \"\\uF03A\"\n    readonly property string mdi_food: \"\\uF25A\"\n    readonly property string mdi_food_apple: \"\\uF25B\"\n    readonly property string mdi_food_apple_outline: \"\\uFC60\"\n    readonly property string mdi_food_croissant: \"\\uF7C7\"\n    readonly property string mdi_food_fork_drink: \"\\uF5F2\"\n    readonly property string mdi_food_off: \"\\uF5F3\"\n    readonly property string mdi_food_variant: \"\\uF25C\"\n    readonly property string mdi_football: \"\\uF25D\"\n    readonly property string mdi_football_australian: \"\\uF25E\"\n    readonly property string mdi_football_helmet: \"\\uF25F\"\n    readonly property string mdi_forklift: \"\\uF7C8\"\n    readonly property string mdi_format_align_bottom: \"\\uF752\"\n    readonly property string mdi_format_align_center: \"\\uF260\"\n    readonly property string mdi_format_align_justify: \"\\uF261\"\n    readonly property string mdi_format_align_left: \"\\uF262\"\n    readonly property string mdi_format_align_middle: \"\\uF753\"\n    readonly property string mdi_format_align_right: \"\\uF263\"\n    readonly property string mdi_format_align_top: \"\\uF754\"\n    readonly property string mdi_format_annotation_minus: \"\\uFABB\"\n    readonly property string mdi_format_annotation_plus: \"\\uF646\"\n    readonly property string mdi_format_bold: \"\\uF264\"\n    readonly property string mdi_format_clear: \"\\uF265\"\n    readonly property string mdi_format_color_fill: \"\\uF266\"\n    readonly property string mdi_format_color_text: \"\\uF69D\"\n    readonly property string mdi_format_columns: \"\\uF8DE\"\n    readonly property string mdi_format_float_center: \"\\uF267\"\n    readonly property string mdi_format_float_left: \"\\uF268\"\n    readonly property string mdi_format_float_none: \"\\uF269\"\n    readonly property string mdi_format_float_right: \"\\uF26A\"\n    readonly property string mdi_format_font: \"\\uF6D5\"\n    readonly property string mdi_format_font_size_decrease: \"\\uF9F2\"\n    readonly property string mdi_format_font_size_increase: \"\\uF9F3\"\n    readonly property string mdi_format_header_1: \"\\uF26B\"\n    readonly property string mdi_format_header_2: \"\\uF26C\"\n    readonly property string mdi_format_header_3: \"\\uF26D\"\n    readonly property string mdi_format_header_4: \"\\uF26E\"\n    readonly property string mdi_format_header_5: \"\\uF26F\"\n    readonly property string mdi_format_header_6: \"\\uF270\"\n    readonly property string mdi_format_header_decrease: \"\\uF271\"\n    readonly property string mdi_format_header_equal: \"\\uF272\"\n    readonly property string mdi_format_header_increase: \"\\uF273\"\n    readonly property string mdi_format_header_pound: \"\\uF274\"\n    readonly property string mdi_format_horizontal_align_center: \"\\uF61E\"\n    readonly property string mdi_format_horizontal_align_left: \"\\uF61F\"\n    readonly property string mdi_format_horizontal_align_right: \"\\uF620\"\n    readonly property string mdi_format_indent_decrease: \"\\uF275\"\n    readonly property string mdi_format_indent_increase: \"\\uF276\"\n    readonly property string mdi_format_italic: \"\\uF277\"\n    readonly property string mdi_format_letter_case: \"\\uFB19\"\n    readonly property string mdi_format_letter_case_lower: \"\\uFB1A\"\n    readonly property string mdi_format_letter_case_upper: \"\\uFB1B\"\n    readonly property string mdi_format_line_spacing: \"\\uF278\"\n    readonly property string mdi_format_line_style: \"\\uF5C8\"\n    readonly property string mdi_format_line_weight: \"\\uF5C9\"\n    readonly property string mdi_format_list_bulleted: \"\\uF279\"\n    readonly property string mdi_format_list_bulleted_square: \"\\uFDAC\"\n    readonly property string mdi_format_list_bulleted_type: \"\\uF27A\"\n    readonly property string mdi_format_list_checkbox: \"\\uF969\"\n    readonly property string mdi_format_list_checks: \"\\uF755\"\n    readonly property string mdi_format_list_numbered: \"\\uF27B\"\n    readonly property string mdi_format_list_numbered_rtl: \"\\uFCE9\"\n    readonly property string mdi_format_page_break: \"\\uF6D6\"\n    readonly property string mdi_format_paint: \"\\uF27C\"\n    readonly property string mdi_format_paragraph: \"\\uF27D\"\n    readonly property string mdi_format_pilcrow: \"\\uF6D7\"\n    readonly property string mdi_format_quote_close: \"\\uF27E\"\n    readonly property string mdi_format_quote_open: \"\\uF756\"\n    readonly property string mdi_format_rotate_90: \"\\uF6A9\"\n    readonly property string mdi_format_section: \"\\uF69E\"\n    readonly property string mdi_format_size: \"\\uF27F\"\n    readonly property string mdi_format_strikethrough: \"\\uF280\"\n    readonly property string mdi_format_strikethrough_variant: \"\\uF281\"\n    readonly property string mdi_format_subscript: \"\\uF282\"\n    readonly property string mdi_format_superscript: \"\\uF283\"\n    readonly property string mdi_format_text: \"\\uF284\"\n    readonly property string mdi_format_text_rotation_down: \"\\uFD4F\"\n    readonly property string mdi_format_text_rotation_none: \"\\uFD50\"\n    readonly property string mdi_format_text_wrapping_clip: \"\\uFCEA\"\n    readonly property string mdi_format_text_wrapping_overflow: \"\\uFCEB\"\n    readonly property string mdi_format_text_wrapping_wrap: \"\\uFCEC\"\n    readonly property string mdi_format_textbox: \"\\uFCED\"\n    readonly property string mdi_format_textdirection_l_to_r: \"\\uF285\"\n    readonly property string mdi_format_textdirection_r_to_l: \"\\uF286\"\n    readonly property string mdi_format_title: \"\\uF5F4\"\n    readonly property string mdi_format_underline: \"\\uF287\"\n    readonly property string mdi_format_vertical_align_bottom: \"\\uF621\"\n    readonly property string mdi_format_vertical_align_center: \"\\uF622\"\n    readonly property string mdi_format_vertical_align_top: \"\\uF623\"\n    readonly property string mdi_format_wrap_inline: \"\\uF288\"\n    readonly property string mdi_format_wrap_square: \"\\uF289\"\n    readonly property string mdi_format_wrap_tight: \"\\uF28A\"\n    readonly property string mdi_format_wrap_top_bottom: \"\\uF28B\"\n    readonly property string mdi_forum: \"\\uF28C\"\n    readonly property string mdi_forum_outline: \"\\uF821\"\n    readonly property string mdi_forward: \"\\uF28D\"\n    readonly property string mdi_forwardburger: \"\\uFD51\"\n    readonly property string mdi_fountain: \"\\uF96A\"\n    readonly property string mdi_fountain_pen: \"\\uFCEE\"\n    readonly property string mdi_fountain_pen_tip: \"\\uFCEF\"\n    readonly property string mdi_foursquare: \"\\uF28E\"\n    readonly property string mdi_freebsd: \"\\uF8DF\"\n    readonly property string mdi_fridge: \"\\uF290\"\n    readonly property string mdi_fridge_bottom: \"\\uF292\"\n    readonly property string mdi_fridge_outline: \"\\uF28F\"\n    readonly property string mdi_fridge_top: \"\\uF291\"\n    readonly property string mdi_fuel: \"\\uF7C9\"\n    readonly property string mdi_fullscreen: \"\\uF293\"\n    readonly property string mdi_fullscreen_exit: \"\\uF294\"\n    readonly property string mdi_function: \"\\uF295\"\n    readonly property string mdi_function_variant: \"\\uF870\"\n    readonly property string mdi_fuse: \"\\uFC61\"\n    readonly property string mdi_fuse_blade: \"\\uFC62\"\n    readonly property string mdi_gamepad: \"\\uF296\"\n    readonly property string mdi_gamepad_variant: \"\\uF297\"\n    readonly property string mdi_gantry_crane: \"\\uFDAD\"\n    readonly property string mdi_garage: \"\\uF6D8\"\n    readonly property string mdi_garage_alert: \"\\uF871\"\n    readonly property string mdi_garage_open: \"\\uF6D9\"\n    readonly property string mdi_gas_cylinder: \"\\uF647\"\n    readonly property string mdi_gas_station: \"\\uF298\"\n    readonly property string mdi_gate: \"\\uF299\"\n    readonly property string mdi_gate_and: \"\\uF8E0\"\n    readonly property string mdi_gate_nand: \"\\uF8E1\"\n    readonly property string mdi_gate_nor: \"\\uF8E2\"\n    readonly property string mdi_gate_not: \"\\uF8E3\"\n    readonly property string mdi_gate_or: \"\\uF8E4\"\n    readonly property string mdi_gate_xnor: \"\\uF8E5\"\n    readonly property string mdi_gate_xor: \"\\uF8E6\"\n    readonly property string mdi_gauge: \"\\uF29A\"\n    readonly property string mdi_gauge_empty: \"\\uF872\"\n    readonly property string mdi_gauge_full: \"\\uF873\"\n    readonly property string mdi_gauge_low: \"\\uF874\"\n    readonly property string mdi_gavel: \"\\uF29B\"\n    readonly property string mdi_gender_female: \"\\uF29C\"\n    readonly property string mdi_gender_male: \"\\uF29D\"\n    readonly property string mdi_gender_male_female: \"\\uF29E\"\n    readonly property string mdi_gender_transgender: \"\\uF29F\"\n    readonly property string mdi_gentoo: \"\\uF8E7\"\n    readonly property string mdi_gesture: \"\\uF7CA\"\n    readonly property string mdi_gesture_double_tap: \"\\uF73B\"\n    readonly property string mdi_gesture_pinch: \"\\uFABC\"\n    readonly property string mdi_gesture_spread: \"\\uFABD\"\n    readonly property string mdi_gesture_swipe: \"\\uFD52\"\n    readonly property string mdi_gesture_swipe_down: \"\\uF73C\"\n    readonly property string mdi_gesture_swipe_horizontal: \"\\uFABE\"\n    readonly property string mdi_gesture_swipe_left: \"\\uF73D\"\n    readonly property string mdi_gesture_swipe_right: \"\\uF73E\"\n    readonly property string mdi_gesture_swipe_up: \"\\uF73F\"\n    readonly property string mdi_gesture_swipe_vertical: \"\\uFABF\"\n    readonly property string mdi_gesture_tap: \"\\uF740\"\n    readonly property string mdi_gesture_tap_hold: \"\\uFD53\"\n    readonly property string mdi_gesture_two_double_tap: \"\\uF741\"\n    readonly property string mdi_gesture_two_tap: \"\\uF742\"\n    readonly property string mdi_ghost: \"\\uF2A0\"\n    readonly property string mdi_ghost_off: \"\\uF9F4\"\n    readonly property string mdi_gif: \"\\uFD54\"\n    readonly property string mdi_gift: \"\\uF2A1\"\n    readonly property string mdi_git: \"\\uF2A2\"\n    readonly property string mdi_github_box: \"\\uF2A3\"\n    readonly property string mdi_github_circle: \"\\uF2A4\"\n    readonly property string mdi_github_face: \"\\uF6DA\"\n    readonly property string mdi_gitlab: \"\\uFB7C\"\n    readonly property string mdi_glass_cocktail: \"\\uF356\"\n    readonly property string mdi_glass_flute: \"\\uF2A5\"\n    readonly property string mdi_glass_mug: \"\\uF2A6\"\n    readonly property string mdi_glass_stange: \"\\uF2A7\"\n    readonly property string mdi_glass_tulip: \"\\uF2A8\"\n    readonly property string mdi_glass_wine: \"\\uF875\"\n    readonly property string mdi_glassdoor: \"\\uF2A9\"\n    readonly property string mdi_glasses: \"\\uF2AA\"\n    readonly property string mdi_globe_model: \"\\uF8E8\"\n    readonly property string mdi_gmail: \"\\uF2AB\"\n    readonly property string mdi_gnome: \"\\uF2AC\"\n    readonly property string mdi_go_kart: \"\\uFD55\"\n    readonly property string mdi_go_kart_track: \"\\uFD56\"\n    readonly property string mdi_gog: \"\\uFB7D\"\n    readonly property string mdi_golf: \"\\uF822\"\n    readonly property string mdi_gondola: \"\\uF685\"\n    readonly property string mdi_goodreads: \"\\uFD57\"\n    readonly property string mdi_google: \"\\uF2AD\"\n    readonly property string mdi_google_adwords: \"\\uFC63\"\n    readonly property string mdi_google_allo: \"\\uF801\"\n    readonly property string mdi_google_analytics: \"\\uF7CB\"\n    readonly property string mdi_google_assistant: \"\\uF7CC\"\n    readonly property string mdi_google_cardboard: \"\\uF2AE\"\n    readonly property string mdi_google_chrome: \"\\uF2AF\"\n    readonly property string mdi_google_circles: \"\\uF2B0\"\n    readonly property string mdi_google_circles_communities: \"\\uF2B1\"\n    readonly property string mdi_google_circles_extended: \"\\uF2B2\"\n    readonly property string mdi_google_circles_group: \"\\uF2B3\"\n    readonly property string mdi_google_classroom: \"\\uF2C0\"\n    readonly property string mdi_google_controller: \"\\uF2B4\"\n    readonly property string mdi_google_controller_off: \"\\uF2B5\"\n    readonly property string mdi_google_drive: \"\\uF2B6\"\n    readonly property string mdi_google_earth: \"\\uF2B7\"\n    readonly property string mdi_google_fit: \"\\uF96B\"\n    readonly property string mdi_google_glass: \"\\uF2B8\"\n    readonly property string mdi_google_hangouts: \"\\uF2C9\"\n    readonly property string mdi_google_home: \"\\uF823\"\n    readonly property string mdi_google_keep: \"\\uF6DB\"\n    readonly property string mdi_google_lens: \"\\uF9F5\"\n    readonly property string mdi_google_maps: \"\\uF5F5\"\n    readonly property string mdi_google_nearby: \"\\uF2B9\"\n    readonly property string mdi_google_pages: \"\\uF2BA\"\n    readonly property string mdi_google_photos: \"\\uF6DC\"\n    readonly property string mdi_google_physical_web: \"\\uF2BB\"\n    readonly property string mdi_google_play: \"\\uF2BC\"\n    readonly property string mdi_google_plus: \"\\uF2BD\"\n    readonly property string mdi_google_plus_box: \"\\uF2BE\"\n    readonly property string mdi_google_spreadsheet: \"\\uF9F6\"\n    readonly property string mdi_google_street_view: \"\\uFC64\"\n    readonly property string mdi_google_translate: \"\\uF2BF\"\n    readonly property string mdi_gpu: \"\\uF8AD\"\n    readonly property string mdi_gradient: \"\\uF69F\"\n    readonly property string mdi_grain: \"\\uFD58\"\n    readonly property string mdi_graphql: \"\\uF876\"\n    readonly property string mdi_grave_stone: \"\\uFB7E\"\n    readonly property string mdi_grease_pencil: \"\\uF648\"\n    readonly property string mdi_greater_than: \"\\uF96C\"\n    readonly property string mdi_greater_than_or_equal: \"\\uF96D\"\n    readonly property string mdi_grid: \"\\uF2C1\"\n    readonly property string mdi_grid_large: \"\\uF757\"\n    readonly property string mdi_grid_off: \"\\uF2C2\"\n    readonly property string mdi_group: \"\\uF2C3\"\n    readonly property string mdi_guitar_acoustic: \"\\uF770\"\n    readonly property string mdi_guitar_electric: \"\\uF2C4\"\n    readonly property string mdi_guitar_pick: \"\\uF2C5\"\n    readonly property string mdi_guitar_pick_outline: \"\\uF2C6\"\n    readonly property string mdi_guy_fawkes_mask: \"\\uF824\"\n    readonly property string mdi_hackernews: \"\\uF624\"\n    readonly property string mdi_hail: \"\\uFAC0\"\n    readonly property string mdi_halloween: \"\\uFB7F\"\n    readonly property string mdi_hamburger: \"\\uF684\"\n    readonly property string mdi_hammer: \"\\uF8E9\"\n    readonly property string mdi_hand: \"\\uFA4E\"\n    readonly property string mdi_hand_okay: \"\\uFA4F\"\n    readonly property string mdi_hand_peace: \"\\uFA50\"\n    readonly property string mdi_hand_peace_variant: \"\\uFA51\"\n    readonly property string mdi_hand_pointing_down: \"\\uFA52\"\n    readonly property string mdi_hand_pointing_left: \"\\uFA53\"\n    readonly property string mdi_hand_pointing_right: \"\\uF2C7\"\n    readonly property string mdi_hand_pointing_up: \"\\uFA54\"\n    readonly property string mdi_hanger: \"\\uF2C8\"\n    readonly property string mdi_hard_hat: \"\\uF96E\"\n    readonly property string mdi_harddisk: \"\\uF2CA\"\n    readonly property string mdi_hat_fedora: \"\\uFB80\"\n    readonly property string mdi_hazard_lights: \"\\uFC65\"\n    readonly property string mdi_hdr: \"\\uFD59\"\n    readonly property string mdi_hdr_off: \"\\uFD5A\"\n    readonly property string mdi_headphones: \"\\uF2CB\"\n    readonly property string mdi_headphones_bluetooth: \"\\uF96F\"\n    readonly property string mdi_headphones_box: \"\\uF2CC\"\n    readonly property string mdi_headphones_off: \"\\uF7CD\"\n    readonly property string mdi_headphones_settings: \"\\uF2CD\"\n    readonly property string mdi_headset: \"\\uF2CE\"\n    readonly property string mdi_headset_dock: \"\\uF2CF\"\n    readonly property string mdi_headset_off: \"\\uF2D0\"\n    readonly property string mdi_heart: \"\\uF2D1\"\n    readonly property string mdi_heart_box: \"\\uF2D2\"\n    readonly property string mdi_heart_box_outline: \"\\uF2D3\"\n    readonly property string mdi_heart_broken: \"\\uF2D4\"\n    readonly property string mdi_heart_broken_outline: \"\\uFCF0\"\n    readonly property string mdi_heart_circle: \"\\uF970\"\n    readonly property string mdi_heart_circle_outline: \"\\uF971\"\n    readonly property string mdi_heart_half: \"\\uF6DE\"\n    readonly property string mdi_heart_half_full: \"\\uF6DD\"\n    readonly property string mdi_heart_half_outline: \"\\uF6DF\"\n    readonly property string mdi_heart_multiple: \"\\uFA55\"\n    readonly property string mdi_heart_multiple_outline: \"\\uFA56\"\n    readonly property string mdi_heart_off: \"\\uF758\"\n    readonly property string mdi_heart_outline: \"\\uF2D5\"\n    readonly property string mdi_heart_pulse: \"\\uF5F6\"\n    readonly property string mdi_helicopter: \"\\uFAC1\"\n    readonly property string mdi_help: \"\\uF2D6\"\n    readonly property string mdi_help_box: \"\\uF78A\"\n    readonly property string mdi_help_circle: \"\\uF2D7\"\n    readonly property string mdi_help_circle_outline: \"\\uF625\"\n    readonly property string mdi_help_network: \"\\uF6F4\"\n    readonly property string mdi_help_network_outline: \"\\uFC66\"\n    readonly property string mdi_help_rhombus: \"\\uFB81\"\n    readonly property string mdi_help_rhombus_outline: \"\\uFB82\"\n    readonly property string mdi_hexagon: \"\\uF2D8\"\n    readonly property string mdi_hexagon_multiple: \"\\uF6E0\"\n    readonly property string mdi_hexagon_outline: \"\\uF2D9\"\n    readonly property string mdi_hexagon_slice_1: \"\\uFAC2\"\n    readonly property string mdi_hexagon_slice_2: \"\\uFAC3\"\n    readonly property string mdi_hexagon_slice_3: \"\\uFAC4\"\n    readonly property string mdi_hexagon_slice_4: \"\\uFAC5\"\n    readonly property string mdi_hexagon_slice_5: \"\\uFAC6\"\n    readonly property string mdi_hexagon_slice_6: \"\\uFAC7\"\n    readonly property string mdi_hexagram: \"\\uFAC8\"\n    readonly property string mdi_hexagram_outline: \"\\uFAC9\"\n    readonly property string mdi_high_definition: \"\\uF7CE\"\n    readonly property string mdi_high_definition_box: \"\\uF877\"\n    readonly property string mdi_highway: \"\\uF5F7\"\n    readonly property string mdi_hiking: \"\\uFD5B\"\n    readonly property string mdi_hinduism: \"\\uF972\"\n    readonly property string mdi_history: \"\\uF2DA\"\n    readonly property string mdi_hockey_puck: \"\\uF878\"\n    readonly property string mdi_hockey_sticks: \"\\uF879\"\n    readonly property string mdi_hololens: \"\\uF2DB\"\n    readonly property string mdi_home: \"\\uF2DC\"\n    readonly property string mdi_home_account: \"\\uF825\"\n    readonly property string mdi_home_alert: \"\\uF87A\"\n    readonly property string mdi_home_assistant: \"\\uF7CF\"\n    readonly property string mdi_home_automation: \"\\uF7D0\"\n    readonly property string mdi_home_circle: \"\\uF7D1\"\n    readonly property string mdi_home_city: \"\\uFCF1\"\n    readonly property string mdi_home_city_outline: \"\\uFCF2\"\n    readonly property string mdi_home_currency_usd: \"\\uF8AE\"\n    readonly property string mdi_home_floor_0: \"\\uFDAE\"\n    readonly property string mdi_home_floor_1: \"\\uFD5C\"\n    readonly property string mdi_home_floor_2: \"\\uFD5D\"\n    readonly property string mdi_home_floor_3: \"\\uFD5E\"\n    readonly property string mdi_home_floor_a: \"\\uFD5F\"\n    readonly property string mdi_home_floor_b: \"\\uFD60\"\n    readonly property string mdi_home_floor_g: \"\\uFD61\"\n    readonly property string mdi_home_floor_l: \"\\uFD62\"\n    readonly property string mdi_home_floor_negative_1: \"\\uFDAF\"\n    readonly property string mdi_home_group: \"\\uFDB0\"\n    readonly property string mdi_home_heart: \"\\uF826\"\n    readonly property string mdi_home_lock: \"\\uF8EA\"\n    readonly property string mdi_home_lock_open: \"\\uF8EB\"\n    readonly property string mdi_home_map_marker: \"\\uF5F8\"\n    readonly property string mdi_home_minus: \"\\uF973\"\n    readonly property string mdi_home_modern: \"\\uF2DD\"\n    readonly property string mdi_home_outline: \"\\uF6A0\"\n    readonly property string mdi_home_plus: \"\\uF974\"\n    readonly property string mdi_home_variant: \"\\uF2DE\"\n    readonly property string mdi_home_variant_outline: \"\\uFB83\"\n    readonly property string mdi_hook: \"\\uF6E1\"\n    readonly property string mdi_hook_off: \"\\uF6E2\"\n    readonly property string mdi_hops: \"\\uF2DF\"\n    readonly property string mdi_horseshoe: \"\\uFA57\"\n    readonly property string mdi_hospital: \"\\uF2E0\"\n    readonly property string mdi_hospital_building: \"\\uF2E1\"\n    readonly property string mdi_hospital_marker: \"\\uF2E2\"\n    readonly property string mdi_hot_tub: \"\\uF827\"\n    readonly property string mdi_hotel: \"\\uF2E3\"\n    readonly property string mdi_houzz: \"\\uF2E4\"\n    readonly property string mdi_houzz_box: \"\\uF2E5\"\n    readonly property string mdi_hubspot: \"\\uFCF3\"\n    readonly property string mdi_hulu: \"\\uF828\"\n    readonly property string mdi_human: \"\\uF2E6\"\n    readonly property string mdi_human_child: \"\\uF2E7\"\n    readonly property string mdi_human_female: \"\\uF649\"\n    readonly property string mdi_human_female_boy: \"\\uFA58\"\n    readonly property string mdi_human_female_female: \"\\uFA59\"\n    readonly property string mdi_human_female_girl: \"\\uFA5A\"\n    readonly property string mdi_human_greeting: \"\\uF64A\"\n    readonly property string mdi_human_handsdown: \"\\uF64B\"\n    readonly property string mdi_human_handsup: \"\\uF64C\"\n    readonly property string mdi_human_male: \"\\uF64D\"\n    readonly property string mdi_human_male_boy: \"\\uFA5B\"\n    readonly property string mdi_human_male_female: \"\\uF2E8\"\n    readonly property string mdi_human_male_girl: \"\\uFA5C\"\n    readonly property string mdi_human_male_male: \"\\uFA5D\"\n    readonly property string mdi_human_pregnant: \"\\uF5CF\"\n    readonly property string mdi_humble_bundle: \"\\uF743\"\n    readonly property string mdi_ice_cream: \"\\uF829\"\n    readonly property string mdi_iframe: \"\\uFC67\"\n    readonly property string mdi_iframe_outline: \"\\uFC68\"\n    readonly property string mdi_image: \"\\uF2E9\"\n    readonly property string mdi_image_album: \"\\uF2EA\"\n    readonly property string mdi_image_area: \"\\uF2EB\"\n    readonly property string mdi_image_area_close: \"\\uF2EC\"\n    readonly property string mdi_image_broken: \"\\uF2ED\"\n    readonly property string mdi_image_broken_variant: \"\\uF2EE\"\n    readonly property string mdi_image_filter: \"\\uF2EF\"\n    readonly property string mdi_image_filter_black_white: \"\\uF2F0\"\n    readonly property string mdi_image_filter_center_focus: \"\\uF2F1\"\n    readonly property string mdi_image_filter_center_focus_weak: \"\\uF2F2\"\n    readonly property string mdi_image_filter_drama: \"\\uF2F3\"\n    readonly property string mdi_image_filter_frames: \"\\uF2F4\"\n    readonly property string mdi_image_filter_hdr: \"\\uF2F5\"\n    readonly property string mdi_image_filter_none: \"\\uF2F6\"\n    readonly property string mdi_image_filter_tilt_shift: \"\\uF2F7\"\n    readonly property string mdi_image_filter_vintage: \"\\uF2F8\"\n    readonly property string mdi_image_move: \"\\uF9F7\"\n    readonly property string mdi_image_multiple: \"\\uF2F9\"\n    readonly property string mdi_image_off: \"\\uF82A\"\n    readonly property string mdi_image_outline: \"\\uF975\"\n    readonly property string mdi_image_plus: \"\\uF87B\"\n    readonly property string mdi_image_search: \"\\uF976\"\n    readonly property string mdi_image_search_outline: \"\\uF977\"\n    readonly property string mdi_image_size_select_actual: \"\\uFC69\"\n    readonly property string mdi_image_size_select_large: \"\\uFC6A\"\n    readonly property string mdi_image_size_select_small: \"\\uFC6B\"\n    readonly property string mdi_import: \"\\uF2FA\"\n    readonly property string mdi_inbox: \"\\uF686\"\n    readonly property string mdi_inbox_arrow_down: \"\\uF2FB\"\n    readonly property string mdi_inbox_arrow_up: \"\\uF3D1\"\n    readonly property string mdi_inbox_multiple: \"\\uF8AF\"\n    readonly property string mdi_inbox_multiple_outline: \"\\uFB84\"\n    readonly property string mdi_incognito: \"\\uF5F9\"\n    readonly property string mdi_infinity: \"\\uF6E3\"\n    readonly property string mdi_information: \"\\uF2FC\"\n    readonly property string mdi_information_outline: \"\\uF2FD\"\n    readonly property string mdi_information_variant: \"\\uF64E\"\n    readonly property string mdi_instagram: \"\\uF2FE\"\n    readonly property string mdi_instapaper: \"\\uF2FF\"\n    readonly property string mdi_internet_explorer: \"\\uF300\"\n    readonly property string mdi_invert_colors: \"\\uF301\"\n    readonly property string mdi_ip: \"\\uFA5E\"\n    readonly property string mdi_ip_network: \"\\uFA5F\"\n    readonly property string mdi_ip_network_outline: \"\\uFC6C\"\n    readonly property string mdi_ipod: \"\\uFC6D\"\n    readonly property string mdi_islam: \"\\uF978\"\n    readonly property string mdi_itunes: \"\\uF676\"\n    readonly property string mdi_jabber: \"\\uFDB1\"\n    readonly property string mdi_jeepney: \"\\uF302\"\n    readonly property string mdi_jira: \"\\uF303\"\n    readonly property string mdi_jquery: \"\\uF87C\"\n    readonly property string mdi_jsfiddle: \"\\uF304\"\n    readonly property string mdi_json: \"\\uF626\"\n    readonly property string mdi_judaism: \"\\uF979\"\n    readonly property string mdi_kabaddi: \"\\uFD63\"\n    readonly property string mdi_karate: \"\\uF82B\"\n    readonly property string mdi_keg: \"\\uF305\"\n    readonly property string mdi_kettle: \"\\uF5FA\"\n    readonly property string mdi_key: \"\\uF306\"\n    readonly property string mdi_key_change: \"\\uF307\"\n    readonly property string mdi_key_minus: \"\\uF308\"\n    readonly property string mdi_key_outline: \"\\uFDB2\"\n    readonly property string mdi_key_plus: \"\\uF309\"\n    readonly property string mdi_key_remove: \"\\uF30A\"\n    readonly property string mdi_key_variant: \"\\uF30B\"\n    readonly property string mdi_keyboard: \"\\uF30C\"\n    readonly property string mdi_keyboard_backspace: \"\\uF30D\"\n    readonly property string mdi_keyboard_caps: \"\\uF30E\"\n    readonly property string mdi_keyboard_close: \"\\uF30F\"\n    readonly property string mdi_keyboard_off: \"\\uF310\"\n    readonly property string mdi_keyboard_outline: \"\\uF97A\"\n    readonly property string mdi_keyboard_return: \"\\uF311\"\n    readonly property string mdi_keyboard_settings: \"\\uF9F8\"\n    readonly property string mdi_keyboard_settings_outline: \"\\uF9F9\"\n    readonly property string mdi_keyboard_tab: \"\\uF312\"\n    readonly property string mdi_keyboard_variant: \"\\uF313\"\n    readonly property string mdi_kickstarter: \"\\uF744\"\n    readonly property string mdi_knife: \"\\uF9FA\"\n    readonly property string mdi_knife_military: \"\\uF9FB\"\n    readonly property string mdi_kodi: \"\\uF314\"\n    readonly property string mdi_label: \"\\uF315\"\n    readonly property string mdi_label_off: \"\\uFACA\"\n    readonly property string mdi_label_off_outline: \"\\uFACB\"\n    readonly property string mdi_label_outline: \"\\uF316\"\n    readonly property string mdi_label_variant: \"\\uFACC\"\n    readonly property string mdi_label_variant_outline: \"\\uFACD\"\n    readonly property string mdi_ladybug: \"\\uF82C\"\n    readonly property string mdi_lambda: \"\\uF627\"\n    readonly property string mdi_lamp: \"\\uF6B4\"\n    readonly property string mdi_lan: \"\\uF317\"\n    readonly property string mdi_lan_connect: \"\\uF318\"\n    readonly property string mdi_lan_disconnect: \"\\uF319\"\n    readonly property string mdi_lan_pending: \"\\uF31A\"\n    readonly property string mdi_language_c: \"\\uF671\"\n    readonly property string mdi_language_cpp: \"\\uF672\"\n    readonly property string mdi_language_csharp: \"\\uF31B\"\n    readonly property string mdi_language_css3: \"\\uF31C\"\n    readonly property string mdi_language_go: \"\\uF7D2\"\n    readonly property string mdi_language_haskell: \"\\uFC6E\"\n    readonly property string mdi_language_html5: \"\\uF31D\"\n    readonly property string mdi_language_java: \"\\uFB1C\"\n    readonly property string mdi_language_javascript: \"\\uF31E\"\n    readonly property string mdi_language_lua: \"\\uF8B0\"\n    readonly property string mdi_language_php: \"\\uF31F\"\n    readonly property string mdi_language_python: \"\\uF320\"\n    readonly property string mdi_language_python_text: \"\\uF321\"\n    readonly property string mdi_language_r: \"\\uF7D3\"\n    readonly property string mdi_language_ruby_on_rails: \"\\uFACE\"\n    readonly property string mdi_language_swift: \"\\uF6E4\"\n    readonly property string mdi_language_typescript: \"\\uF6E5\"\n    readonly property string mdi_laptop: \"\\uF322\"\n    readonly property string mdi_laptop_chromebook: \"\\uF323\"\n    readonly property string mdi_laptop_mac: \"\\uF324\"\n    readonly property string mdi_laptop_off: \"\\uF6E6\"\n    readonly property string mdi_laptop_windows: \"\\uF325\"\n    readonly property string mdi_laravel: \"\\uFACF\"\n    readonly property string mdi_lastfm: \"\\uF326\"\n    readonly property string mdi_lastpass: \"\\uF446\"\n    readonly property string mdi_launch: \"\\uF327\"\n    readonly property string mdi_lava_lamp: \"\\uF7D4\"\n    readonly property string mdi_layers: \"\\uF328\"\n    readonly property string mdi_layers_off: \"\\uF329\"\n    readonly property string mdi_layers_off_outline: \"\\uF9FC\"\n    readonly property string mdi_layers_outline: \"\\uF9FD\"\n    readonly property string mdi_lead_pencil: \"\\uF64F\"\n    readonly property string mdi_leaf: \"\\uF32A\"\n    readonly property string mdi_leaf_maple: \"\\uFC6F\"\n    readonly property string mdi_leak: \"\\uFDB3\"\n    readonly property string mdi_leak_off: \"\\uFDB4\"\n    readonly property string mdi_led_off: \"\\uF32B\"\n    readonly property string mdi_led_on: \"\\uF32C\"\n    readonly property string mdi_led_outline: \"\\uF32D\"\n    readonly property string mdi_led_strip: \"\\uF7D5\"\n    readonly property string mdi_led_variant_off: \"\\uF32E\"\n    readonly property string mdi_led_variant_on: \"\\uF32F\"\n    readonly property string mdi_led_variant_outline: \"\\uF330\"\n    readonly property string mdi_less_than: \"\\uF97B\"\n    readonly property string mdi_less_than_or_equal: \"\\uF97C\"\n    readonly property string mdi_library: \"\\uF331\"\n    readonly property string mdi_library_books: \"\\uF332\"\n    readonly property string mdi_library_movie: \"\\uFCF4\"\n    readonly property string mdi_library_music: \"\\uF333\"\n    readonly property string mdi_library_plus: \"\\uF334\"\n    readonly property string mdi_library_shelves: \"\\uFB85\"\n    readonly property string mdi_library_video: \"\\uFCF5\"\n    readonly property string mdi_lifebuoy: \"\\uF87D\"\n    readonly property string mdi_light_switch: \"\\uF97D\"\n    readonly property string mdi_lightbulb: \"\\uF335\"\n    readonly property string mdi_lightbulb_on: \"\\uF6E7\"\n    readonly property string mdi_lightbulb_on_outline: \"\\uF6E8\"\n    readonly property string mdi_lightbulb_outline: \"\\uF336\"\n    readonly property string mdi_lighthouse: \"\\uF9FE\"\n    readonly property string mdi_lighthouse_on: \"\\uF9FF\"\n    readonly property string mdi_link: \"\\uF337\"\n    readonly property string mdi_link_box: \"\\uFCF6\"\n    readonly property string mdi_link_box_outline: \"\\uFCF7\"\n    readonly property string mdi_link_box_variant: \"\\uFCF8\"\n    readonly property string mdi_link_box_variant_outline: \"\\uFCF9\"\n    readonly property string mdi_link_off: \"\\uF338\"\n    readonly property string mdi_link_plus: \"\\uFC70\"\n    readonly property string mdi_link_variant: \"\\uF339\"\n    readonly property string mdi_link_variant_off: \"\\uF33A\"\n    readonly property string mdi_linkedin: \"\\uF33B\"\n    readonly property string mdi_linkedin_box: \"\\uF33C\"\n    readonly property string mdi_linux: \"\\uF33D\"\n    readonly property string mdi_linux_mint: \"\\uF8EC\"\n    readonly property string mdi_litecoin: \"\\uFA60\"\n    readonly property string mdi_loading: \"\\uF771\"\n    readonly property string mdi_lock: \"\\uF33E\"\n    readonly property string mdi_lock_alert: \"\\uF8ED\"\n    readonly property string mdi_lock_clock: \"\\uF97E\"\n    readonly property string mdi_lock_open: \"\\uF33F\"\n    readonly property string mdi_lock_open_outline: \"\\uF340\"\n    readonly property string mdi_lock_outline: \"\\uF341\"\n    readonly property string mdi_lock_pattern: \"\\uF6E9\"\n    readonly property string mdi_lock_plus: \"\\uF5FB\"\n    readonly property string mdi_lock_question: \"\\uF8EE\"\n    readonly property string mdi_lock_reset: \"\\uF772\"\n    readonly property string mdi_lock_smart: \"\\uF8B1\"\n    readonly property string mdi_locker: \"\\uF7D6\"\n    readonly property string mdi_locker_multiple: \"\\uF7D7\"\n    readonly property string mdi_login: \"\\uF342\"\n    readonly property string mdi_login_variant: \"\\uF5FC\"\n    readonly property string mdi_logout: \"\\uF343\"\n    readonly property string mdi_logout_variant: \"\\uF5FD\"\n    readonly property string mdi_looks: \"\\uF344\"\n    readonly property string mdi_loop: \"\\uF6EA\"\n    readonly property string mdi_loupe: \"\\uF345\"\n    readonly property string mdi_lumx: \"\\uF346\"\n    readonly property string mdi_lyft: \"\\uFB1D\"\n    readonly property string mdi_magnet: \"\\uF347\"\n    readonly property string mdi_magnet_on: \"\\uF348\"\n    readonly property string mdi_magnify: \"\\uF349\"\n    readonly property string mdi_magnify_close: \"\\uF97F\"\n    readonly property string mdi_magnify_minus: \"\\uF34A\"\n    readonly property string mdi_magnify_minus_cursor: \"\\uFA61\"\n    readonly property string mdi_magnify_minus_outline: \"\\uF6EB\"\n    readonly property string mdi_magnify_plus: \"\\uF34B\"\n    readonly property string mdi_magnify_plus_cursor: \"\\uFA62\"\n    readonly property string mdi_magnify_plus_outline: \"\\uF6EC\"\n    readonly property string mdi_mail_ru: \"\\uF34C\"\n    readonly property string mdi_mailbox: \"\\uF6ED\"\n    readonly property string mdi_mailbox_open: \"\\uFD64\"\n    readonly property string mdi_mailbox_open_outline: \"\\uFD65\"\n    readonly property string mdi_mailbox_open_up: \"\\uFD66\"\n    readonly property string mdi_mailbox_open_up_outline: \"\\uFD67\"\n    readonly property string mdi_mailbox_outline: \"\\uFD68\"\n    readonly property string mdi_mailbox_up: \"\\uFD69\"\n    readonly property string mdi_mailbox_up_outline: \"\\uFD6A\"\n    readonly property string mdi_map: \"\\uF34D\"\n    readonly property string mdi_map_clock: \"\\uFCFA\"\n    readonly property string mdi_map_clock_outline: \"\\uFCFB\"\n    readonly property string mdi_map_legend: \"\\uFA00\"\n    readonly property string mdi_map_marker: \"\\uF34E\"\n    readonly property string mdi_map_marker_check: \"\\uFC71\"\n    readonly property string mdi_map_marker_circle: \"\\uF34F\"\n    readonly property string mdi_map_marker_distance: \"\\uF8EF\"\n    readonly property string mdi_map_marker_minus: \"\\uF650\"\n    readonly property string mdi_map_marker_multiple: \"\\uF350\"\n    readonly property string mdi_map_marker_off: \"\\uF351\"\n    readonly property string mdi_map_marker_outline: \"\\uF7D8\"\n    readonly property string mdi_map_marker_path: \"\\uFCFC\"\n    readonly property string mdi_map_marker_plus: \"\\uF651\"\n    readonly property string mdi_map_marker_radius: \"\\uF352\"\n    readonly property string mdi_map_minus: \"\\uF980\"\n    readonly property string mdi_map_outline: \"\\uF981\"\n    readonly property string mdi_map_plus: \"\\uF982\"\n    readonly property string mdi_map_search: \"\\uF983\"\n    readonly property string mdi_map_search_outline: \"\\uF984\"\n    readonly property string mdi_mapbox: \"\\uFB86\"\n    readonly property string mdi_margin: \"\\uF353\"\n    readonly property string mdi_markdown: \"\\uF354\"\n    readonly property string mdi_marker: \"\\uF652\"\n    readonly property string mdi_marker_cancel: \"\\uFDB5\"\n    readonly property string mdi_marker_check: \"\\uF355\"\n    readonly property string mdi_mastodon: \"\\uFAD0\"\n    readonly property string mdi_mastodon_variant: \"\\uFAD1\"\n    readonly property string mdi_material_design: \"\\uF985\"\n    readonly property string mdi_material_ui: \"\\uF357\"\n    readonly property string mdi_math_compass: \"\\uF358\"\n    readonly property string mdi_math_cos: \"\\uFC72\"\n    readonly property string mdi_math_sin: \"\\uFC73\"\n    readonly property string mdi_math_tan: \"\\uFC74\"\n    readonly property string mdi_matrix: \"\\uF628\"\n    readonly property string mdi_maxcdn: \"\\uF359\"\n    readonly property string mdi_medal: \"\\uF986\"\n    readonly property string mdi_medical_bag: \"\\uF6EE\"\n    readonly property string mdi_medium: \"\\uF35A\"\n    readonly property string mdi_meetup: \"\\uFAD2\"\n    readonly property string mdi_memory: \"\\uF35B\"\n    readonly property string mdi_menu: \"\\uF35C\"\n    readonly property string mdi_menu_down: \"\\uF35D\"\n    readonly property string mdi_menu_down_outline: \"\\uF6B5\"\n    readonly property string mdi_menu_left: \"\\uF35E\"\n    readonly property string mdi_menu_left_outline: \"\\uFA01\"\n    readonly property string mdi_menu_open: \"\\uFB87\"\n    readonly property string mdi_menu_right: \"\\uF35F\"\n    readonly property string mdi_menu_right_outline: \"\\uFA02\"\n    readonly property string mdi_menu_swap: \"\\uFA63\"\n    readonly property string mdi_menu_swap_outline: \"\\uFA64\"\n    readonly property string mdi_menu_up: \"\\uF360\"\n    readonly property string mdi_menu_up_outline: \"\\uF6B6\"\n    readonly property string mdi_message: \"\\uF361\"\n    readonly property string mdi_message_alert: \"\\uF362\"\n    readonly property string mdi_message_alert_outline: \"\\uFA03\"\n    readonly property string mdi_message_bulleted: \"\\uF6A1\"\n    readonly property string mdi_message_bulleted_off: \"\\uF6A2\"\n    readonly property string mdi_message_draw: \"\\uF363\"\n    readonly property string mdi_message_image: \"\\uF364\"\n    readonly property string mdi_message_outline: \"\\uF365\"\n    readonly property string mdi_message_plus: \"\\uF653\"\n    readonly property string mdi_message_processing: \"\\uF366\"\n    readonly property string mdi_message_reply: \"\\uF367\"\n    readonly property string mdi_message_reply_text: \"\\uF368\"\n    readonly property string mdi_message_settings: \"\\uF6EF\"\n    readonly property string mdi_message_settings_variant: \"\\uF6F0\"\n    readonly property string mdi_message_text: \"\\uF369\"\n    readonly property string mdi_message_text_outline: \"\\uF36A\"\n    readonly property string mdi_message_video: \"\\uF36B\"\n    readonly property string mdi_meteor: \"\\uF629\"\n    readonly property string mdi_metronome: \"\\uF7D9\"\n    readonly property string mdi_metronome_tick: \"\\uF7DA\"\n    readonly property string mdi_micro_sd: \"\\uF7DB\"\n    readonly property string mdi_microphone: \"\\uF36C\"\n    readonly property string mdi_microphone_minus: \"\\uF8B2\"\n    readonly property string mdi_microphone_off: \"\\uF36D\"\n    readonly property string mdi_microphone_outline: \"\\uF36E\"\n    readonly property string mdi_microphone_plus: \"\\uF8B3\"\n    readonly property string mdi_microphone_settings: \"\\uF36F\"\n    readonly property string mdi_microphone_variant: \"\\uF370\"\n    readonly property string mdi_microphone_variant_off: \"\\uF371\"\n    readonly property string mdi_microscope: \"\\uF654\"\n    readonly property string mdi_microsoft: \"\\uF372\"\n    readonly property string mdi_microsoft_dynamics: \"\\uF987\"\n    readonly property string mdi_microwave: \"\\uFC75\"\n    readonly property string mdi_midi: \"\\uF8F0\"\n    readonly property string mdi_midi_port: \"\\uF8F1\"\n    readonly property string mdi_mine: \"\\uFDB6\"\n    readonly property string mdi_minecraft: \"\\uF373\"\n    readonly property string mdi_mini_sd: \"\\uFA04\"\n    readonly property string mdi_minidisc: \"\\uFA05\"\n    readonly property string mdi_minus: \"\\uF374\"\n    readonly property string mdi_minus_box: \"\\uF375\"\n    readonly property string mdi_minus_box_outline: \"\\uF6F1\"\n    readonly property string mdi_minus_circle: \"\\uF376\"\n    readonly property string mdi_minus_circle_outline: \"\\uF377\"\n    readonly property string mdi_minus_network: \"\\uF378\"\n    readonly property string mdi_minus_network_outline: \"\\uFC76\"\n    readonly property string mdi_mixcloud: \"\\uF62A\"\n    readonly property string mdi_mixed_martial_arts: \"\\uFD6B\"\n    readonly property string mdi_mixed_reality: \"\\uF87E\"\n    readonly property string mdi_mixer: \"\\uF7DC\"\n    readonly property string mdi_molecule: \"\\uFB88\"\n    readonly property string mdi_monitor: \"\\uF379\"\n    readonly property string mdi_monitor_cellphone: \"\\uF988\"\n    readonly property string mdi_monitor_cellphone_star: \"\\uF989\"\n    readonly property string mdi_monitor_dashboard: \"\\uFA06\"\n    readonly property string mdi_monitor_lock: \"\\uFDB7\"\n    readonly property string mdi_monitor_multiple: \"\\uF37A\"\n    readonly property string mdi_monitor_off: \"\\uFD6C\"\n    readonly property string mdi_monitor_star: \"\\uFDB8\"\n    readonly property string mdi_more: \"\\uF37B\"\n    readonly property string mdi_mother_nurse: \"\\uFCFD\"\n    readonly property string mdi_motion_sensor: \"\\uFD6D\"\n    readonly property string mdi_motorbike: \"\\uF37C\"\n    readonly property string mdi_mouse: \"\\uF37D\"\n    readonly property string mdi_mouse_bluetooth: \"\\uF98A\"\n    readonly property string mdi_mouse_off: \"\\uF37E\"\n    readonly property string mdi_mouse_variant: \"\\uF37F\"\n    readonly property string mdi_mouse_variant_off: \"\\uF380\"\n    readonly property string mdi_move_resize: \"\\uF655\"\n    readonly property string mdi_move_resize_variant: \"\\uF656\"\n    readonly property string mdi_movie: \"\\uF381\"\n    readonly property string mdi_movie_outline: \"\\uFDB9\"\n    readonly property string mdi_movie_roll: \"\\uF7DD\"\n    readonly property string mdi_muffin: \"\\uF98B\"\n    readonly property string mdi_multiplication: \"\\uF382\"\n    readonly property string mdi_multiplication_box: \"\\uF383\"\n    readonly property string mdi_mushroom: \"\\uF7DE\"\n    readonly property string mdi_mushroom_outline: \"\\uF7DF\"\n    readonly property string mdi_music: \"\\uF759\"\n    readonly property string mdi_music_box: \"\\uF384\"\n    readonly property string mdi_music_box_outline: \"\\uF385\"\n    readonly property string mdi_music_circle: \"\\uF386\"\n    readonly property string mdi_music_circle_outline: \"\\uFAD3\"\n    readonly property string mdi_music_note: \"\\uF387\"\n    readonly property string mdi_music_note_bluetooth: \"\\uF5FE\"\n    readonly property string mdi_music_note_bluetooth_off: \"\\uF5FF\"\n    readonly property string mdi_music_note_eighth: \"\\uF388\"\n    readonly property string mdi_music_note_half: \"\\uF389\"\n    readonly property string mdi_music_note_off: \"\\uF38A\"\n    readonly property string mdi_music_note_plus: \"\\uFDBA\"\n    readonly property string mdi_music_note_quarter: \"\\uF38B\"\n    readonly property string mdi_music_note_sixteenth: \"\\uF38C\"\n    readonly property string mdi_music_note_whole: \"\\uF38D\"\n    readonly property string mdi_music_off: \"\\uF75A\"\n    readonly property string mdi_nail: \"\\uFDBB\"\n    readonly property string mdi_nas: \"\\uF8F2\"\n    readonly property string mdi_nativescript: \"\\uF87F\"\n    readonly property string mdi_nature: \"\\uF38E\"\n    readonly property string mdi_nature_people: \"\\uF38F\"\n    readonly property string mdi_navigation: \"\\uF390\"\n    readonly property string mdi_near_me: \"\\uF5CD\"\n    readonly property string mdi_needle: \"\\uF391\"\n    readonly property string mdi_netflix: \"\\uF745\"\n    readonly property string mdi_network: \"\\uF6F2\"\n    readonly property string mdi_network_off: \"\\uFC77\"\n    readonly property string mdi_network_off_outline: \"\\uFC78\"\n    readonly property string mdi_network_outline: \"\\uFC79\"\n    readonly property string mdi_network_strength_1: \"\\uF8F3\"\n    readonly property string mdi_network_strength_1_alert: \"\\uF8F4\"\n    readonly property string mdi_network_strength_2: \"\\uF8F5\"\n    readonly property string mdi_network_strength_2_alert: \"\\uF8F6\"\n    readonly property string mdi_network_strength_3: \"\\uF8F7\"\n    readonly property string mdi_network_strength_3_alert: \"\\uF8F8\"\n    readonly property string mdi_network_strength_4: \"\\uF8F9\"\n    readonly property string mdi_network_strength_4_alert: \"\\uF8FA\"\n    readonly property string mdi_network_strength_off: \"\\uF8FB\"\n    readonly property string mdi_network_strength_off_outline: \"\\uF8FC\"\n    readonly property string mdi_network_strength_outline: \"\\uF8FD\"\n    readonly property string mdi_new_box: \"\\uF394\"\n    readonly property string mdi_newspaper: \"\\uF395\"\n    readonly property string mdi_nfc: \"\\uF396\"\n    readonly property string mdi_nfc_tap: \"\\uF397\"\n    readonly property string mdi_nfc_variant: \"\\uF398\"\n    readonly property string mdi_ninja: \"\\uF773\"\n    readonly property string mdi_nintendo_switch: \"\\uF7E0\"\n    readonly property string mdi_nodejs: \"\\uF399\"\n    readonly property string mdi_not_equal: \"\\uF98C\"\n    readonly property string mdi_not_equal_variant: \"\\uF98D\"\n    readonly property string mdi_note: \"\\uF39A\"\n    readonly property string mdi_note_multiple: \"\\uF6B7\"\n    readonly property string mdi_note_multiple_outline: \"\\uF6B8\"\n    readonly property string mdi_note_outline: \"\\uF39B\"\n    readonly property string mdi_note_plus: \"\\uF39C\"\n    readonly property string mdi_note_plus_outline: \"\\uF39D\"\n    readonly property string mdi_note_text: \"\\uF39E\"\n    readonly property string mdi_notebook: \"\\uF82D\"\n    readonly property string mdi_notification_clear_all: \"\\uF39F\"\n    readonly property string mdi_npm: \"\\uF6F6\"\n    readonly property string mdi_npm_variant: \"\\uF98E\"\n    readonly property string mdi_npm_variant_outline: \"\\uF98F\"\n    readonly property string mdi_nuke: \"\\uF6A3\"\n    readonly property string mdi_null: \"\\uF7E1\"\n    readonly property string mdi_numeric: \"\\uF3A0\"\n    readonly property string mdi_numeric_0: \"\\u0030\"\n    readonly property string mdi_numeric_0_box: \"\\uF3A1\"\n    readonly property string mdi_numeric_0_box_multiple_outline: \"\\uF3A2\"\n    readonly property string mdi_numeric_0_box_outline: \"\\uF3A3\"\n    readonly property string mdi_numeric_0_circle: \"\\uFC7A\"\n    readonly property string mdi_numeric_0_circle_outline: \"\\uFC7B\"\n    readonly property string mdi_numeric_1: \"\\u0031\"\n    readonly property string mdi_numeric_1_box: \"\\uF3A4\"\n    readonly property string mdi_numeric_1_box_multiple_outline: \"\\uF3A5\"\n    readonly property string mdi_numeric_1_box_outline: \"\\uF3A6\"\n    readonly property string mdi_numeric_1_circle: \"\\uFC7C\"\n    readonly property string mdi_numeric_1_circle_outline: \"\\uFC7D\"\n    readonly property string mdi_numeric_2: \"\\u0032\"\n    readonly property string mdi_numeric_2_box: \"\\uF3A7\"\n    readonly property string mdi_numeric_2_box_multiple_outline: \"\\uF3A8\"\n    readonly property string mdi_numeric_2_box_outline: \"\\uF3A9\"\n    readonly property string mdi_numeric_2_circle: \"\\uFC7E\"\n    readonly property string mdi_numeric_2_circle_outline: \"\\uFC7F\"\n    readonly property string mdi_numeric_3: \"\\u0033\"\n    readonly property string mdi_numeric_3_box: \"\\uF3AA\"\n    readonly property string mdi_numeric_3_box_multiple_outline: \"\\uF3AB\"\n    readonly property string mdi_numeric_3_box_outline: \"\\uF3AC\"\n    readonly property string mdi_numeric_3_circle: \"\\uFC80\"\n    readonly property string mdi_numeric_3_circle_outline: \"\\uFC81\"\n    readonly property string mdi_numeric_4: \"\\u0034\"\n    readonly property string mdi_numeric_4_box: \"\\uF3AD\"\n    readonly property string mdi_numeric_4_box_multiple_outline: \"\\uF3AE\"\n    readonly property string mdi_numeric_4_box_outline: \"\\uF3AF\"\n    readonly property string mdi_numeric_4_circle: \"\\uFC82\"\n    readonly property string mdi_numeric_4_circle_outline: \"\\uFC83\"\n    readonly property string mdi_numeric_5: \"\\u0035\"\n    readonly property string mdi_numeric_5_box: \"\\uF3B0\"\n    readonly property string mdi_numeric_5_box_multiple_outline: \"\\uF3B1\"\n    readonly property string mdi_numeric_5_box_outline: \"\\uF3B2\"\n    readonly property string mdi_numeric_5_circle: \"\\uFC84\"\n    readonly property string mdi_numeric_5_circle_outline: \"\\uFC85\"\n    readonly property string mdi_numeric_6: \"\\u0036\"\n    readonly property string mdi_numeric_6_box: \"\\uF3B3\"\n    readonly property string mdi_numeric_6_box_multiple_outline: \"\\uF3B4\"\n    readonly property string mdi_numeric_6_box_outline: \"\\uF3B5\"\n    readonly property string mdi_numeric_6_circle: \"\\uFC86\"\n    readonly property string mdi_numeric_6_circle_outline: \"\\uFC87\"\n    readonly property string mdi_numeric_7: \"\\u0037\"\n    readonly property string mdi_numeric_7_box: \"\\uF3B6\"\n    readonly property string mdi_numeric_7_box_multiple_outline: \"\\uF3B7\"\n    readonly property string mdi_numeric_7_box_outline: \"\\uF3B8\"\n    readonly property string mdi_numeric_7_circle: \"\\uFC88\"\n    readonly property string mdi_numeric_7_circle_outline: \"\\uFC89\"\n    readonly property string mdi_numeric_8: \"\\u0038\"\n    readonly property string mdi_numeric_8_box: \"\\uF3B9\"\n    readonly property string mdi_numeric_8_box_multiple_outline: \"\\uF3BA\"\n    readonly property string mdi_numeric_8_box_outline: \"\\uF3BB\"\n    readonly property string mdi_numeric_8_circle: \"\\uFC8A\"\n    readonly property string mdi_numeric_8_circle_outline: \"\\uFC8B\"\n    readonly property string mdi_numeric_9: \"\\u0039\"\n    readonly property string mdi_numeric_9_box: \"\\uF3BC\"\n    readonly property string mdi_numeric_9_box_multiple_outline: \"\\uF3BD\"\n    readonly property string mdi_numeric_9_box_outline: \"\\uF3BE\"\n    readonly property string mdi_numeric_9_circle: \"\\uFC8C\"\n    readonly property string mdi_numeric_9_circle_outline: \"\\uFC8D\"\n    readonly property string mdi_numeric_9_plus_box: \"\\uF3BF\"\n    readonly property string mdi_numeric_9_plus_box_multiple_outline: \"\\uF3C0\"\n    readonly property string mdi_numeric_9_plus_box_outline: \"\\uF3C1\"\n    readonly property string mdi_numeric_9_plus_circle: \"\\uFC8E\"\n    readonly property string mdi_numeric_9_plus_circle_outline: \"\\uFC8F\"\n    readonly property string mdi_nut: \"\\uF6F7\"\n    readonly property string mdi_nutrition: \"\\uF3C2\"\n    readonly property string mdi_oar: \"\\uF67B\"\n    readonly property string mdi_ocarina: \"\\uFDBC\"\n    readonly property string mdi_octagon: \"\\uF3C3\"\n    readonly property string mdi_octagon_outline: \"\\uF3C4\"\n    readonly property string mdi_octagram: \"\\uF6F8\"\n    readonly property string mdi_octagram_outline: \"\\uF774\"\n    readonly property string mdi_odnoklassniki: \"\\uF3C5\"\n    readonly property string mdi_office: \"\\uF3C6\"\n    readonly property string mdi_office_building: \"\\uF990\"\n    readonly property string mdi_oil: \"\\uF3C7\"\n    readonly property string mdi_oil_temperature: \"\\uF3C8\"\n    readonly property string mdi_omega: \"\\uF3C9\"\n    readonly property string mdi_one_up: \"\\uFB89\"\n    readonly property string mdi_onedrive: \"\\uF3CA\"\n    readonly property string mdi_onenote: \"\\uF746\"\n    readonly property string mdi_onepassword: \"\\uF880\"\n    readonly property string mdi_opacity: \"\\uF5CC\"\n    readonly property string mdi_open_in_app: \"\\uF3CB\"\n    readonly property string mdi_open_in_new: \"\\uF3CC\"\n    readonly property string mdi_open_source_initiative: \"\\uFB8A\"\n    readonly property string mdi_openid: \"\\uF3CD\"\n    readonly property string mdi_opera: \"\\uF3CE\"\n    readonly property string mdi_orbit: \"\\uF018\"\n    readonly property string mdi_origin: \"\\uFB2B\"\n    readonly property string mdi_ornament: \"\\uF3CF\"\n    readonly property string mdi_ornament_variant: \"\\uF3D0\"\n    readonly property string mdi_outlook: \"\\uFCFE\"\n    readonly property string mdi_owl: \"\\uF3D2\"\n    readonly property string mdi_pac_man: \"\\uFB8B\"\n    readonly property string mdi_package: \"\\uF3D3\"\n    readonly property string mdi_package_down: \"\\uF3D4\"\n    readonly property string mdi_package_up: \"\\uF3D5\"\n    readonly property string mdi_package_variant: \"\\uF3D6\"\n    readonly property string mdi_package_variant_closed: \"\\uF3D7\"\n    readonly property string mdi_page_first: \"\\uF600\"\n    readonly property string mdi_page_last: \"\\uF601\"\n    readonly property string mdi_page_layout_body: \"\\uF6F9\"\n    readonly property string mdi_page_layout_footer: \"\\uF6FA\"\n    readonly property string mdi_page_layout_header: \"\\uF6FB\"\n    readonly property string mdi_page_layout_sidebar_left: \"\\uF6FC\"\n    readonly property string mdi_page_layout_sidebar_right: \"\\uF6FD\"\n    readonly property string mdi_page_next: \"\\uFB8C\"\n    readonly property string mdi_page_next_outline: \"\\uFB8D\"\n    readonly property string mdi_page_previous: \"\\uFB8E\"\n    readonly property string mdi_page_previous_outline: \"\\uFB8F\"\n    readonly property string mdi_palette: \"\\uF3D8\"\n    readonly property string mdi_palette_advanced: \"\\uF3D9\"\n    readonly property string mdi_palette_swatch: \"\\uF8B4\"\n    readonly property string mdi_pan: \"\\uFB90\"\n    readonly property string mdi_pan_bottom_left: \"\\uFB91\"\n    readonly property string mdi_pan_bottom_right: \"\\uFB92\"\n    readonly property string mdi_pan_down: \"\\uFB93\"\n    readonly property string mdi_pan_horizontal: \"\\uFB94\"\n    readonly property string mdi_pan_left: \"\\uFB95\"\n    readonly property string mdi_pan_right: \"\\uFB96\"\n    readonly property string mdi_pan_top_left: \"\\uFB97\"\n    readonly property string mdi_pan_top_right: \"\\uFB98\"\n    readonly property string mdi_pan_up: \"\\uFB99\"\n    readonly property string mdi_pan_vertical: \"\\uFB9A\"\n    readonly property string mdi_panda: \"\\uF3DA\"\n    readonly property string mdi_pandora: \"\\uF3DB\"\n    readonly property string mdi_panorama: \"\\uF3DC\"\n    readonly property string mdi_panorama_fisheye: \"\\uF3DD\"\n    readonly property string mdi_panorama_horizontal: \"\\uF3DE\"\n    readonly property string mdi_panorama_vertical: \"\\uF3DF\"\n    readonly property string mdi_panorama_wide_angle: \"\\uF3E0\"\n    readonly property string mdi_paper_cut_vertical: \"\\uF3E1\"\n    readonly property string mdi_paperclip: \"\\uF3E2\"\n    readonly property string mdi_parachute: \"\\uFC90\"\n    readonly property string mdi_parachute_outline: \"\\uFC91\"\n    readonly property string mdi_parking: \"\\uF3E3\"\n    readonly property string mdi_passport: \"\\uF7E2\"\n    readonly property string mdi_passport_biometric: \"\\uFDBD\"\n    readonly property string mdi_patreon: \"\\uF881\"\n    readonly property string mdi_pause: \"\\uF3E4\"\n    readonly property string mdi_pause_circle: \"\\uF3E5\"\n    readonly property string mdi_pause_circle_outline: \"\\uF3E6\"\n    readonly property string mdi_pause_octagon: \"\\uF3E7\"\n    readonly property string mdi_pause_octagon_outline: \"\\uF3E8\"\n    readonly property string mdi_paw: \"\\uF3E9\"\n    readonly property string mdi_paw_off: \"\\uF657\"\n    readonly property string mdi_paypal: \"\\uF882\"\n    readonly property string mdi_peace: \"\\uF883\"\n    readonly property string mdi_pen: \"\\uF3EA\"\n    readonly property string mdi_pen_lock: \"\\uFDBE\"\n    readonly property string mdi_pen_minus: \"\\uFDBF\"\n    readonly property string mdi_pen_off: \"\\uFDC0\"\n    readonly property string mdi_pen_plus: \"\\uFDC1\"\n    readonly property string mdi_pen_remove: \"\\uFDC2\"\n    readonly property string mdi_pencil: \"\\uF3EB\"\n    readonly property string mdi_pencil_box: \"\\uF3EC\"\n    readonly property string mdi_pencil_box_outline: \"\\uF3ED\"\n    readonly property string mdi_pencil_circle: \"\\uF6FE\"\n    readonly property string mdi_pencil_circle_outline: \"\\uF775\"\n    readonly property string mdi_pencil_lock: \"\\uF3EE\"\n    readonly property string mdi_pencil_lock_outline: \"\\uFDC3\"\n    readonly property string mdi_pencil_minus: \"\\uFDC4\"\n    readonly property string mdi_pencil_minus_outline: \"\\uFDC5\"\n    readonly property string mdi_pencil_off: \"\\uF3EF\"\n    readonly property string mdi_pencil_off_outline: \"\\uFDC6\"\n    readonly property string mdi_pencil_outline: \"\\uFC92\"\n    readonly property string mdi_pencil_plus: \"\\uFDC7\"\n    readonly property string mdi_pencil_plus_outline: \"\\uFDC8\"\n    readonly property string mdi_pencil_remove: \"\\uFDC9\"\n    readonly property string mdi_pencil_remove_outline: \"\\uFDCA\"\n    readonly property string mdi_pentagon: \"\\uF6FF\"\n    readonly property string mdi_pentagon_outline: \"\\uF700\"\n    readonly property string mdi_percent: \"\\uF3F0\"\n    readonly property string mdi_periodic_table: \"\\uF8B5\"\n    readonly property string mdi_periodic_table_co2: \"\\uF7E3\"\n    readonly property string mdi_periscope: \"\\uF747\"\n    readonly property string mdi_perspective_less: \"\\uFCFF\"\n    readonly property string mdi_perspective_more: \"\\uFD00\"\n    readonly property string mdi_pharmacy: \"\\uF3F1\"\n    readonly property string mdi_phone: \"\\uF3F2\"\n    readonly property string mdi_phone_bluetooth: \"\\uF3F3\"\n    readonly property string mdi_phone_classic: \"\\uF602\"\n    readonly property string mdi_phone_forward: \"\\uF3F4\"\n    readonly property string mdi_phone_hangup: \"\\uF3F5\"\n    readonly property string mdi_phone_in_talk: \"\\uF3F6\"\n    readonly property string mdi_phone_incoming: \"\\uF3F7\"\n    readonly property string mdi_phone_lock: \"\\uF3F8\"\n    readonly property string mdi_phone_log: \"\\uF3F9\"\n    readonly property string mdi_phone_minus: \"\\uF658\"\n    readonly property string mdi_phone_missed: \"\\uF3FA\"\n    readonly property string mdi_phone_off: \"\\uFDCB\"\n    readonly property string mdi_phone_outgoing: \"\\uF3FB\"\n    readonly property string mdi_phone_outline: \"\\uFDCC\"\n    readonly property string mdi_phone_paused: \"\\uF3FC\"\n    readonly property string mdi_phone_plus: \"\\uF659\"\n    readonly property string mdi_phone_return: \"\\uF82E\"\n    readonly property string mdi_phone_rotate_landscape: \"\\uF884\"\n    readonly property string mdi_phone_rotate_portrait: \"\\uF885\"\n    readonly property string mdi_phone_settings: \"\\uF3FD\"\n    readonly property string mdi_phone_voip: \"\\uF3FE\"\n    readonly property string mdi_pi: \"\\uF3FF\"\n    readonly property string mdi_pi_box: \"\\uF400\"\n    readonly property string mdi_pi_hole: \"\\uFDCD\"\n    readonly property string mdi_piano: \"\\uF67C\"\n    readonly property string mdi_pickaxe: \"\\uF8B6\"\n    readonly property string mdi_pier: \"\\uF886\"\n    readonly property string mdi_pier_crane: \"\\uF887\"\n    readonly property string mdi_pig: \"\\uF401\"\n    readonly property string mdi_pill: \"\\uF402\"\n    readonly property string mdi_pillar: \"\\uF701\"\n    readonly property string mdi_pin: \"\\uF403\"\n    readonly property string mdi_pin_off: \"\\uF404\"\n    readonly property string mdi_pin_off_outline: \"\\uF92F\"\n    readonly property string mdi_pin_outline: \"\\uF930\"\n    readonly property string mdi_pine_tree: \"\\uF405\"\n    readonly property string mdi_pine_tree_box: \"\\uF406\"\n    readonly property string mdi_pinterest: \"\\uF407\"\n    readonly property string mdi_pinterest_box: \"\\uF408\"\n    readonly property string mdi_pinwheel: \"\\uFAD4\"\n    readonly property string mdi_pinwheel_outline: \"\\uFAD5\"\n    readonly property string mdi_pipe: \"\\uF7E4\"\n    readonly property string mdi_pipe_disconnected: \"\\uF7E5\"\n    readonly property string mdi_pipe_leak: \"\\uF888\"\n    readonly property string mdi_pirate: \"\\uFA07\"\n    readonly property string mdi_pistol: \"\\uF702\"\n    readonly property string mdi_piston: \"\\uF889\"\n    readonly property string mdi_pizza: \"\\uF409\"\n    readonly property string mdi_play: \"\\uF40A\"\n    readonly property string mdi_play_box_outline: \"\\uF40B\"\n    readonly property string mdi_play_circle: \"\\uF40C\"\n    readonly property string mdi_play_circle_outline: \"\\uF40D\"\n    readonly property string mdi_play_network: \"\\uF88A\"\n    readonly property string mdi_play_network_outline: \"\\uFC93\"\n    readonly property string mdi_play_pause: \"\\uF40E\"\n    readonly property string mdi_play_protected_content: \"\\uF40F\"\n    readonly property string mdi_play_speed: \"\\uF8FE\"\n    readonly property string mdi_playlist_check: \"\\uF5C7\"\n    readonly property string mdi_playlist_edit: \"\\uF8FF\"\n    readonly property string mdi_playlist_minus: \"\\uF410\"\n    readonly property string mdi_playlist_music: \"\\uFC94\"\n    readonly property string mdi_playlist_music_outline: \"\\uFC95\"\n    readonly property string mdi_playlist_play: \"\\uF411\"\n    readonly property string mdi_playlist_plus: \"\\uF412\"\n    readonly property string mdi_playlist_remove: \"\\uF413\"\n    readonly property string mdi_playlist_star: \"\\uFDCE\"\n    readonly property string mdi_playstation: \"\\uF414\"\n    readonly property string mdi_plex: \"\\uF6B9\"\n    readonly property string mdi_plus: \"\\uF415\"\n    readonly property string mdi_plus_box: \"\\uF416\"\n    readonly property string mdi_plus_box_outline: \"\\uF703\"\n    readonly property string mdi_plus_circle: \"\\uF417\"\n    readonly property string mdi_plus_circle_multiple_outline: \"\\uF418\"\n    readonly property string mdi_plus_circle_outline: \"\\uF419\"\n    readonly property string mdi_plus_minus: \"\\uF991\"\n    readonly property string mdi_plus_minus_box: \"\\uF992\"\n    readonly property string mdi_plus_network: \"\\uF41A\"\n    readonly property string mdi_plus_network_outline: \"\\uFC96\"\n    readonly property string mdi_plus_one: \"\\uF41B\"\n    readonly property string mdi_plus_outline: \"\\uF704\"\n    readonly property string mdi_pocket: \"\\uF41C\"\n    readonly property string mdi_podcast: \"\\uF993\"\n    readonly property string mdi_podium: \"\\uFD01\"\n    readonly property string mdi_podium_bronze: \"\\uFD02\"\n    readonly property string mdi_podium_gold: \"\\uFD03\"\n    readonly property string mdi_podium_silver: \"\\uFD04\"\n    readonly property string mdi_point_of_sale: \"\\uFD6E\"\n    readonly property string mdi_pokeball: \"\\uF41D\"\n    readonly property string mdi_pokemon_go: \"\\uFA08\"\n    readonly property string mdi_poker_chip: \"\\uF82F\"\n    readonly property string mdi_polaroid: \"\\uF41E\"\n    readonly property string mdi_poll: \"\\uF41F\"\n    readonly property string mdi_poll_box: \"\\uF420\"\n    readonly property string mdi_polymer: \"\\uF421\"\n    readonly property string mdi_pool: \"\\uF606\"\n    readonly property string mdi_popcorn: \"\\uF422\"\n    readonly property string mdi_postage_stamp: \"\\uFC97\"\n    readonly property string mdi_pot: \"\\uF65A\"\n    readonly property string mdi_pot_mix: \"\\uF65B\"\n    readonly property string mdi_pound: \"\\uF423\"\n    readonly property string mdi_pound_box: \"\\uF424\"\n    readonly property string mdi_power: \"\\uF425\"\n    readonly property string mdi_power_cycle: \"\\uF900\"\n    readonly property string mdi_power_off: \"\\uF901\"\n    readonly property string mdi_power_on: \"\\uF902\"\n    readonly property string mdi_power_plug: \"\\uF6A4\"\n    readonly property string mdi_power_plug_off: \"\\uF6A5\"\n    readonly property string mdi_power_settings: \"\\uF426\"\n    readonly property string mdi_power_sleep: \"\\uF903\"\n    readonly property string mdi_power_socket: \"\\uF427\"\n    readonly property string mdi_power_socket_au: \"\\uF904\"\n    readonly property string mdi_power_socket_eu: \"\\uF7E6\"\n    readonly property string mdi_power_socket_uk: \"\\uF7E7\"\n    readonly property string mdi_power_socket_us: \"\\uF7E8\"\n    readonly property string mdi_power_standby: \"\\uF905\"\n    readonly property string mdi_powershell: \"\\uFA09\"\n    readonly property string mdi_prescription: \"\\uF705\"\n    readonly property string mdi_presentation: \"\\uF428\"\n    readonly property string mdi_presentation_play: \"\\uF429\"\n    readonly property string mdi_printer: \"\\uF42A\"\n    readonly property string mdi_printer_3d: \"\\uF42B\"\n    readonly property string mdi_printer_alert: \"\\uF42C\"\n    readonly property string mdi_printer_settings: \"\\uF706\"\n    readonly property string mdi_printer_wireless: \"\\uFA0A\"\n    readonly property string mdi_priority_high: \"\\uF603\"\n    readonly property string mdi_priority_low: \"\\uF604\"\n    readonly property string mdi_professional_hexagon: \"\\uF42D\"\n    readonly property string mdi_progress_alert: \"\\uFC98\"\n    readonly property string mdi_progress_check: \"\\uF994\"\n    readonly property string mdi_progress_clock: \"\\uF995\"\n    readonly property string mdi_progress_download: \"\\uF996\"\n    readonly property string mdi_progress_upload: \"\\uF997\"\n    readonly property string mdi_progress_wrench: \"\\uFC99\"\n    readonly property string mdi_projector: \"\\uF42E\"\n    readonly property string mdi_projector_screen: \"\\uF42F\"\n    readonly property string mdi_publish: \"\\uF6A6\"\n    readonly property string mdi_pulse: \"\\uF430\"\n    readonly property string mdi_pumpkin: \"\\uFB9B\"\n    readonly property string mdi_puzzle: \"\\uF431\"\n    readonly property string mdi_puzzle_outline: \"\\uFA65\"\n    readonly property string mdi_qi: \"\\uF998\"\n    readonly property string mdi_qqchat: \"\\uF605\"\n    readonly property string mdi_qrcode: \"\\uF432\"\n    readonly property string mdi_qrcode_edit: \"\\uF8B7\"\n    readonly property string mdi_qrcode_scan: \"\\uF433\"\n    readonly property string mdi_quadcopter: \"\\uF434\"\n    readonly property string mdi_quality_high: \"\\uF435\"\n    readonly property string mdi_quality_low: \"\\uFA0B\"\n    readonly property string mdi_quality_medium: \"\\uFA0C\"\n    readonly property string mdi_quicktime: \"\\uF436\"\n    readonly property string mdi_quora: \"\\uFD05\"\n    readonly property string mdi_rabbit: \"\\uF906\"\n    readonly property string mdi_racing_helmet: \"\\uFD6F\"\n    readonly property string mdi_racquetball: \"\\uFD70\"\n    readonly property string mdi_radar: \"\\uF437\"\n    readonly property string mdi_radiator: \"\\uF438\"\n    readonly property string mdi_radiator_disabled: \"\\uFAD6\"\n    readonly property string mdi_radiator_off: \"\\uFAD7\"\n    readonly property string mdi_radio: \"\\uF439\"\n    readonly property string mdi_radio_am: \"\\uFC9A\"\n    readonly property string mdi_radio_fm: \"\\uFC9B\"\n    readonly property string mdi_radio_handheld: \"\\uF43A\"\n    readonly property string mdi_radio_tower: \"\\uF43B\"\n    readonly property string mdi_radioactive: \"\\uF43C\"\n    readonly property string mdi_radiobox_blank: \"\\uF43D\"\n    readonly property string mdi_radiobox_marked: \"\\uF43E\"\n    readonly property string mdi_radius: \"\\uFC9C\"\n    readonly property string mdi_radius_outline: \"\\uFC9D\"\n    readonly property string mdi_raspberry_pi: \"\\uF43F\"\n    readonly property string mdi_ray_end: \"\\uF440\"\n    readonly property string mdi_ray_end_arrow: \"\\uF441\"\n    readonly property string mdi_ray_start: \"\\uF442\"\n    readonly property string mdi_ray_start_arrow: \"\\uF443\"\n    readonly property string mdi_ray_start_end: \"\\uF444\"\n    readonly property string mdi_ray_vertex: \"\\uF445\"\n    readonly property string mdi_react: \"\\uF707\"\n    readonly property string mdi_read: \"\\uF447\"\n    readonly property string mdi_receipt: \"\\uF449\"\n    readonly property string mdi_record: \"\\uF44A\"\n    readonly property string mdi_record_player: \"\\uF999\"\n    readonly property string mdi_record_rec: \"\\uF44B\"\n    readonly property string mdi_recycle: \"\\uF44C\"\n    readonly property string mdi_reddit: \"\\uF44D\"\n    readonly property string mdi_redo: \"\\uF44E\"\n    readonly property string mdi_redo_variant: \"\\uF44F\"\n    readonly property string mdi_reflect_horizontal: \"\\uFA0D\"\n    readonly property string mdi_reflect_vertical: \"\\uFA0E\"\n    readonly property string mdi_refresh: \"\\uF450\"\n    readonly property string mdi_regex: \"\\uF451\"\n    readonly property string mdi_registered_trademark: \"\\uFA66\"\n    readonly property string mdi_relative_scale: \"\\uF452\"\n    readonly property string mdi_reload: \"\\uF453\"\n    readonly property string mdi_reminder: \"\\uF88B\"\n    readonly property string mdi_remote: \"\\uF454\"\n    readonly property string mdi_remote_desktop: \"\\uF8B8\"\n    readonly property string mdi_rename_box: \"\\uF455\"\n    readonly property string mdi_reorder_horizontal: \"\\uF687\"\n    readonly property string mdi_reorder_vertical: \"\\uF688\"\n    readonly property string mdi_repeat: \"\\uF456\"\n    readonly property string mdi_repeat_off: \"\\uF457\"\n    readonly property string mdi_repeat_once: \"\\uF458\"\n    readonly property string mdi_replay: \"\\uF459\"\n    readonly property string mdi_reply: \"\\uF45A\"\n    readonly property string mdi_reply_all: \"\\uF45B\"\n    readonly property string mdi_reproduction: \"\\uF45C\"\n    readonly property string mdi_resistor: \"\\uFB1F\"\n    readonly property string mdi_resistor_nodes: \"\\uFB20\"\n    readonly property string mdi_resize: \"\\uFA67\"\n    readonly property string mdi_resize_bottom_right: \"\\uF45D\"\n    readonly property string mdi_responsive: \"\\uF45E\"\n    readonly property string mdi_restart: \"\\uF708\"\n    readonly property string mdi_restart_off: \"\\uFD71\"\n    readonly property string mdi_restore: \"\\uF99A\"\n    readonly property string mdi_restore_clock: \"\\uF6A7\"\n    readonly property string mdi_rewind: \"\\uF45F\"\n    readonly property string mdi_rewind_10: \"\\uFD06\"\n    readonly property string mdi_rewind_30: \"\\uFD72\"\n    readonly property string mdi_rewind_outline: \"\\uF709\"\n    readonly property string mdi_rhombus: \"\\uF70A\"\n    readonly property string mdi_rhombus_medium: \"\\uFA0F\"\n    readonly property string mdi_rhombus_outline: \"\\uF70B\"\n    readonly property string mdi_rhombus_split: \"\\uFA10\"\n    readonly property string mdi_ribbon: \"\\uF460\"\n    readonly property string mdi_rice: \"\\uF7E9\"\n    readonly property string mdi_ring: \"\\uF7EA\"\n    readonly property string mdi_road: \"\\uF461\"\n    readonly property string mdi_road_variant: \"\\uF462\"\n    readonly property string mdi_robot: \"\\uF6A8\"\n    readonly property string mdi_robot_industrial: \"\\uFB21\"\n    readonly property string mdi_robot_vacuum: \"\\uF70C\"\n    readonly property string mdi_robot_vacuum_variant: \"\\uF907\"\n    readonly property string mdi_rocket: \"\\uF463\"\n    readonly property string mdi_roller_skate: \"\\uFD07\"\n    readonly property string mdi_rollerblade: \"\\uFD08\"\n    readonly property string mdi_rollupjs: \"\\uFB9C\"\n    readonly property string mdi_room_service: \"\\uF88C\"\n    readonly property string mdi_room_service_outline: \"\\uFD73\"\n    readonly property string mdi_rotate_3d: \"\\uF464\"\n    readonly property string mdi_rotate_left: \"\\uF465\"\n    readonly property string mdi_rotate_left_variant: \"\\uF466\"\n    readonly property string mdi_rotate_orbit: \"\\uFD74\"\n    readonly property string mdi_rotate_right: \"\\uF467\"\n    readonly property string mdi_rotate_right_variant: \"\\uF468\"\n    readonly property string mdi_rounded_corner: \"\\uF607\"\n    readonly property string mdi_router_wireless: \"\\uF469\"\n    readonly property string mdi_router_wireless_settings: \"\\uFA68\"\n    readonly property string mdi_routes: \"\\uF46A\"\n    readonly property string mdi_rowing: \"\\uF608\"\n    readonly property string mdi_rss: \"\\uF46B\"\n    readonly property string mdi_rss_box: \"\\uF46C\"\n    readonly property string mdi_ruby: \"\\uFD09\"\n    readonly property string mdi_rugby: \"\\uFD75\"\n    readonly property string mdi_ruler: \"\\uF46D\"\n    readonly property string mdi_ruler_square: \"\\uFC9E\"\n    readonly property string mdi_run: \"\\uF70D\"\n    readonly property string mdi_run_fast: \"\\uF46E\"\n    readonly property string mdi_sack: \"\\uFD0A\"\n    readonly property string mdi_sack_percent: \"\\uFD0B\"\n    readonly property string mdi_safe: \"\\uFA69\"\n    readonly property string mdi_safety_goggles: \"\\uFD0C\"\n    readonly property string mdi_sale: \"\\uF46F\"\n    readonly property string mdi_salesforce: \"\\uF88D\"\n    readonly property string mdi_sass: \"\\uF7EB\"\n    readonly property string mdi_satellite: \"\\uF470\"\n    readonly property string mdi_satellite_uplink: \"\\uF908\"\n    readonly property string mdi_satellite_variant: \"\\uF471\"\n    readonly property string mdi_sausage: \"\\uF8B9\"\n    readonly property string mdi_saxophone: \"\\uF609\"\n    readonly property string mdi_scale: \"\\uF472\"\n    readonly property string mdi_scale_balance: \"\\uF5D1\"\n    readonly property string mdi_scale_bathroom: \"\\uF473\"\n    readonly property string mdi_scanner: \"\\uF6AA\"\n    readonly property string mdi_scanner_off: \"\\uF909\"\n    readonly property string mdi_school: \"\\uF474\"\n    readonly property string mdi_scissors_cutting: \"\\uFA6A\"\n    readonly property string mdi_screen_rotation: \"\\uF475\"\n    readonly property string mdi_screen_rotation_lock: \"\\uF476\"\n    readonly property string mdi_screw_flat_top: \"\\uFDCF\"\n    readonly property string mdi_screw_lag: \"\\uFDD0\"\n    readonly property string mdi_screw_machine_flat_top: \"\\uFDD1\"\n    readonly property string mdi_screw_machine_round_top: \"\\uFDD2\"\n    readonly property string mdi_screw_round_top: \"\\uFDD3\"\n    readonly property string mdi_screwdriver: \"\\uF477\"\n    readonly property string mdi_script: \"\\uFB9D\"\n    readonly property string mdi_script_outline: \"\\uF478\"\n    readonly property string mdi_script_text: \"\\uFB9E\"\n    readonly property string mdi_script_text_outline: \"\\uFB9F\"\n    readonly property string mdi_sd: \"\\uF479\"\n    readonly property string mdi_seal: \"\\uF47A\"\n    readonly property string mdi_search_web: \"\\uF70E\"\n    readonly property string mdi_seat: \"\\uFC9F\"\n    readonly property string mdi_seat_flat: \"\\uF47B\"\n    readonly property string mdi_seat_flat_angled: \"\\uF47C\"\n    readonly property string mdi_seat_individual_suite: \"\\uF47D\"\n    readonly property string mdi_seat_legroom_extra: \"\\uF47E\"\n    readonly property string mdi_seat_legroom_normal: \"\\uF47F\"\n    readonly property string mdi_seat_legroom_reduced: \"\\uF480\"\n    readonly property string mdi_seat_outline: \"\\uFCA0\"\n    readonly property string mdi_seat_recline_extra: \"\\uF481\"\n    readonly property string mdi_seat_recline_normal: \"\\uF482\"\n    readonly property string mdi_seatbelt: \"\\uFCA1\"\n    readonly property string mdi_security: \"\\uF483\"\n    readonly property string mdi_security_network: \"\\uF484\"\n    readonly property string mdi_select: \"\\uF485\"\n    readonly property string mdi_select_all: \"\\uF486\"\n    readonly property string mdi_select_color: \"\\uFD0D\"\n    readonly property string mdi_select_compare: \"\\uFAD8\"\n    readonly property string mdi_select_drag: \"\\uFA6B\"\n    readonly property string mdi_select_inverse: \"\\uF487\"\n    readonly property string mdi_select_off: \"\\uF488\"\n    readonly property string mdi_selection: \"\\uF489\"\n    readonly property string mdi_selection_drag: \"\\uFA6C\"\n    readonly property string mdi_selection_ellipse: \"\\uFD0E\"\n    readonly property string mdi_selection_off: \"\\uF776\"\n    readonly property string mdi_send: \"\\uF48A\"\n    readonly property string mdi_send_circle: \"\\uFDD4\"\n    readonly property string mdi_send_circle_outline: \"\\uFDD5\"\n    readonly property string mdi_send_lock: \"\\uF7EC\"\n    readonly property string mdi_serial_port: \"\\uF65C\"\n    readonly property string mdi_server: \"\\uF48B\"\n    readonly property string mdi_server_minus: \"\\uF48C\"\n    readonly property string mdi_server_network: \"\\uF48D\"\n    readonly property string mdi_server_network_off: \"\\uF48E\"\n    readonly property string mdi_server_off: \"\\uF48F\"\n    readonly property string mdi_server_plus: \"\\uF490\"\n    readonly property string mdi_server_remove: \"\\uF491\"\n    readonly property string mdi_server_security: \"\\uF492\"\n    readonly property string mdi_set_all: \"\\uF777\"\n    readonly property string mdi_set_center: \"\\uF778\"\n    readonly property string mdi_set_center_right: \"\\uF779\"\n    readonly property string mdi_set_left: \"\\uF77A\"\n    readonly property string mdi_set_left_center: \"\\uF77B\"\n    readonly property string mdi_set_left_right: \"\\uF77C\"\n    readonly property string mdi_set_none: \"\\uF77D\"\n    readonly property string mdi_set_right: \"\\uF77E\"\n    readonly property string mdi_set_top_box: \"\\uF99E\"\n    readonly property string mdi_settings: \"\\uF493\"\n    readonly property string mdi_settings_box: \"\\uF494\"\n    readonly property string mdi_settings_helper: \"\\uFA6D\"\n    readonly property string mdi_settings_outline: \"\\uF8BA\"\n    readonly property string mdi_shape: \"\\uF830\"\n    readonly property string mdi_shape_circle_plus: \"\\uF65D\"\n    readonly property string mdi_shape_outline: \"\\uF831\"\n    readonly property string mdi_shape_plus: \"\\uF495\"\n    readonly property string mdi_shape_polygon_plus: \"\\uF65E\"\n    readonly property string mdi_shape_rectangle_plus: \"\\uF65F\"\n    readonly property string mdi_shape_square_plus: \"\\uF660\"\n    readonly property string mdi_share: \"\\uF496\"\n    readonly property string mdi_share_outline: \"\\uF931\"\n    readonly property string mdi_share_variant: \"\\uF497\"\n    readonly property string mdi_sheep: \"\\uFCA2\"\n    readonly property string mdi_shield: \"\\uF498\"\n    readonly property string mdi_shield_account: \"\\uF88E\"\n    readonly property string mdi_shield_account_outline: \"\\uFA11\"\n    readonly property string mdi_shield_airplane: \"\\uF6BA\"\n    readonly property string mdi_shield_airplane_outline: \"\\uFCA3\"\n    readonly property string mdi_shield_check: \"\\uF565\"\n    readonly property string mdi_shield_check_outline: \"\\uFCA4\"\n    readonly property string mdi_shield_cross: \"\\uFCA5\"\n    readonly property string mdi_shield_cross_outline: \"\\uFCA6\"\n    readonly property string mdi_shield_half_full: \"\\uF77F\"\n    readonly property string mdi_shield_home: \"\\uF689\"\n    readonly property string mdi_shield_home_outline: \"\\uFCA7\"\n    readonly property string mdi_shield_key: \"\\uFBA0\"\n    readonly property string mdi_shield_key_outline: \"\\uFBA1\"\n    readonly property string mdi_shield_link_variant: \"\\uFD0F\"\n    readonly property string mdi_shield_link_variant_outline: \"\\uFD10\"\n    readonly property string mdi_shield_lock: \"\\uF99C\"\n    readonly property string mdi_shield_lock_outline: \"\\uFCA8\"\n    readonly property string mdi_shield_off: \"\\uF99D\"\n    readonly property string mdi_shield_off_outline: \"\\uF99B\"\n    readonly property string mdi_shield_outline: \"\\uF499\"\n    readonly property string mdi_shield_plus: \"\\uFAD9\"\n    readonly property string mdi_shield_plus_outline: \"\\uFADA\"\n    readonly property string mdi_shield_remove: \"\\uFADB\"\n    readonly property string mdi_shield_remove_outline: \"\\uFADC\"\n    readonly property string mdi_shield_search: \"\\uFD76\"\n    readonly property string mdi_ship_wheel: \"\\uF832\"\n    readonly property string mdi_shoe_formal: \"\\uFB22\"\n    readonly property string mdi_shoe_heel: \"\\uFB23\"\n    readonly property string mdi_shoe_print: \"\\uFDD6\"\n    readonly property string mdi_shopify: \"\\uFADD\"\n    readonly property string mdi_shopping: \"\\uF49A\"\n    readonly property string mdi_shopping_music: \"\\uF49B\"\n    readonly property string mdi_shovel: \"\\uF70F\"\n    readonly property string mdi_shovel_off: \"\\uF710\"\n    readonly property string mdi_shower: \"\\uF99F\"\n    readonly property string mdi_shower_head: \"\\uF9A0\"\n    readonly property string mdi_shredder: \"\\uF49C\"\n    readonly property string mdi_shuffle: \"\\uF49D\"\n    readonly property string mdi_shuffle_disabled: \"\\uF49E\"\n    readonly property string mdi_shuffle_variant: \"\\uF49F\"\n    readonly property string mdi_sigma: \"\\uF4A0\"\n    readonly property string mdi_sigma_lower: \"\\uF62B\"\n    readonly property string mdi_sign_caution: \"\\uF4A1\"\n    readonly property string mdi_sign_direction: \"\\uF780\"\n    readonly property string mdi_sign_text: \"\\uF781\"\n    readonly property string mdi_signal: \"\\uF4A2\"\n    readonly property string mdi_signal_2g: \"\\uF711\"\n    readonly property string mdi_signal_3g: \"\\uF712\"\n    readonly property string mdi_signal_4g: \"\\uF713\"\n    readonly property string mdi_signal_5g: \"\\uFA6E\"\n    readonly property string mdi_signal_cellular_1: \"\\uF8BB\"\n    readonly property string mdi_signal_cellular_2: \"\\uF8BC\"\n    readonly property string mdi_signal_cellular_3: \"\\uF8BD\"\n    readonly property string mdi_signal_cellular_outline: \"\\uF8BE\"\n    readonly property string mdi_signal_hspa: \"\\uF714\"\n    readonly property string mdi_signal_hspa_plus: \"\\uF715\"\n    readonly property string mdi_signal_off: \"\\uF782\"\n    readonly property string mdi_signal_variant: \"\\uF60A\"\n    readonly property string mdi_signature: \"\\uFDD7\"\n    readonly property string mdi_signature_freehand: \"\\uFDD8\"\n    readonly property string mdi_signature_image: \"\\uFDD9\"\n    readonly property string mdi_signature_text: \"\\uFDDA\"\n    readonly property string mdi_silo: \"\\uFB24\"\n    readonly property string mdi_silverware: \"\\uF4A3\"\n    readonly property string mdi_silverware_fork: \"\\uF4A4\"\n    readonly property string mdi_silverware_fork_knife: \"\\uFA6F\"\n    readonly property string mdi_silverware_spoon: \"\\uF4A5\"\n    readonly property string mdi_silverware_variant: \"\\uF4A6\"\n    readonly property string mdi_sim: \"\\uF4A7\"\n    readonly property string mdi_sim_alert: \"\\uF4A8\"\n    readonly property string mdi_sim_off: \"\\uF4A9\"\n    readonly property string mdi_sina_weibo: \"\\uFADE\"\n    readonly property string mdi_sitemap: \"\\uF4AA\"\n    readonly property string mdi_skate: \"\\uFD11\"\n    readonly property string mdi_skew_less: \"\\uFD12\"\n    readonly property string mdi_skew_more: \"\\uFD13\"\n    readonly property string mdi_skip_backward: \"\\uF4AB\"\n    readonly property string mdi_skip_forward: \"\\uF4AC\"\n    readonly property string mdi_skip_next: \"\\uF4AD\"\n    readonly property string mdi_skip_next_circle: \"\\uF661\"\n    readonly property string mdi_skip_next_circle_outline: \"\\uF662\"\n    readonly property string mdi_skip_previous: \"\\uF4AE\"\n    readonly property string mdi_skip_previous_circle: \"\\uF663\"\n    readonly property string mdi_skip_previous_circle_outline: \"\\uF664\"\n    readonly property string mdi_skull: \"\\uF68B\"\n    readonly property string mdi_skull_crossbones: \"\\uFBA2\"\n    readonly property string mdi_skull_crossbones_outline: \"\\uFBA3\"\n    readonly property string mdi_skull_outline: \"\\uFBA4\"\n    readonly property string mdi_skype: \"\\uF4AF\"\n    readonly property string mdi_skype_business: \"\\uF4B0\"\n    readonly property string mdi_slack: \"\\uF4B1\"\n    readonly property string mdi_slackware: \"\\uF90A\"\n    readonly property string mdi_sleep: \"\\uF4B2\"\n    readonly property string mdi_sleep_off: \"\\uF4B3\"\n    readonly property string mdi_slope_downhill: \"\\uFDDB\"\n    readonly property string mdi_slope_uphill: \"\\uFDDC\"\n    readonly property string mdi_smog: \"\\uFA70\"\n    readonly property string mdi_smoke_detector: \"\\uF392\"\n    readonly property string mdi_smoking: \"\\uF4B4\"\n    readonly property string mdi_smoking_off: \"\\uF4B5\"\n    readonly property string mdi_snapchat: \"\\uF4B6\"\n    readonly property string mdi_snowflake: \"\\uF716\"\n    readonly property string mdi_snowman: \"\\uF4B7\"\n    readonly property string mdi_soccer: \"\\uF4B8\"\n    readonly property string mdi_soccer_field: \"\\uF833\"\n    readonly property string mdi_sofa: \"\\uF4B9\"\n    readonly property string mdi_solar_panel: \"\\uFD77\"\n    readonly property string mdi_solar_panel_large: \"\\uFD78\"\n    readonly property string mdi_solar_power: \"\\uFA71\"\n    readonly property string mdi_solid: \"\\uF68C\"\n    readonly property string mdi_sort: \"\\uF4BA\"\n    readonly property string mdi_sort_alphabetical: \"\\uF4BB\"\n    readonly property string mdi_sort_ascending: \"\\uF4BC\"\n    readonly property string mdi_sort_descending: \"\\uF4BD\"\n    readonly property string mdi_sort_numeric: \"\\uF4BE\"\n    readonly property string mdi_sort_variant: \"\\uF4BF\"\n    readonly property string mdi_sort_variant_lock: \"\\uFCA9\"\n    readonly property string mdi_sort_variant_lock_open: \"\\uFCAA\"\n    readonly property string mdi_soundcloud: \"\\uF4C0\"\n    readonly property string mdi_source_branch: \"\\uF62C\"\n    readonly property string mdi_source_commit: \"\\uF717\"\n    readonly property string mdi_source_commit_end: \"\\uF718\"\n    readonly property string mdi_source_commit_end_local: \"\\uF719\"\n    readonly property string mdi_source_commit_local: \"\\uF71A\"\n    readonly property string mdi_source_commit_next_local: \"\\uF71B\"\n    readonly property string mdi_source_commit_start: \"\\uF71C\"\n    readonly property string mdi_source_commit_start_next_local: \"\\uF71D\"\n    readonly property string mdi_source_fork: \"\\uF4C1\"\n    readonly property string mdi_source_merge: \"\\uF62D\"\n    readonly property string mdi_source_pull: \"\\uF4C2\"\n    readonly property string mdi_source_repository: \"\\uFCAB\"\n    readonly property string mdi_source_repository_multiple: \"\\uFCAC\"\n    readonly property string mdi_soy_sauce: \"\\uF7ED\"\n    readonly property string mdi_spa: \"\\uFCAD\"\n    readonly property string mdi_spa_outline: \"\\uFCAE\"\n    readonly property string mdi_space_invaders: \"\\uFBA5\"\n    readonly property string mdi_speaker: \"\\uF4C3\"\n    readonly property string mdi_speaker_bluetooth: \"\\uF9A1\"\n    readonly property string mdi_speaker_multiple: \"\\uFD14\"\n    readonly property string mdi_speaker_off: \"\\uF4C4\"\n    readonly property string mdi_speaker_wireless: \"\\uF71E\"\n    readonly property string mdi_speedometer: \"\\uF4C5\"\n    readonly property string mdi_spellcheck: \"\\uF4C6\"\n    readonly property string mdi_spider_web: \"\\uFBA6\"\n    readonly property string mdi_spotify: \"\\uF4C7\"\n    readonly property string mdi_spotlight: \"\\uF4C8\"\n    readonly property string mdi_spotlight_beam: \"\\uF4C9\"\n    readonly property string mdi_spray: \"\\uF665\"\n    readonly property string mdi_spray_bottle: \"\\uFADF\"\n    readonly property string mdi_square: \"\\uF763\"\n    readonly property string mdi_square_edit_outline: \"\\uF90B\"\n    readonly property string mdi_square_inc: \"\\uF4CA\"\n    readonly property string mdi_square_inc_cash: \"\\uF4CB\"\n    readonly property string mdi_square_medium: \"\\uFA12\"\n    readonly property string mdi_square_medium_outline: \"\\uFA13\"\n    readonly property string mdi_square_outline: \"\\uF762\"\n    readonly property string mdi_square_root: \"\\uF783\"\n    readonly property string mdi_square_root_box: \"\\uF9A2\"\n    readonly property string mdi_square_small: \"\\uFA14\"\n    readonly property string mdi_squeegee: \"\\uFAE0\"\n    readonly property string mdi_ssh: \"\\uF8BF\"\n    readonly property string mdi_stack_exchange: \"\\uF60B\"\n    readonly property string mdi_stack_overflow: \"\\uF4CC\"\n    readonly property string mdi_stadium: \"\\uF71F\"\n    readonly property string mdi_stairs: \"\\uF4CD\"\n    readonly property string mdi_stamper: \"\\uFD15\"\n    readonly property string mdi_standard_definition: \"\\uF7EE\"\n    readonly property string mdi_star: \"\\uF4CE\"\n    readonly property string mdi_star_box: \"\\uFA72\"\n    readonly property string mdi_star_box_outline: \"\\uFA73\"\n    readonly property string mdi_star_circle: \"\\uF4CF\"\n    readonly property string mdi_star_circle_outline: \"\\uF9A3\"\n    readonly property string mdi_star_face: \"\\uF9A4\"\n    readonly property string mdi_star_four_points: \"\\uFAE1\"\n    readonly property string mdi_star_four_points_outline: \"\\uFAE2\"\n    readonly property string mdi_star_half: \"\\uF4D0\"\n    readonly property string mdi_star_off: \"\\uF4D1\"\n    readonly property string mdi_star_outline: \"\\uF4D2\"\n    readonly property string mdi_star_three_points: \"\\uFAE3\"\n    readonly property string mdi_star_three_points_outline: \"\\uFAE4\"\n    readonly property string mdi_steam: \"\\uF4D3\"\n    readonly property string mdi_steam_box: \"\\uF90C\"\n    readonly property string mdi_steering: \"\\uF4D4\"\n    readonly property string mdi_steering_off: \"\\uF90D\"\n    readonly property string mdi_step_backward: \"\\uF4D5\"\n    readonly property string mdi_step_backward_2: \"\\uF4D6\"\n    readonly property string mdi_step_forward: \"\\uF4D7\"\n    readonly property string mdi_step_forward_2: \"\\uF4D8\"\n    readonly property string mdi_stethoscope: \"\\uF4D9\"\n    readonly property string mdi_sticker: \"\\uF5D0\"\n    readonly property string mdi_sticker_emoji: \"\\uF784\"\n    readonly property string mdi_stocking: \"\\uF4DA\"\n    readonly property string mdi_stop: \"\\uF4DB\"\n    readonly property string mdi_stop_circle: \"\\uF666\"\n    readonly property string mdi_stop_circle_outline: \"\\uF667\"\n    readonly property string mdi_store: \"\\uF4DC\"\n    readonly property string mdi_store_24_hour: \"\\uF4DD\"\n    readonly property string mdi_stove: \"\\uF4DE\"\n    readonly property string mdi_strava: \"\\uFB25\"\n    readonly property string mdi_subdirectory_arrow_left: \"\\uF60C\"\n    readonly property string mdi_subdirectory_arrow_right: \"\\uF60D\"\n    readonly property string mdi_subtitles: \"\\uFA15\"\n    readonly property string mdi_subtitles_outline: \"\\uFA16\"\n    readonly property string mdi_subway: \"\\uF6AB\"\n    readonly property string mdi_subway_alert_variant: \"\\uFD79\"\n    readonly property string mdi_subway_variant: \"\\uF4DF\"\n    readonly property string mdi_summit: \"\\uF785\"\n    readonly property string mdi_sunglasses: \"\\uF4E0\"\n    readonly property string mdi_surround_sound: \"\\uF5C5\"\n    readonly property string mdi_surround_sound_2_0: \"\\uF7EF\"\n    readonly property string mdi_surround_sound_3_1: \"\\uF7F0\"\n    readonly property string mdi_surround_sound_5_1: \"\\uF7F1\"\n    readonly property string mdi_surround_sound_7_1: \"\\uF7F2\"\n    readonly property string mdi_svg: \"\\uF720\"\n    readonly property string mdi_swap_horizontal: \"\\uF4E1\"\n    readonly property string mdi_swap_horizontal_bold: \"\\uFBA9\"\n    readonly property string mdi_swap_horizontal_variant: \"\\uF8C0\"\n    readonly property string mdi_swap_vertical: \"\\uF4E2\"\n    readonly property string mdi_swap_vertical_bold: \"\\uFBAA\"\n    readonly property string mdi_swap_vertical_variant: \"\\uF8C1\"\n    readonly property string mdi_swim: \"\\uF4E3\"\n    readonly property string mdi_switch: \"\\uF4E4\"\n    readonly property string mdi_sword: \"\\uF4E5\"\n    readonly property string mdi_sword_cross: \"\\uF786\"\n    readonly property string mdi_symfony: \"\\uFAE5\"\n    readonly property string mdi_sync: \"\\uF4E6\"\n    readonly property string mdi_sync_alert: \"\\uF4E7\"\n    readonly property string mdi_sync_off: \"\\uF4E8\"\n    readonly property string mdi_tab: \"\\uF4E9\"\n    readonly property string mdi_tab_minus: \"\\uFB26\"\n    readonly property string mdi_tab_plus: \"\\uF75B\"\n    readonly property string mdi_tab_remove: \"\\uFB27\"\n    readonly property string mdi_tab_unselected: \"\\uF4EA\"\n    readonly property string mdi_table: \"\\uF4EB\"\n    readonly property string mdi_table_border: \"\\uFA17\"\n    readonly property string mdi_table_column: \"\\uF834\"\n    readonly property string mdi_table_column_plus_after: \"\\uF4EC\"\n    readonly property string mdi_table_column_plus_before: \"\\uF4ED\"\n    readonly property string mdi_table_column_remove: \"\\uF4EE\"\n    readonly property string mdi_table_column_width: \"\\uF4EF\"\n    readonly property string mdi_table_edit: \"\\uF4F0\"\n    readonly property string mdi_table_large: \"\\uF4F1\"\n    readonly property string mdi_table_merge_cells: \"\\uF9A5\"\n    readonly property string mdi_table_of_contents: \"\\uF835\"\n    readonly property string mdi_table_plus: \"\\uFA74\"\n    readonly property string mdi_table_remove: \"\\uFA75\"\n    readonly property string mdi_table_row: \"\\uF836\"\n    readonly property string mdi_table_row_height: \"\\uF4F2\"\n    readonly property string mdi_table_row_plus_after: \"\\uF4F3\"\n    readonly property string mdi_table_row_plus_before: \"\\uF4F4\"\n    readonly property string mdi_table_row_remove: \"\\uF4F5\"\n    readonly property string mdi_table_search: \"\\uF90E\"\n    readonly property string mdi_table_settings: \"\\uF837\"\n    readonly property string mdi_tablet: \"\\uF4F6\"\n    readonly property string mdi_tablet_android: \"\\uF4F7\"\n    readonly property string mdi_tablet_cellphone: \"\\uF9A6\"\n    readonly property string mdi_tablet_ipad: \"\\uF4F8\"\n    readonly property string mdi_taco: \"\\uF761\"\n    readonly property string mdi_tag: \"\\uF4F9\"\n    readonly property string mdi_tag_faces: \"\\uF4FA\"\n    readonly property string mdi_tag_heart: \"\\uF68A\"\n    readonly property string mdi_tag_heart_outline: \"\\uFBAB\"\n    readonly property string mdi_tag_minus: \"\\uF90F\"\n    readonly property string mdi_tag_multiple: \"\\uF4FB\"\n    readonly property string mdi_tag_outline: \"\\uF4FC\"\n    readonly property string mdi_tag_plus: \"\\uF721\"\n    readonly property string mdi_tag_remove: \"\\uF722\"\n    readonly property string mdi_tag_text_outline: \"\\uF4FD\"\n    readonly property string mdi_tank: \"\\uFD16\"\n    readonly property string mdi_tape_measure: \"\\uFB28\"\n    readonly property string mdi_target: \"\\uF4FE\"\n    readonly property string mdi_target_account: \"\\uFBAC\"\n    readonly property string mdi_target_variant: \"\\uFA76\"\n    readonly property string mdi_taxi: \"\\uF4FF\"\n    readonly property string mdi_tea: \"\\uFD7A\"\n    readonly property string mdi_tea_outline: \"\\uFD7B\"\n    readonly property string mdi_teach: \"\\uF88F\"\n    readonly property string mdi_teamviewer: \"\\uF500\"\n    readonly property string mdi_telegram: \"\\uF501\"\n    readonly property string mdi_telescope: \"\\uFB29\"\n    readonly property string mdi_television: \"\\uF502\"\n    readonly property string mdi_television_box: \"\\uF838\"\n    readonly property string mdi_television_classic: \"\\uF7F3\"\n    readonly property string mdi_television_classic_off: \"\\uF839\"\n    readonly property string mdi_television_guide: \"\\uF503\"\n    readonly property string mdi_television_off: \"\\uF83A\"\n    readonly property string mdi_temperature_celsius: \"\\uF504\"\n    readonly property string mdi_temperature_fahrenheit: \"\\uF505\"\n    readonly property string mdi_temperature_kelvin: \"\\uF506\"\n    readonly property string mdi_tennis: \"\\uFD7C\"\n    readonly property string mdi_tennis_ball: \"\\uF507\"\n    readonly property string mdi_tent: \"\\uF508\"\n    readonly property string mdi_terrain: \"\\uF509\"\n    readonly property string mdi_test_tube: \"\\uF668\"\n    readonly property string mdi_test_tube_empty: \"\\uF910\"\n    readonly property string mdi_test_tube_off: \"\\uF911\"\n    readonly property string mdi_text: \"\\uF9A7\"\n    readonly property string mdi_text_shadow: \"\\uF669\"\n    readonly property string mdi_text_short: \"\\uF9A8\"\n    readonly property string mdi_text_subject: \"\\uF9A9\"\n    readonly property string mdi_text_to_speech: \"\\uF50A\"\n    readonly property string mdi_text_to_speech_off: \"\\uF50B\"\n    readonly property string mdi_textbox: \"\\uF60E\"\n    readonly property string mdi_textbox_password: \"\\uF7F4\"\n    readonly property string mdi_texture: \"\\uF50C\"\n    readonly property string mdi_theater: \"\\uF50D\"\n    readonly property string mdi_theme_light_dark: \"\\uF50E\"\n    readonly property string mdi_thermometer: \"\\uF50F\"\n    readonly property string mdi_thermometer_alert: \"\\uFDDD\"\n    readonly property string mdi_thermometer_chevron_down: \"\\uFDDE\"\n    readonly property string mdi_thermometer_chevron_up: \"\\uFDDF\"\n    readonly property string mdi_thermometer_lines: \"\\uF510\"\n    readonly property string mdi_thermometer_minus: \"\\uFDE0\"\n    readonly property string mdi_thermometer_plus: \"\\uFDE1\"\n    readonly property string mdi_thermostat: \"\\uF393\"\n    readonly property string mdi_thermostat_box: \"\\uF890\"\n    readonly property string mdi_thought_bubble: \"\\uF7F5\"\n    readonly property string mdi_thought_bubble_outline: \"\\uF7F6\"\n    readonly property string mdi_thumb_down: \"\\uF511\"\n    readonly property string mdi_thumb_down_outline: \"\\uF512\"\n    readonly property string mdi_thumb_up: \"\\uF513\"\n    readonly property string mdi_thumb_up_outline: \"\\uF514\"\n    readonly property string mdi_thumbs_up_down: \"\\uF515\"\n    readonly property string mdi_ticket: \"\\uF516\"\n    readonly property string mdi_ticket_account: \"\\uF517\"\n    readonly property string mdi_ticket_confirmation: \"\\uF518\"\n    readonly property string mdi_ticket_outline: \"\\uF912\"\n    readonly property string mdi_ticket_percent: \"\\uF723\"\n    readonly property string mdi_tie: \"\\uF519\"\n    readonly property string mdi_tilde: \"\\uF724\"\n    readonly property string mdi_timelapse: \"\\uF51A\"\n    readonly property string mdi_timeline: \"\\uFBAD\"\n    readonly property string mdi_timeline_outline: \"\\uFBAE\"\n    readonly property string mdi_timeline_text: \"\\uFBAF\"\n    readonly property string mdi_timeline_text_outline: \"\\uFBB0\"\n    readonly property string mdi_timer: \"\\uF51B\"\n    readonly property string mdi_timer_10: \"\\uF51C\"\n    readonly property string mdi_timer_3: \"\\uF51D\"\n    readonly property string mdi_timer_off: \"\\uF51E\"\n    readonly property string mdi_timer_sand: \"\\uF51F\"\n    readonly property string mdi_timer_sand_empty: \"\\uF6AC\"\n    readonly property string mdi_timer_sand_full: \"\\uF78B\"\n    readonly property string mdi_timetable: \"\\uF520\"\n    readonly property string mdi_toaster_oven: \"\\uFCAF\"\n    readonly property string mdi_toggle_switch: \"\\uF521\"\n    readonly property string mdi_toggle_switch_off: \"\\uF522\"\n    readonly property string mdi_toggle_switch_off_outline: \"\\uFA18\"\n    readonly property string mdi_toggle_switch_outline: \"\\uFA19\"\n    readonly property string mdi_toilet: \"\\uF9AA\"\n    readonly property string mdi_toolbox: \"\\uF9AB\"\n    readonly property string mdi_toolbox_outline: \"\\uF9AC\"\n    readonly property string mdi_tooltip: \"\\uF523\"\n    readonly property string mdi_tooltip_account: \"\\uF00C\"\n    readonly property string mdi_tooltip_edit: \"\\uF524\"\n    readonly property string mdi_tooltip_image: \"\\uF525\"\n    readonly property string mdi_tooltip_image_outline: \"\\uFBB1\"\n    readonly property string mdi_tooltip_outline: \"\\uF526\"\n    readonly property string mdi_tooltip_plus: \"\\uFBB2\"\n    readonly property string mdi_tooltip_plus_outline: \"\\uF527\"\n    readonly property string mdi_tooltip_text: \"\\uF528\"\n    readonly property string mdi_tooltip_text_outline: \"\\uFBB3\"\n    readonly property string mdi_tooth: \"\\uF8C2\"\n    readonly property string mdi_tooth_outline: \"\\uF529\"\n    readonly property string mdi_tor: \"\\uF52A\"\n    readonly property string mdi_tortoise: \"\\uFD17\"\n    readonly property string mdi_tournament: \"\\uF9AD\"\n    readonly property string mdi_tower_beach: \"\\uF680\"\n    readonly property string mdi_tower_fire: \"\\uF681\"\n    readonly property string mdi_towing: \"\\uF83B\"\n    readonly property string mdi_track_light: \"\\uF913\"\n    readonly property string mdi_trackpad: \"\\uF7F7\"\n    readonly property string mdi_trackpad_lock: \"\\uF932\"\n    readonly property string mdi_tractor: \"\\uF891\"\n    readonly property string mdi_trademark: \"\\uFA77\"\n    readonly property string mdi_traffic_light: \"\\uF52B\"\n    readonly property string mdi_train: \"\\uF52C\"\n    readonly property string mdi_train_car: \"\\uFBB4\"\n    readonly property string mdi_train_variant: \"\\uF8C3\"\n    readonly property string mdi_tram: \"\\uF52D\"\n    readonly property string mdi_transcribe: \"\\uF52E\"\n    readonly property string mdi_transcribe_close: \"\\uF52F\"\n    readonly property string mdi_transfer_down: \"\\uFD7D\"\n    readonly property string mdi_transfer_left: \"\\uFD7E\"\n    readonly property string mdi_transfer_right: \"\\uF530\"\n    readonly property string mdi_transfer_up: \"\\uFD7F\"\n    readonly property string mdi_transit_connection: \"\\uFD18\"\n    readonly property string mdi_transit_connection_variant: \"\\uFD19\"\n    readonly property string mdi_transit_transfer: \"\\uF6AD\"\n    readonly property string mdi_transition: \"\\uF914\"\n    readonly property string mdi_transition_masked: \"\\uF915\"\n    readonly property string mdi_translate: \"\\uF5CA\"\n    readonly property string mdi_translate_off: \"\\uFDE2\"\n    readonly property string mdi_transmission_tower: \"\\uFD1A\"\n    readonly property string mdi_trash_can: \"\\uFA78\"\n    readonly property string mdi_trash_can_outline: \"\\uFA79\"\n    readonly property string mdi_treasure_chest: \"\\uF725\"\n    readonly property string mdi_tree: \"\\uF531\"\n    readonly property string mdi_trello: \"\\uF532\"\n    readonly property string mdi_trending_down: \"\\uF533\"\n    readonly property string mdi_trending_neutral: \"\\uF534\"\n    readonly property string mdi_trending_up: \"\\uF535\"\n    readonly property string mdi_triangle: \"\\uF536\"\n    readonly property string mdi_triangle_outline: \"\\uF537\"\n    readonly property string mdi_triforce: \"\\uFBB5\"\n    readonly property string mdi_trophy: \"\\uF538\"\n    readonly property string mdi_trophy_award: \"\\uF539\"\n    readonly property string mdi_trophy_broken: \"\\uFD80\"\n    readonly property string mdi_trophy_outline: \"\\uF53A\"\n    readonly property string mdi_trophy_variant: \"\\uF53B\"\n    readonly property string mdi_trophy_variant_outline: \"\\uF53C\"\n    readonly property string mdi_truck: \"\\uF53D\"\n    readonly property string mdi_truck_check: \"\\uFCB0\"\n    readonly property string mdi_truck_delivery: \"\\uF53E\"\n    readonly property string mdi_truck_fast: \"\\uF787\"\n    readonly property string mdi_truck_trailer: \"\\uF726\"\n    readonly property string mdi_tshirt_crew: \"\\uFA7A\"\n    readonly property string mdi_tshirt_crew_outline: \"\\uF53F\"\n    readonly property string mdi_tshirt_v: \"\\uFA7B\"\n    readonly property string mdi_tshirt_v_outline: \"\\uF540\"\n    readonly property string mdi_tumble_dryer: \"\\uF916\"\n    readonly property string mdi_tumblr: \"\\uF541\"\n    readonly property string mdi_tumblr_box: \"\\uF917\"\n    readonly property string mdi_tumblr_reblog: \"\\uF542\"\n    readonly property string mdi_tune: \"\\uF62E\"\n    readonly property string mdi_tune_vertical: \"\\uF66A\"\n    readonly property string mdi_turnstile: \"\\uFCB1\"\n    readonly property string mdi_turnstile_outline: \"\\uFCB2\"\n    readonly property string mdi_turtle: \"\\uFCB3\"\n    readonly property string mdi_twitch: \"\\uF543\"\n    readonly property string mdi_twitter: \"\\uF544\"\n    readonly property string mdi_twitter_box: \"\\uF545\"\n    readonly property string mdi_twitter_circle: \"\\uF546\"\n    readonly property string mdi_twitter_retweet: \"\\uF547\"\n    readonly property string mdi_two_factor_authentication: \"\\uF9AE\"\n    readonly property string mdi_uber: \"\\uF748\"\n    readonly property string mdi_ubisoft: \"\\uFBB6\"\n    readonly property string mdi_ubuntu: \"\\uF548\"\n    readonly property string mdi_ultra_high_definition: \"\\uF7F8\"\n    readonly property string mdi_umbraco: \"\\uF549\"\n    readonly property string mdi_umbrella: \"\\uF54A\"\n    readonly property string mdi_umbrella_closed: \"\\uF9AF\"\n    readonly property string mdi_umbrella_outline: \"\\uF54B\"\n    readonly property string mdi_undo: \"\\uF54C\"\n    readonly property string mdi_undo_variant: \"\\uF54D\"\n    readonly property string mdi_unfold_less_horizontal: \"\\uF54E\"\n    readonly property string mdi_unfold_less_vertical: \"\\uF75F\"\n    readonly property string mdi_unfold_more_horizontal: \"\\uF54F\"\n    readonly property string mdi_unfold_more_vertical: \"\\uF760\"\n    readonly property string mdi_ungroup: \"\\uF550\"\n    readonly property string mdi_unity: \"\\uF6AE\"\n    readonly property string mdi_unreal: \"\\uF9B0\"\n    readonly property string mdi_untappd: \"\\uF551\"\n    readonly property string mdi_update: \"\\uF6AF\"\n    readonly property string mdi_upload: \"\\uF552\"\n    readonly property string mdi_upload_multiple: \"\\uF83C\"\n    readonly property string mdi_upload_network: \"\\uF6F5\"\n    readonly property string mdi_upload_network_outline: \"\\uFCB4\"\n    readonly property string mdi_upload_outline: \"\\uFDE3\"\n    readonly property string mdi_usb: \"\\uF553\"\n    readonly property string mdi_van_passenger: \"\\uF7F9\"\n    readonly property string mdi_van_utility: \"\\uF7FA\"\n    readonly property string mdi_vanish: \"\\uF7FB\"\n    readonly property string mdi_variable: \"\\uFAE6\"\n    readonly property string mdi_vector_arrange_above: \"\\uF554\"\n    readonly property string mdi_vector_arrange_below: \"\\uF555\"\n    readonly property string mdi_vector_bezier: \"\\uFAE7\"\n    readonly property string mdi_vector_circle: \"\\uF556\"\n    readonly property string mdi_vector_circle_variant: \"\\uF557\"\n    readonly property string mdi_vector_combine: \"\\uF558\"\n    readonly property string mdi_vector_curve: \"\\uF559\"\n    readonly property string mdi_vector_difference: \"\\uF55A\"\n    readonly property string mdi_vector_difference_ab: \"\\uF55B\"\n    readonly property string mdi_vector_difference_ba: \"\\uF55C\"\n    readonly property string mdi_vector_ellipse: \"\\uF892\"\n    readonly property string mdi_vector_intersection: \"\\uF55D\"\n    readonly property string mdi_vector_line: \"\\uF55E\"\n    readonly property string mdi_vector_point: \"\\uF55F\"\n    readonly property string mdi_vector_polygon: \"\\uF560\"\n    readonly property string mdi_vector_polyline: \"\\uF561\"\n    readonly property string mdi_vector_radius: \"\\uF749\"\n    readonly property string mdi_vector_rectangle: \"\\uF5C6\"\n    readonly property string mdi_vector_selection: \"\\uF562\"\n    readonly property string mdi_vector_square: \"\\uF001\"\n    readonly property string mdi_vector_triangle: \"\\uF563\"\n    readonly property string mdi_vector_union: \"\\uF564\"\n    readonly property string mdi_venmo: \"\\uF578\"\n    readonly property string mdi_vhs: \"\\uFA1A\"\n    readonly property string mdi_vibrate: \"\\uF566\"\n    readonly property string mdi_vibrate_off: \"\\uFCB5\"\n    readonly property string mdi_video: \"\\uF567\"\n    readonly property string mdi_video_3d: \"\\uF7FC\"\n    readonly property string mdi_video_4k_box: \"\\uF83D\"\n    readonly property string mdi_video_account: \"\\uF918\"\n    readonly property string mdi_video_image: \"\\uF919\"\n    readonly property string mdi_video_input_antenna: \"\\uF83E\"\n    readonly property string mdi_video_input_component: \"\\uF83F\"\n    readonly property string mdi_video_input_hdmi: \"\\uF840\"\n    readonly property string mdi_video_input_svideo: \"\\uF841\"\n    readonly property string mdi_video_minus: \"\\uF9B1\"\n    readonly property string mdi_video_off: \"\\uF568\"\n    readonly property string mdi_video_off_outline: \"\\uFBB7\"\n    readonly property string mdi_video_outline: \"\\uFBB8\"\n    readonly property string mdi_video_plus: \"\\uF9B2\"\n    readonly property string mdi_video_stabilization: \"\\uF91A\"\n    readonly property string mdi_video_switch: \"\\uF569\"\n    readonly property string mdi_video_vintage: \"\\uFA1B\"\n    readonly property string mdi_view_agenda: \"\\uF56A\"\n    readonly property string mdi_view_array: \"\\uF56B\"\n    readonly property string mdi_view_carousel: \"\\uF56C\"\n    readonly property string mdi_view_column: \"\\uF56D\"\n    readonly property string mdi_view_dashboard: \"\\uF56E\"\n    readonly property string mdi_view_dashboard_outline: \"\\uFA1C\"\n    readonly property string mdi_view_dashboard_variant: \"\\uF842\"\n    readonly property string mdi_view_day: \"\\uF56F\"\n    readonly property string mdi_view_grid: \"\\uF570\"\n    readonly property string mdi_view_headline: \"\\uF571\"\n    readonly property string mdi_view_list: \"\\uF572\"\n    readonly property string mdi_view_module: \"\\uF573\"\n    readonly property string mdi_view_parallel: \"\\uF727\"\n    readonly property string mdi_view_quilt: \"\\uF574\"\n    readonly property string mdi_view_sequential: \"\\uF728\"\n    readonly property string mdi_view_split_horizontal: \"\\uFBA7\"\n    readonly property string mdi_view_split_vertical: \"\\uFBA8\"\n    readonly property string mdi_view_stream: \"\\uF575\"\n    readonly property string mdi_view_week: \"\\uF576\"\n    readonly property string mdi_vimeo: \"\\uF577\"\n    readonly property string mdi_violin: \"\\uF60F\"\n    readonly property string mdi_virtual_reality: \"\\uF893\"\n    readonly property string mdi_visual_studio: \"\\uF610\"\n    readonly property string mdi_visual_studio_code: \"\\uFA1D\"\n    readonly property string mdi_vk: \"\\uF579\"\n    readonly property string mdi_vk_box: \"\\uF57A\"\n    readonly property string mdi_vk_circle: \"\\uF57B\"\n    readonly property string mdi_vlc: \"\\uF57C\"\n    readonly property string mdi_voice: \"\\uF5CB\"\n    readonly property string mdi_voicemail: \"\\uF57D\"\n    readonly property string mdi_volleyball: \"\\uF9B3\"\n    readonly property string mdi_volume_high: \"\\uF57E\"\n    readonly property string mdi_volume_low: \"\\uF57F\"\n    readonly property string mdi_volume_medium: \"\\uF580\"\n    readonly property string mdi_volume_minus: \"\\uF75D\"\n    readonly property string mdi_volume_mute: \"\\uF75E\"\n    readonly property string mdi_volume_off: \"\\uF581\"\n    readonly property string mdi_volume_plus: \"\\uF75C\"\n    readonly property string mdi_volume_variant_off: \"\\uFDE4\"\n    readonly property string mdi_vote: \"\\uFA1E\"\n    readonly property string mdi_vote_outline: \"\\uFA1F\"\n    readonly property string mdi_vpn: \"\\uF582\"\n    readonly property string mdi_vuejs: \"\\uF843\"\n    readonly property string mdi_walk: \"\\uF583\"\n    readonly property string mdi_wall: \"\\uF7FD\"\n    readonly property string mdi_wall_sconce: \"\\uF91B\"\n    readonly property string mdi_wall_sconce_flat: \"\\uF91C\"\n    readonly property string mdi_wall_sconce_variant: \"\\uF91D\"\n    readonly property string mdi_wallet: \"\\uF584\"\n    readonly property string mdi_wallet_giftcard: \"\\uF585\"\n    readonly property string mdi_wallet_membership: \"\\uF586\"\n    readonly property string mdi_wallet_outline: \"\\uFBB9\"\n    readonly property string mdi_wallet_travel: \"\\uF587\"\n    readonly property string mdi_wallpaper: \"\\uFDE5\"\n    readonly property string mdi_wan: \"\\uF588\"\n    readonly property string mdi_washing_machine: \"\\uF729\"\n    readonly property string mdi_watch: \"\\uF589\"\n    readonly property string mdi_watch_export: \"\\uF58A\"\n    readonly property string mdi_watch_export_variant: \"\\uF894\"\n    readonly property string mdi_watch_import: \"\\uF58B\"\n    readonly property string mdi_watch_import_variant: \"\\uF895\"\n    readonly property string mdi_watch_variant: \"\\uF896\"\n    readonly property string mdi_watch_vibrate: \"\\uF6B0\"\n    readonly property string mdi_watch_vibrate_off: \"\\uFCB6\"\n    readonly property string mdi_water: \"\\uF58C\"\n    readonly property string mdi_water_off: \"\\uF58D\"\n    readonly property string mdi_water_outline: \"\\uFDE6\"\n    readonly property string mdi_water_percent: \"\\uF58E\"\n    readonly property string mdi_water_pump: \"\\uF58F\"\n    readonly property string mdi_watermark: \"\\uF612\"\n    readonly property string mdi_waves: \"\\uF78C\"\n    readonly property string mdi_waze: \"\\uFBBA\"\n    readonly property string mdi_weather_cloudy: \"\\uF590\"\n    readonly property string mdi_weather_fog: \"\\uF591\"\n    readonly property string mdi_weather_hail: \"\\uF592\"\n    readonly property string mdi_weather_hurricane: \"\\uF897\"\n    readonly property string mdi_weather_lightning: \"\\uF593\"\n    readonly property string mdi_weather_lightning_rainy: \"\\uF67D\"\n    readonly property string mdi_weather_night: \"\\uF594\"\n    readonly property string mdi_weather_partlycloudy: \"\\uF595\"\n    readonly property string mdi_weather_pouring: \"\\uF596\"\n    readonly property string mdi_weather_rainy: \"\\uF597\"\n    readonly property string mdi_weather_snowy: \"\\uF598\"\n    readonly property string mdi_weather_snowy_rainy: \"\\uF67E\"\n    readonly property string mdi_weather_sunny: \"\\uF599\"\n    readonly property string mdi_weather_sunset: \"\\uF59A\"\n    readonly property string mdi_weather_sunset_down: \"\\uF59B\"\n    readonly property string mdi_weather_sunset_up: \"\\uF59C\"\n    readonly property string mdi_weather_windy: \"\\uF59D\"\n    readonly property string mdi_weather_windy_variant: \"\\uF59E\"\n    readonly property string mdi_web: \"\\uF59F\"\n    readonly property string mdi_webcam: \"\\uF5A0\"\n    readonly property string mdi_webhook: \"\\uF62F\"\n    readonly property string mdi_webpack: \"\\uF72A\"\n    readonly property string mdi_wechat: \"\\uF611\"\n    readonly property string mdi_weight: \"\\uF5A1\"\n    readonly property string mdi_weight_gram: \"\\uFD1B\"\n    readonly property string mdi_weight_kilogram: \"\\uF5A2\"\n    readonly property string mdi_weight_pound: \"\\uF9B4\"\n    readonly property string mdi_whatsapp: \"\\uF5A3\"\n    readonly property string mdi_wheelchair_accessibility: \"\\uF5A4\"\n    readonly property string mdi_whistle: \"\\uF9B5\"\n    readonly property string mdi_white_balance_auto: \"\\uF5A5\"\n    readonly property string mdi_white_balance_incandescent: \"\\uF5A6\"\n    readonly property string mdi_white_balance_iridescent: \"\\uF5A7\"\n    readonly property string mdi_white_balance_sunny: \"\\uF5A8\"\n    readonly property string mdi_widgets: \"\\uF72B\"\n    readonly property string mdi_wifi: \"\\uF5A9\"\n    readonly property string mdi_wifi_off: \"\\uF5AA\"\n    readonly property string mdi_wifi_star: \"\\uFDE7\"\n    readonly property string mdi_wifi_strength_1: \"\\uF91E\"\n    readonly property string mdi_wifi_strength_1_alert: \"\\uF91F\"\n    readonly property string mdi_wifi_strength_1_lock: \"\\uF920\"\n    readonly property string mdi_wifi_strength_2: \"\\uF921\"\n    readonly property string mdi_wifi_strength_2_alert: \"\\uF922\"\n    readonly property string mdi_wifi_strength_2_lock: \"\\uF923\"\n    readonly property string mdi_wifi_strength_3: \"\\uF924\"\n    readonly property string mdi_wifi_strength_3_alert: \"\\uF925\"\n    readonly property string mdi_wifi_strength_3_lock: \"\\uF926\"\n    readonly property string mdi_wifi_strength_4: \"\\uF927\"\n    readonly property string mdi_wifi_strength_4_alert: \"\\uF928\"\n    readonly property string mdi_wifi_strength_4_lock: \"\\uF929\"\n    readonly property string mdi_wifi_strength_alert_outline: \"\\uF92A\"\n    readonly property string mdi_wifi_strength_lock_outline: \"\\uF92B\"\n    readonly property string mdi_wifi_strength_off: \"\\uF92C\"\n    readonly property string mdi_wifi_strength_off_outline: \"\\uF92D\"\n    readonly property string mdi_wifi_strength_outline: \"\\uF92E\"\n    readonly property string mdi_wii: \"\\uF5AB\"\n    readonly property string mdi_wiiu: \"\\uF72C\"\n    readonly property string mdi_wikipedia: \"\\uF5AC\"\n    readonly property string mdi_wind_turbine: \"\\uFD81\"\n    readonly property string mdi_window_close: \"\\uF5AD\"\n    readonly property string mdi_window_closed: \"\\uF5AE\"\n    readonly property string mdi_window_maximize: \"\\uF5AF\"\n    readonly property string mdi_window_minimize: \"\\uF5B0\"\n    readonly property string mdi_window_open: \"\\uF5B1\"\n    readonly property string mdi_window_restore: \"\\uF5B2\"\n    readonly property string mdi_windows: \"\\uF5B3\"\n    readonly property string mdi_windows_classic: \"\\uFA20\"\n    readonly property string mdi_wiper: \"\\uFAE8\"\n    readonly property string mdi_wiper_wash: \"\\uFD82\"\n    readonly property string mdi_wordpress: \"\\uF5B4\"\n    readonly property string mdi_worker: \"\\uF5B5\"\n    readonly property string mdi_wrap: \"\\uF5B6\"\n    readonly property string mdi_wrap_disabled: \"\\uFBBB\"\n    readonly property string mdi_wrench: \"\\uF5B7\"\n    readonly property string mdi_wrench_outline: \"\\uFBBC\"\n    readonly property string mdi_wunderlist: \"\\uF5B8\"\n    readonly property string mdi_xamarin: \"\\uF844\"\n    readonly property string mdi_xamarin_outline: \"\\uF845\"\n    readonly property string mdi_xaml: \"\\uF673\"\n    readonly property string mdi_xbox: \"\\uF5B9\"\n    readonly property string mdi_xbox_controller: \"\\uF5BA\"\n    readonly property string mdi_xbox_controller_battery_alert: \"\\uF74A\"\n    readonly property string mdi_xbox_controller_battery_charging: \"\\uFA21\"\n    readonly property string mdi_xbox_controller_battery_empty: \"\\uF74B\"\n    readonly property string mdi_xbox_controller_battery_full: \"\\uF74C\"\n    readonly property string mdi_xbox_controller_battery_low: \"\\uF74D\"\n    readonly property string mdi_xbox_controller_battery_medium: \"\\uF74E\"\n    readonly property string mdi_xbox_controller_battery_unknown: \"\\uF74F\"\n    readonly property string mdi_xbox_controller_off: \"\\uF5BB\"\n    readonly property string mdi_xda: \"\\uF5BC\"\n    readonly property string mdi_xing: \"\\uF5BD\"\n    readonly property string mdi_xing_box: \"\\uF5BE\"\n    readonly property string mdi_xing_circle: \"\\uF5BF\"\n    readonly property string mdi_xml: \"\\uF5C0\"\n    readonly property string mdi_xmpp: \"\\uF7FE\"\n    readonly property string mdi_yahoo: \"\\uFB2A\"\n    readonly property string mdi_yammer: \"\\uF788\"\n    readonly property string mdi_yeast: \"\\uF5C1\"\n    readonly property string mdi_yelp: \"\\uF5C2\"\n    readonly property string mdi_yin_yang: \"\\uF67F\"\n    readonly property string mdi_youtube: \"\\uF5C3\"\n    readonly property string mdi_youtube_creator_studio: \"\\uF846\"\n    readonly property string mdi_youtube_gaming: \"\\uF847\"\n    readonly property string mdi_youtube_subscription: \"\\uFD1C\"\n    readonly property string mdi_youtube_tv: \"\\uF448\"\n    readonly property string mdi_z_wave: \"\\uFAE9\"\n    readonly property string mdi_zend: \"\\uFAEA\"\n    readonly property string mdi_zigbee: \"\\uFD1D\"\n    readonly property string mdi_zip_box: \"\\uF5C4\"\n    readonly property string mdi_zip_disk: \"\\uFA22\"\n    readonly property string mdi_zodiac_aquarius: \"\\uFA7C\"\n    readonly property string mdi_zodiac_aries: \"\\uFA7D\"\n    readonly property string mdi_zodiac_cancer: \"\\uFA7E\"\n    readonly property string mdi_zodiac_capricorn: \"\\uFA7F\"\n    readonly property string mdi_zodiac_gemini: \"\\uFA80\"\n    readonly property string mdi_zodiac_leo: \"\\uFA81\"\n    readonly property string mdi_zodiac_libra: \"\\uFA82\"\n    readonly property string mdi_zodiac_pisces: \"\\uFA83\"\n    readonly property string mdi_zodiac_sagittarius: \"\\uFA84\"\n    readonly property string mdi_zodiac_scorpio: \"\\uFA85\"\n    readonly property string mdi_zodiac_taurus: \"\\uFA86\"\n    readonly property string mdi_zodiac_virgo: \"\\uFA87\"\n    readonly property string mdi_blank: \"\\uF68C\"\n}\n"
  },
  {
    "path": "src/asemanqml/materialicons/materialicons.pri",
    "content": "QT += qml\n\nHEADERS += \\\n    $$PWD/materialiconsplugin.h\n\nSOURCES += \\ \n    $$PWD/materialiconsplugin.cpp\n\nstatic: !linux: !win32: DEFINES += ASEMAN_STATIC_BUILD\n\nASEMAN_QML_FILES = $$files($$PWD/MaterialIcons/*.*)\n\nINCLUDED_RESOURCE_FILES = \\\n    $$ASEMAN_QML_FILES\n\nasemanmaterialicons.files = $$INCLUDED_RESOURCE_FILES\nasemanmaterialicons.prefix = /AsemanQml/\n\ncontains(DEFINES, QT_ASEMAN_EMBEDDED) {\n    RESOURCES += $$PWD/qmake_asemanmaterialicons.qrc\n} else {\n    RESOURCES += asemanmaterialicons\n}\n"
  },
  {
    "path": "src/asemanqml/materialicons/materialicons.pro",
    "content": "TARGET  = asemanqmlmaterialicons\nTARGETPATH = AsemanQml/MaterialIcons\nIMPORT_VERSION = 2.0\n\ninclude(materialicons.pri)\n\nload(qml_plugin)\n"
  },
  {
    "path": "src/asemanqml/materialicons/materialiconsplugin.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"materialiconsplugin.h\"\n\n#include <QDebug>\n#include <QDir>\n#include <QStringList>\n#include <QtQml>\n\n#ifdef QT_ASEMAN_EMBEDDED\nbool asemanqml_materialicons_plugin_registered = AsemanMaterialIconsPlugin::registerStaticTypes(\"AsemanQml.MaterialIcons\");\n#endif\n\nbool AsemanMaterialIconsPlugin::registerStaticTypes(const char *uri)\n{\n    Q_INIT_RESOURCE(qmake_asemanmaterialicons);\n    qmlRegisterSingletonType(QUrl(\"qrc:/AsemanQml/MaterialIcons/MaterialIcons.qml\"), uri, 2, 0, \"MaterialIcons\");\n    return true;\n}\n\nvoid AsemanMaterialIconsPlugin::registerTypes(const char *uri)\n{\n    AsemanMaterialIconsPlugin::registerStaticTypes(uri);\n}\n\nvoid AsemanMaterialIconsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)\n{\n    QQmlExtensionPlugin::initializeEngine(engine, uri);\n}\n"
  },
  {
    "path": "src/asemanqml/materialicons/materialiconsplugin.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANMATERIALICONSPLUGIN_H\n#define ASEMANMATERIALICONSPLUGIN_H\n\n#include <QQmlExtensionPlugin>\n\nclass AsemanMaterialIconsPlugin : public QQmlExtensionPlugin\n{\n    Q_OBJECT\n\n#ifndef QT_ASEMAN_EMBEDDED\n    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)\n#endif\n\npublic:\n    static bool registerStaticTypes(const char *uri);\n    void registerTypes(const char *uri);\n    void initializeEngine(QQmlEngine *engine, const char *uri);\n};\n\n#endif // ASEMANMATERIALICONSPLUGIN_H\n"
  },
  {
    "path": "src/asemanqml/materialicons/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.MaterialIcons 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.8\"]\n    Component {\n        prototype: \"QObject\"\n        name: \"AsemanQml.MaterialIcons/MaterialIcons 2.0\"\n        exports: [\"AsemanQml.MaterialIcons/MaterialIcons 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        isCreatable: false\n        isSingleton: true\n        defaultProperty: \"items\"\n        Property { name: \"family\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_3d_rotation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_ac_unit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_access_alarm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_access_alarms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_access_time\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_accessibility\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_accessible\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_account_balance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_account_balance_wallet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_account_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_account_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_adb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_a_photo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_alarm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_location\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_shopping_cart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_to_photos\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_add_to_queue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_adjust\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_flat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_flat_angled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_individual_suite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_legroom_extra\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_legroom_normal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_legroom_reduced\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_recline_extra\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airline_seat_recline_normal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airplanemode_active\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airplanemode_inactive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airplay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_airport_shuttle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_alarm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_alarm_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_alarm_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_alarm_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_album\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_all_inclusive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_all_out\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_android\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_announcement\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_apps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_archive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_arrow_back\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_arrow_downward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_arrow_drop_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_arrow_drop_down_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_arrow_drop_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_arrow_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_arrow_upward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_art_track\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_aspect_ratio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assessment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assignment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assignment_ind\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assignment_late\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assignment_return\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assignment_returned\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assignment_turned_in\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assistant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_assistant_photo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_attach_file\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_attach_money\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_attachment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_audiotrack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_autorenew\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_av_timer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_backspace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_backup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_battery_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_battery_charging_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_battery_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_battery_std\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_battery_unknown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_beach_access\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_beenhere\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_block\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bluetooth_audio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bluetooth_connected\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bluetooth_disabled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bluetooth_searching\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_blur_circular\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_blur_linear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_blur_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_blur_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_book\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bookmark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bookmark_border\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_bottom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_clear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_color\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_inner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_outer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_style\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_border_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_branding_watermark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_7\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_high\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_low\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brightness_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_broken_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_brush\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bubble_chart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_bug_report\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_build\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_burst_mode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_business\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_business_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cached\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cake\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_made\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_merge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_missed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_missed_outgoing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_received\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_split\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_call_to_action\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_camera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_camera_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_camera_enhance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_camera_front\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_camera_rear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_camera_roll\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cancel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_card_giftcard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_card_membership\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_card_travel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_casino\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cast_connected\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_center_focus_strong\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_center_focus_weak\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_change_history\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_chat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_chat_bubble\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_chat_bubble_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_check_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_check_box_outline_blank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_check_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_chevron_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_chevron_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_child_care\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_child_friendly\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_chrome_reader_mode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_class\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_clear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_clear_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_closed_caption\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cloud_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cloud_done\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cloud_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cloud_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cloud_queue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_cloud_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_code\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_collections\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_collections_bookmark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_color_lens\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_colorize\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_comment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_compare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_compare_arrows\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_computer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_confirmation_number\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_contact_mail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_contact_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_contacts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_content_copy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_content_cut\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_content_paste\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_control_point\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_control_point_duplicate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_copyright\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_create\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_create_new_folder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_credit_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_16_9\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_3_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_5_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_7_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_din\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_free\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_landscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_original\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_rotate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_crop_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_dashboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_data_usage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_date_range\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_dehaze\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_delete\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_delete_forever\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_delete_sweep\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_description\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_desktop_mac\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_desktop_windows\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_details\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_developer_board\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_developer_mode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_device_hub\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_devices\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_devices_other\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_dialer_sip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_dialpad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_bike\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_boat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_bus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_car\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_railway\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_run\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_subway\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_transit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_directions_walk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_disc_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_dns\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_do_not_disturb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_do_not_disturb_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_do_not_disturb_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_do_not_disturb_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_dock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_domain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_done\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_done_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_donut_large\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_donut_small\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_drafts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_drag_handle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_drive_eta\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_dvr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_edit_location\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_eject\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_email\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_enhanced_encryption\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_equalizer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_error\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_error_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_euro_symbol\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_ev_station\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_event\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_event_available\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_event_busy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_event_note\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_event_seat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_exit_to_app\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_expand_less\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_expand_more\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_explicit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_explore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_exposure\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_exposure_neg_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_exposure_neg_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_exposure_plus_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_exposure_plus_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_exposure_zero\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_extension\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_face\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fast_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fast_rewind\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_favorite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_favorite_border\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_featured_play_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_featured_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_feedback\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fiber_dvr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fiber_manual_record\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fiber_new\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fiber_pin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fiber_smart_record\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_file_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_file_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_7\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_8\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_9\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_9_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_b_and_w\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_center_focus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_drama\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_frames\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_hdr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_tilt_shift\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_filter_vintage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_find_in_page\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_find_replace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fingerprint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_first_page\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fitness_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flash_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flash_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flash_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flight_land\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flight_takeoff\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flip_to_back\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_flip_to_front\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_folder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_folder_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_folder_shared\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_folder_special\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_font_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_align_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_align_justify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_align_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_align_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_clear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_color_fill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_color_reset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_color_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_indent_decrease\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_indent_increase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_italic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_line_spacing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_list_bulleted\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_list_numbered\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_paint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_quote\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_shapes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_size\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_strikethrough\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_textdirection_l_to_r\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_textdirection_r_to_l\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_format_underlined\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_forum\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_forward_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_forward_30\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_forward_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_free_breakfast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fullscreen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_fullscreen_exit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_functions\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_g_translate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gamepad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_games\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gavel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gesture\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_get_app\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gif\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_golf_course\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gps_fixed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gps_not_fixed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gps_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_grade\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_gradient\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_grain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_graphic_eq\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_grid_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_grid_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_group_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_group_work\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hdr_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hdr_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hdr_strong\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hdr_weak\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_headset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_headset_mic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_healing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hearing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_help\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_help_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_high_quality\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_highlight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_highlight_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_history\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_home\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hot_tub\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hotel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hourglass_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_hourglass_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_http\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_https\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_image_aspect_ratio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_import_contacts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_import_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_important_devices\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_inbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_indeterminate_check_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_info\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_info_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_input\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_insert_chart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_insert_comment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_insert_drive_file\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_insert_emoticon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_insert_invitation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_insert_link\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_insert_photo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_invert_colors\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_invert_colors_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_iso\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_arrow_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_backspace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_capslock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_hide\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_return\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_tab\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_keyboard_voice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_kitchen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_label\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_label_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_landscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_language\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_laptop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_laptop_chromebook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_laptop_mac\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_laptop_windows\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_last_page\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_launch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_layers\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_layers_clear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_leak_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_leak_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_lens\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_library_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_library_books\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_library_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_lightbulb_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_line_style\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_line_weight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_linear_scale\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_link\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_linked_camera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_live_help\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_live_tv\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_activity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_airport\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_atm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_bar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_cafe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_car_wash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_convenience_store\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_dining\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_drink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_florist\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_gas_station\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_grocery_store\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_hospital\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_hotel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_laundry_service\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_library\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_mall\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_movies\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_offer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_parking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_pharmacy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_pizza\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_post_office\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_printshop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_see\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_shipping\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_local_taxi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_location_city\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_location_disabled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_location_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_location_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_location_searching\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_lock_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_lock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_looks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_looks_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_looks_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_looks_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_looks_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_looks_one\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_looks_two\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_loop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_loupe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_low_priority\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_loyalty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mail_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_map\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_markunread\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_markunread_mailbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_memory\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_menu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_merge_type\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_message\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mic_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mic_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mode_comment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mode_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_monetization_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_money_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_monochrome_photos\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mood\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mood_bad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_more\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_more_horiz\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_more_vert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_motorcycle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_mouse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_move_to_inbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_movie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_movie_creation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_movie_filter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_multiline_chart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_music_note\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_music_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_my_location\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_nature\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_nature_people\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_navigate_before\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_navigate_next\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_navigation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_near_me\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_network_cell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_network_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_network_locked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_network_wifi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_new_releases\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_next_week\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_nfc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_no_encryption\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_no_sim\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_not_interested\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_note\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_note_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_notifications\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_notifications_active\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_notifications_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_notifications_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_notifications_paused\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_offline_pin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_ondemand_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_opacity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_open_in_browser\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_open_in_new\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_open_with\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pages\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pageview\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_palette\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pan_tool\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_panorama\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_panorama_fish_eye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_panorama_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_panorama_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_panorama_wide_angle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_party_mode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pause\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pause_circle_filled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pause_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_payment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_people\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_people_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_camera_mic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_contact_calendar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_data_setting\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_device_information\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_identity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_media\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_phone_msg\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_perm_scan_wifi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_person\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_person_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_person_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_person_pin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_person_pin_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_personal_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pets\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_android\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_bluetooth_speaker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_forwarded\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_in_talk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_iphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_locked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_missed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phone_paused\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phonelink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phonelink_erase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phonelink_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phonelink_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phonelink_ring\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_phonelink_setup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo_album\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo_camera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo_filter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo_library\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo_size_select_actual\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo_size_select_large\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_photo_size_select_small\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_picture_as_pdf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_picture_in_picture\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_picture_in_picture_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pie_chart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pie_chart_outlined\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pin_drop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_place\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_play_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_play_circle_filled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_play_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_play_for_work\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_playlist_add\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_playlist_add_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_playlist_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_plus_one\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_poll\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_polymer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pool\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_portable_wifi_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_power\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_power_input\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_power_settings_new\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_pregnant_woman\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_present_to_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_print\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_priority_high\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_public\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_publish\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_query_builder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_question_answer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_queue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_queue_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_queue_play_next\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_radio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_radio_button_checked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_radio_button_unchecked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rate_review\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_receipt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_recent_actors\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_record_voice_over\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_redeem\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_redo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_refresh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_remove_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_remove_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_remove_from_queue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_remove_red_eye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_remove_shopping_cart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_reorder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_repeat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_repeat_one\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_replay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_replay_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_replay_30\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_replay_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_reply\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_reply_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_report\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_report_problem\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_restaurant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_restaurant_menu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_restore_page\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_ring_volume\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_room\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_room_service\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rotate_90_degrees_ccw\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rotate_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rotate_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rounded_corner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_router\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rowing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rss_feed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_rv_hookup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_satellite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_save\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_scanner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_schedule\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_school\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_screen_lock_landscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_screen_lock_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_screen_lock_rotation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_screen_rotation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_screen_share\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sd_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sd_storage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_security\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_select_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_send\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sentiment_dissatisfied\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sentiment_neutral\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sentiment_satisfied\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sentiment_very_dissatisfied\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sentiment_very_satisfied\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_applications\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_backup_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_brightness\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_cell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_ethernet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_input_antenna\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_input_component\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_input_composite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_input_hdmi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_input_svideo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_overscan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_power\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_remote\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_system_daydream\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_settings_voice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_share\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_shop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_shop_two\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_shopping_basket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_shopping_cart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_short_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_show_chart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_shuffle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_signal_cellular_4_bar\"; type: \"string\"; isReadonly: true }\n        Property {\n            name: \"mi_signal_cellular_connected_no_internet_4_bar\"\n            type: \"string\"\n            isReadonly: true\n        }\n        Property { name: \"mi_signal_cellular_no_sim\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_signal_cellular_null\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_signal_cellular_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_signal_wifi_4_bar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_signal_wifi_4_bar_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_signal_wifi_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sim_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sim_card_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_skip_next\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_skip_previous\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_slideshow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_slow_motion_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_smartphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_smoke_free\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_smoking_rooms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sms_failed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_snooze\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sort\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sort_by_alpha\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_spa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_space_bar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_speaker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_speaker_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_speaker_notes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_speaker_notes_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_speaker_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_spellcheck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_star_border\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_star_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_stars\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_stay_current_landscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_stay_current_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_stay_primary_landscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_stay_primary_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_stop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_stop_screen_share\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_storage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_store\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_store_mall_directory\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_straighten\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_streetview\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_strikethrough_s\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_style\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_subdirectory_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_subdirectory_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_subject\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_subscriptions\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_subtitles\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_subway\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_supervisor_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_surround_sound\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_swap_calls\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_swap_horiz\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_swap_vert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_swap_vertical_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_switch_camera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_switch_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sync\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sync_disabled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_sync_problem\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_system_update\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_system_update_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tab\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tab_unselected\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tablet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tablet_android\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tablet_mac\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tag_faces\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tap_and_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_terrain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_text_fields\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_text_format\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_textsms\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_texture\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_theaters\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_thumb_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_thumb_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_thumbs_up_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_time_to_leave\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_timelapse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_timeline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_timer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_timer_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_timer_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_timer_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_title\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_toc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_today\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_toll\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tonality\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_touch_app\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_toys\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_track_changes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_traffic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_train\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_transfer_within_a_station\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_transform\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_translate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_trending_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_trending_flat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_trending_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tune\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_turned_in\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_turned_in_not\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_tv\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_unarchive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_undo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_unfold_less\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_unfold_more\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_update\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_usb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_verified_user\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_vertical_align_bottom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_vertical_align_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_vertical_align_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_vibration\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_video_call\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_video_label\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_video_library\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_videocam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_videocam_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_videogame_asset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_agenda\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_array\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_carousel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_column\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_comfy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_compact\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_day\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_headline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_module\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_quilt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_stream\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_view_week\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_vignette\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_visibility\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_visibility_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_voice_chat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_voicemail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_volume_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_volume_mute\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_volume_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_volume_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_vpn_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_vpn_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wallpaper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_warning\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_watch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_watch_later\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wb_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wb_cloudy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wb_incandescent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wb_iridescent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wb_sunny\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_web\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_web_asset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_weekend\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_whatshot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_widgets\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wifi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wifi_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wifi_tethering\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_work\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_wrap_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_youtube_searched_for\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_zoom_in\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_zoom_out\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mi_zoom_out_map\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_access_point\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_access_point_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_access_point_network_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_arrow_left_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_arrow_right_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_badge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_badge_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_badge_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_badge_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_box_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_card_details\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_card_details_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_child\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_child_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_clock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_convert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_details\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_group_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_heart_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_key_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_minus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_multiple_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_multiple_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_multiple_minus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_multiple_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_multiple_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_question\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_question_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_star_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_supervisor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_supervisor_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_account_tie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_accusoft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_adchoices\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_adjust\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_adobe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_air_conditioner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_air_filter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_air_horn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_air_purifier\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airbag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airballoon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airplane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airplane_landing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airplane_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airplane_takeoff\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airplay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_airport\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_bell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_light\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_light_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alarm_snooze\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_album\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_decagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_decagram_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_octagon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_octagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_octagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_octagram_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alien\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_all_inclusive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_a\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_a_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_a_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_a_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_a_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_b\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_b_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_b_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_b_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_b_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_c\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_c_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_c_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_c_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_c_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_d\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_d_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_d_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_d_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_d_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_e\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_e_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_e_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_e_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_e_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_f\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_f_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_f_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_f_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_f_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_g_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_g_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_g_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_g_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_h\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_h_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_h_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_h_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_h_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_i\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_i_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_i_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_i_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_i_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_j\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_j_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_j_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_j_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_j_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_k\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_k_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_k_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_k_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_k_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_l\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_l_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_l_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_l_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_l_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_m\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_m_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_m_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_m_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_m_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_n\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_n_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_n_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_n_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_n_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_o\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_o_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_o_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_o_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_o_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_p\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_p_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_p_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_p_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_p_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_q\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_q_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_q_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_q_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_q_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_r\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_r_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_r_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_r_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_r_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_s\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_s_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_s_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_s_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_s_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_t\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_t_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_t_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_t_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_t_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_u\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_u_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_u_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_u_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_u_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_v\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_v_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_v_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_v_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_v_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_w\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_w_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_w_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_w_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_w_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_x\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_x_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_x_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_x_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_x_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_y\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_y_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_y_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_y_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_y_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_z\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_z_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_z_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_z_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alpha_z_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_alphabetical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_altimeter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_amazon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_amazon_alexa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_amazon_drive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ambulance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ammunition\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ampersand\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_amplifier\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_anchor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_android\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_android_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_android_debug_bridge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_android_head\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_android_messages\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_android_studio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_angle_acute\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_angle_obtuse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_angle_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_angular\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_angularjs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_animation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_animation_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_animation_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_animation_play_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_anvil\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_finder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_icloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_ios\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_keyboard_caps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_keyboard_command\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_keyboard_control\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_keyboard_option\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_keyboard_shift\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apple_safari\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_application\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_application_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_application_import\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_apps_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_archive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrange_bring_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrange_bring_to_front\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrange_send_backward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrange_send_to_back\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_bottom_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_bottom_left_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_bottom_left_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_bottom_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_bottom_right_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_bottom_right_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_collapse_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_decision\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_decision_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_decision_auto_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_decision_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_bold_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_bold_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_bold_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_bold_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_bold_hexagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_drop_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_drop_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_down_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_expand_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_bold_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_bold_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_bold_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_bold_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_bold_hexagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_drop_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_drop_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_right_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_left_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_bold_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_bold_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_bold_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_bold_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_bold_hexagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_drop_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_drop_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_right_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_split_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_split_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_top_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_top_left_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_top_left_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_top_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_top_right_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_top_right_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_bold_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_bold_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_bold_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_bold_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_bold_hexagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_down_bold_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_drop_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_drop_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_arrow_up_thick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_artist\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_artist_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_artstation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_aspect_ratio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_assistant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_asterisk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_at\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_atlassian\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_atm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_atom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_attachment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_audio_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_audiobook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_augmented_reality\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_auto_fix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_auto_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_autorenew\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_av_timer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_arrow_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_x_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_x_arrow_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_x_rotate_clockwise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_x_rotate_counterclockwise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_x_y_arrow_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_y_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_y_arrow_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_y_rotate_clockwise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_y_rotate_counterclockwise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_z_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_z_arrow_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_z_rotate_clockwise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_axis_z_rotate_counterclockwise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_azure\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_babel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_baby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_baby_buggy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_backburger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_backspace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_backspace_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_backup_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_badminton\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_balloon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ballot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ballot_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ballot_recount\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ballot_recount_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bandage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bandcamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bank_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bank_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bank_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bank_transfer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bank_transfer_in\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bank_transfer_out\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_barcode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_barcode_scan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_barley\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_barley_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_barn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_barrel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_baseball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_baseball_bat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_basecamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_basket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_basket_fill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_basket_unfill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_basketball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_basketball_hoop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_basketball_hoop_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_10_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_20\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_20_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_30\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_30_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_40\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_40_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_50\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_50_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_60\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_60_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_70\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_70_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_80\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_80_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_90\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_90_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_alert_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_bluetooth_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_100\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_20\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_30\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_40\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_50\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_60\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_70\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_80\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_90\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_20\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_30\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_40\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_50\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_60\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_70\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_80\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_90\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_charging_wireless_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_negative\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_positive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_unknown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battery_unknown_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_battlenet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_beach\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_beaker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_beaker_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_beats\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bed_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_beer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_behance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_ring\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_ring_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_sleep\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bell_sleep_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_beta\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_betamax\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bible\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bike\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_billiards\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_billiards_rack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_binoculars\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_biohazard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bitbucket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bitcoin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_black_mesa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blackberry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blender\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blender_software\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blinds\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_block_helper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blogger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blood_bag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bluetooth_audio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bluetooth_connect\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bluetooth_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bluetooth_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bluetooth_transfer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blur\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blur_linear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blur_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blur_radial\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bolnisi_cross\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bolt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bomb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bomb_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_lock_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_multiple_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_multiple_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_multiple_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_multiple_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_open_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_open_page_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_open_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_book_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_minus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bookmark_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_boombox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bootstrap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_all_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_bottom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_bottom_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_color\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_inside\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_left_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_none_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_outside\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_right_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_style\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_top_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_border_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bottle_wine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bow_tie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bowl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bowling\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_box_cutter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_box_shadow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_boxing_glove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_braille\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bread_slice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bread_slice_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bridge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_account_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_download_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_edit_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_minus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_briefcase_upload_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_7\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brightness_percent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_broom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_brush\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_buddhism\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_buffer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bug\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bug_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bug_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bug_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bugle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bulldozer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bullet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bulletin_board\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bullhorn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bullhorn_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bullseye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bullseye_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus_articulated_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus_articulated_front\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus_double_decker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus_school\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_bus_side\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cached\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cactus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cake\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cake_layered\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cake_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calculator\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calculator_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_blank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_blank_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_import\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_multiple_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_multiselect\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_question\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_range\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_range_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_today\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_week\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_calendar_week_begin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_call_made\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_call_merge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_call_missed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_call_received\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_call_split\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camcorder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camcorder_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camcorder_box_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camcorder_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_burst\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_control\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_enhance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_enhance_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_front\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_front_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_gopro\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_iris\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_metering_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_metering_matrix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_metering_partial\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_metering_spot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_party_mode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_rear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_rear_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_timer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_wireless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_camera_wireless_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cancel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_candle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_candycane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cannabis\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_caps_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_battery\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_brake_abs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_brake_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_brake_hold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_brake_parking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_connected\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_convertible\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_cruise_control\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_defrost_front\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_defrost_rear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_door\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_electric\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_esp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_estate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_hatchback\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_light_dimmed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_light_fog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_light_high\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_limousine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_parking_lights\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_pickup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_side\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_sports\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_tire_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_traction_control\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_car_wash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_caravan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_bulleted\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_bulleted_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_bulleted_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_bulleted_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_bulleted_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_bulleted_settings_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_card_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards_club\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards_diamond\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards_playing_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards_spade\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cards_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_carrot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_carry_on_bag_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_arrow_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cart_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_case_sensitive_alt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cash_100\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cash_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cash_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cash_refund\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cash_register\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cash_usd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cassette\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cast_connected\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cast_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_castle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cctv\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ceiling_light\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_android\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_basic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_dock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_erase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_iphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_link\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_link_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_message\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_screenshot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_settings_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_sound\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cellphone_wireless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_celtic_cross\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_certificate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chair_school\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_charity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_arc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_areaspline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_bar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_bar_stacked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_bell_curve\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_bubble\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_donut\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_donut_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_gantt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_histogram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_line\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_line_stacked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_line_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_multiline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_pie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_scatterplot_hexbin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chart_timeline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chat_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chat_processing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_decagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_blank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_blank_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_blank_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_blank_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_intermediate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_marked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_marked_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_marked_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_marked_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_multiple_blank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_multiple_blank_circle\"; type: \"string\"; isReadonly: true }\n        Property {\n            name: \"mdi_checkbox_multiple_blank_circle_outline\"\n            type: \"string\"\n            isReadonly: true\n        }\n        Property { name: \"mdi_checkbox_multiple_blank_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_multiple_marked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkbox_multiple_marked_circle\"; type: \"string\"; isReadonly: true }\n        Property {\n            name: \"mdi_checkbox_multiple_marked_circle_outline\"\n            type: \"string\"\n            isReadonly: true\n        }\n        Property { name: \"mdi_checkbox_multiple_marked_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_checkerboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chef_hat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chemical_weapon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chess_bishop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chess_king\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chess_knight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chess_pawn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chess_queen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chess_rook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_double_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_double_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_double_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_double_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_down_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_down_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_down_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_down_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_left_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_left_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_left_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_left_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_right_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_right_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_right_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_right_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_triple_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_triple_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_triple_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_triple_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_up_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_up_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_up_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chevron_up_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chili_hot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chili_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chili_mild\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_chip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_christianity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_christianity_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_church\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_edit_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_7\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_slice_8\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_circle_small\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cisco_webex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_city\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_city_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_city_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_account_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_down_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_left_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_right_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_arrow_up_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_flow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_play_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_pulse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_pulse_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_text_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clipboard_text_play_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clippy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_fast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_in\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_out\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clock_start\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_box_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_octagon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_octagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_close_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_closed_caption\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_closed_caption_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_braces\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_download_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_print\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_print_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_question\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_sync\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_tags\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cloud_upload_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_clover\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_array\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_braces\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_brackets\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_greater_than\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_greater_than_or_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_less_than\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_less_than_or_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_not_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_not_equal_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_parentheses\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_string\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_tags\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_code_tags_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_codepen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_coffee\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_coffee_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_coffee_to_go\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_coffin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cogs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_coin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_coins\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_collage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_collapse_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_collapse_all_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_color_helper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_account_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_arrow_left_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_arrow_right_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_eye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_eye_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_processing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_processing_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_question\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_question_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_text_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_text_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_comment_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_compare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_compass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_compass_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_compass_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_compass_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_console\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_console_line\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_console_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_console_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contact_mail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contactless_payment\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contacts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contain_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contain_start\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_copy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_cut\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_duplicate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_paste\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_save\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_save_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_save_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_save_edit_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_save_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_save_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_content_save_settings_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contrast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contrast_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_contrast_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_controller_classic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_controller_classic_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cookie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_copyright\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cordova\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_corn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_counter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_creation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_creative_commons\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_refund\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_scan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_credit_card_wireless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cricket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crop_free\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crop_landscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crop_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crop_rotate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crop_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crosshairs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crosshairs_gps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cryengine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_crystal_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cube\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cube_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cube_scan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cube_send\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cube_unfolded\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cup_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cup_water\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cupcake\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_curling\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_bdt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_brl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_btc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_chf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_cny\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_eth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_eur\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_gbp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_ils\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_inr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_jpy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_krw\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_kzt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_ngn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_php\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_rub\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_sign\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_try\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_twd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_usd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_currency_usd_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_current_ac\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_current_dc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cursor_default\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cursor_default_click\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cursor_default_click_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cursor_default_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cursor_move\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cursor_pointer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_cursor_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_import\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_refresh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_database_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_death_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_death_star_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_deathly_hallows\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_debian\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_debug_step_into\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_debug_step_out\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_debug_step_over\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_decagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_decagram_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_decimal_decrease\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_decimal_increase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_forever\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_forever_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_sweep\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_sweep_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delete_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_delta\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_desk_lamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_deskphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_desktop_classic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_desktop_mac\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_desktop_mac_dashboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_desktop_tower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_desktop_tower_monitor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_details\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dev_to\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_developer_board\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_deviantart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dialpad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diameter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diameter_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diameter_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diamond\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diamond_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diamond_stone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_d10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_d12\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_d20\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_d4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_d6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_d8\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dice_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dictionary\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dip_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_directions\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_directions_fork\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_disc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_disc_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_disc_player\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_discord\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dishwasher\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_disqus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_disqus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diving_flippers\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diving_helmet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diving_scuba\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diving_scuba_flag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diving_scuba_tank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diving_scuba_tank_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_diving_snorkel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_division\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_division_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dlna\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dna\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dns\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dns_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_do_not_disturb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_do_not_disturb_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_docker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_doctor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dog_service\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dog_side\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dolby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_domain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_domain_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_donkey\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_door\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_door_closed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_door_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_doorbell_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dot_net\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dots_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dots_horizontal_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dots_horizontal_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dots_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dots_vertical_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dots_vertical_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_douban\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_download_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_download_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_download_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_download_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drag_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drag_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drag_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drama_masks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drawing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drawing_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dribbble\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dribbble_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dropbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_drupal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_duck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dumbbell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_dump_truck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ear_hearing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ear_hearing_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_earth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_earth_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_earth_box_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_earth_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_edge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_egg\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_egg_easter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eight_track\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eject\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eject_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_elephant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_elevation_decline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_elevation_rise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_elevator\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_mark_as_unread\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_open_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_email_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ember\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_angry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_angry_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_cool\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_cool_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_cry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_cry_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_dead\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_dead_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_devil\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_devil_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_excited\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_excited_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_happy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_happy_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_kiss\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_kiss_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_neutral\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_neutral_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_poop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_poop_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_sad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_sad_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_tongue\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_tongue_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_wink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_emoticon_wink_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_engine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_engine_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_engine_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_engine_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_equal_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eraser\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eraser_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_escalator\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eslint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_et\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ethereum\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ethernet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ethernet_cable\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ethernet_cable_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_etsy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ev_station\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eventbrite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_evernote\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_exclamation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_exit_run\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_exit_to_app\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_expand_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_expand_all_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_exponent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_exponent_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_export_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eye_settings_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eyedropper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_eyedropper_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_face\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_face_agent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_face_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_face_profile\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_face_recognition\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_facebook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_facebook_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_facebook_messenger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_facebook_workplace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_factory\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fan_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fast_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fast_forward_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fast_forward_30\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fast_forward_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fax\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_feather\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_feature_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_feature_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fedora\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ferry\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_cabinet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_cancel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_cancel_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_chart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_cloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_compare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_delimited\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document_box_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document_edit_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_document_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_download_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_excel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_excel_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_eye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_eye_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_find\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_find_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_hidden\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_import\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_move\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_pdf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_pdf_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_percent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_powerpoint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_powerpoint_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_presentation_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_question\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_replace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_replace_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_send\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_table\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_table_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_tree\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_undo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_upload_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_word\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_word_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_file_xml\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_film\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_filmstrip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_filmstrip_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_filter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_filter_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_filter_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_filter_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_filter_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_finance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_find_replace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fingerprint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fire\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fire_truck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_firebase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_firefox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fish\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_checkered\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_triangle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flag_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flash_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flash_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flash_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flash_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flash_red_eye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flashlight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flashlight_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flask\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flask_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flask_empty_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flask_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flattr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flickr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flip_to_back\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flip_to_front\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_floor_lamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_floor_plan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_floppy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_floppy_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flower_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flower_poppy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flower_tulip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_flower_tulip_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_account_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_clock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_edit_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_google_drive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_key_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_key_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_lock_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_move\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_multiple_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_open_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_pound\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_pound_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_star_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_sync\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_sync_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_folder_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_font_awesome\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_food\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_food_apple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_food_apple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_food_croissant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_food_fork_drink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_food_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_food_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_football\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_football_australian\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_football_helmet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_forklift\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_align_bottom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_align_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_align_justify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_align_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_align_middle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_align_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_align_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_annotation_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_annotation_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_clear\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_color_fill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_color_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_columns\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_float_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_float_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_float_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_float_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_font\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_font_size_decrease\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_font_size_increase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_decrease\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_increase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_header_pound\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_horizontal_align_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_horizontal_align_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_horizontal_align_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_indent_decrease\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_indent_increase\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_italic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_letter_case\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_letter_case_lower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_letter_case_upper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_line_spacing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_line_style\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_line_weight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_list_bulleted\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_list_bulleted_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_list_bulleted_type\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_list_checkbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_list_checks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_list_numbered\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_list_numbered_rtl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_page_break\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_paint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_paragraph\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_pilcrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_quote_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_quote_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_rotate_90\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_section\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_size\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_strikethrough\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_strikethrough_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_subscript\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_superscript\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_text_rotation_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_text_rotation_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_text_wrapping_clip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_text_wrapping_overflow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_text_wrapping_wrap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_textbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_textdirection_l_to_r\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_textdirection_r_to_l\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_title\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_underline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_vertical_align_bottom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_vertical_align_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_vertical_align_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_wrap_inline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_wrap_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_wrap_tight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_format_wrap_top_bottom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_forum\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_forum_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_forwardburger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fountain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fountain_pen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fountain_pen_tip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_foursquare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_freebsd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fridge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fridge_bottom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fridge_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fridge_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fuel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fullscreen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fullscreen_exit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_function\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_function_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fuse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_fuse_blade\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gamepad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gamepad_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gantry_crane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_garage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_garage_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_garage_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gas_cylinder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gas_station\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate_and\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate_nand\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate_nor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate_not\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate_or\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate_xnor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gate_xor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gauge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gauge_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gauge_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gauge_low\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gavel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gender_female\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gender_male\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gender_male_female\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gender_transgender\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gentoo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_double_tap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_pinch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_spread\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_swipe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_swipe_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_swipe_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_swipe_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_swipe_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_swipe_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_swipe_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_tap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_tap_hold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_two_double_tap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gesture_two_tap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ghost\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ghost_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gif\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gift\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_git\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_github_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_github_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_github_face\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gitlab\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glass_cocktail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glass_flute\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glass_mug\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glass_stange\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glass_tulip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glass_wine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glassdoor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_glasses\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_globe_model\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gmail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gnome\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_go_kart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_go_kart_track\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_golf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gondola\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_goodreads\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_adwords\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_allo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_analytics\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_assistant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_cardboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_chrome\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_circles\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_circles_communities\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_circles_extended\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_circles_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_classroom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_controller\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_controller_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_drive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_earth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_fit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_glass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_hangouts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_home\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_keep\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_lens\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_maps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_nearby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_pages\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_photos\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_physical_web\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_plus_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_spreadsheet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_street_view\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_google_translate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gpu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_gradient\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_grain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_graphql\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_grave_stone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_grease_pencil\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_greater_than\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_greater_than_or_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_grid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_grid_large\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_grid_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_guitar_acoustic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_guitar_electric\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_guitar_pick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_guitar_pick_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_guy_fawkes_mask\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hackernews\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_halloween\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hamburger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hammer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand_okay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand_peace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand_peace_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand_pointing_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand_pointing_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand_pointing_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hand_pointing_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hanger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hard_hat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_harddisk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hat_fedora\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hazard_lights\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hdr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hdr_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headphones\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headphones_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headphones_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headphones_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headphones_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headset_dock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_headset_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_broken\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_broken_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_half_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_half_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_heart_pulse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_helicopter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help_rhombus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_help_rhombus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_slice_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_slice_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_slice_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_slice_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_slice_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagon_slice_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hexagram_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_high_definition\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_high_definition_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_highway\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hiking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hinduism\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_history\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hockey_puck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hockey_sticks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hololens\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_assistant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_automation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_city\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_city_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_currency_usd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_0\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_a\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_b\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_l\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_floor_negative_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_group\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_lock_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_map_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_modern\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_home_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hook_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hops\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_horseshoe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hospital\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hospital_building\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hospital_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hot_tub\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hotel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_houzz\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_houzz_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hubspot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_hulu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_child\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_female\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_female_boy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_female_female\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_female_girl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_greeting\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_handsdown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_handsup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_male\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_male_boy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_male_female\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_male_girl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_male_male\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_human_pregnant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_humble_bundle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ice_cream\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_iframe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_iframe_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_album\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_area\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_area_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_broken\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_broken_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_black_white\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_center_focus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_center_focus_weak\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_drama\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_frames\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_hdr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_tilt_shift\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_filter_vintage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_move\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_size_select_actual\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_size_select_large\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_image_size_select_small\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_import\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_inbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_inbox_arrow_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_inbox_arrow_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_inbox_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_inbox_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_incognito\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_infinity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_information\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_information_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_information_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_instagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_instapaper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_internet_explorer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_invert_colors\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ip_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ip_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ipod\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_islam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_itunes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_jabber\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_jeepney\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_jira\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_jquery\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_jsfiddle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_json\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_judaism\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_kabaddi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_karate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keg\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_kettle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_key_change\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_key_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_key_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_key_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_key_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_key_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_backspace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_caps\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_return\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_settings_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_tab\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_keyboard_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_kickstarter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_knife\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_knife_military\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_kodi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_label\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_label_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_label_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_label_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_label_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_label_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ladybug\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lambda\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lan_connect\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lan_disconnect\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lan_pending\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_c\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_cpp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_csharp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_css3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_go\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_haskell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_html5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_java\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_javascript\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_lua\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_php\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_python\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_python_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_r\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_ruby_on_rails\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_swift\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_language_typescript\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_laptop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_laptop_chromebook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_laptop_mac\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_laptop_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_laptop_windows\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_laravel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lastfm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lastpass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_launch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lava_lamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_layers\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_layers_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_layers_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_layers_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lead_pencil\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_leaf\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_leaf_maple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_leak\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_leak_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_led_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_led_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_led_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_led_strip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_led_variant_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_led_variant_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_led_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_less_than\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_less_than_or_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_library\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_library_books\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_library_movie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_library_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_library_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_library_shelves\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_library_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lifebuoy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_light_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lightbulb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lightbulb_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lightbulb_on_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lightbulb_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lighthouse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lighthouse_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_box_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_box_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_link_variant_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_linkedin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_linkedin_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_linux\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_linux_mint\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_litecoin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_loading\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_open_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_pattern\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_question\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_reset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lock_smart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_locker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_locker_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_login\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_login_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_logout\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_logout_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_looks\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_loop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_loupe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lumx\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_lyft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnet_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify_minus_cursor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify_minus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify_plus_cursor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_magnify_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mail_ru\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox_open_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox_open_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox_open_up_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mailbox_up_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_clock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_legend\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_distance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_path\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_marker_radius\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_map_search_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mapbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_margin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_markdown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_marker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_marker_cancel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_marker_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mastodon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mastodon_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_material_design\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_material_ui\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_math_compass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_math_cos\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_math_sin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_math_tan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_matrix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_maxcdn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_medal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_medical_bag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_meetup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_memory\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_down_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_left_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_right_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_swap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_swap_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_menu_up_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_bulleted\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_bulleted_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_draw\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_processing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_reply\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_reply_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_settings_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_message_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_meteor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_metronome\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_metronome_tick\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_micro_sd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microphone_variant_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microscope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microsoft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microsoft_dynamics\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_microwave\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_midi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_midi_port\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minecraft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mini_sd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minidisc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minus_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minus_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minus_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minus_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minus_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_minus_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mixcloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mixed_martial_arts\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mixed_reality\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mixer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_molecule\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor_cellphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor_cellphone_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor_dashboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_monitor_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_more\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mother_nurse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_motion_sensor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_motorbike\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mouse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mouse_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mouse_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mouse_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mouse_variant_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_move_resize\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_move_resize_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_movie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_movie_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_movie_roll\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_muffin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_multiplication\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_multiplication_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mushroom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_mushroom_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_bluetooth_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_eighth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_quarter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_sixteenth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_note_whole\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_music_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nas\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nativescript\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nature\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nature_people\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_navigation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_near_me\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_needle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_netflix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_1_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_2_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_3_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_4_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_network_strength_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_new_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_newspaper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nfc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nfc_tap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nfc_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ninja\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nintendo_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nodejs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_not_equal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_not_equal_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_note\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_note_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_note_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_note_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_note_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_note_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_note_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_notebook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_notification_clear_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_npm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_npm_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_npm_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nuke\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_null\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_0\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_0_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_0_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_0_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_0_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_0_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_1_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_1_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_1_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_1_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_1_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_2_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_2_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_2_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_2_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_2_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_3_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_3_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_3_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_3_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_3_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_4_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_4_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_4_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_4_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_4_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_5\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_5_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_5_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_5_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_5_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_5_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_6\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_6_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_6_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_6_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_6_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_6_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_7\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_7_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_7_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_7_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_7_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_7_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_8\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_8_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_8_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_8_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_8_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_8_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_plus_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_plus_box_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_plus_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_plus_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_numeric_9_plus_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nut\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_nutrition\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_oar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ocarina\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_octagon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_octagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_octagram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_octagram_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_odnoklassniki\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_office\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_office_building\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_oil\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_oil_temperature\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_omega\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_one_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_onedrive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_onenote\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_onepassword\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_opacity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_open_in_app\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_open_in_new\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_open_source_initiative\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_openid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_opera\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_orbit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_origin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ornament\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ornament_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_outlook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_owl\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pac_man\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_package\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_package_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_package_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_package_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_package_variant_closed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_first\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_last\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_layout_body\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_layout_footer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_layout_header\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_layout_sidebar_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_layout_sidebar_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_next\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_next_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_previous\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_page_previous_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_palette\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_palette_advanced\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_palette_swatch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_bottom_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_bottom_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_top_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_top_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pan_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_panda\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pandora\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_panorama\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_panorama_fisheye\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_panorama_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_panorama_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_panorama_wide_angle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_paper_cut_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_paperclip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_parachute\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_parachute_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_parking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_passport\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_passport_biometric\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_patreon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pause\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pause_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pause_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pause_octagon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pause_octagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_paw\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_paw_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_paypal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_peace\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pen_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pen_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pen_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pen_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pen_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_lock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_minus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pencil_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pentagon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pentagon_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_percent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_periodic_table\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_periodic_table_co2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_periscope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_perspective_less\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_perspective_more\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pharmacy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_classic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_hangup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_in_talk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_incoming\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_log\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_missed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_outgoing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_paused\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_return\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_rotate_landscape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_rotate_portrait\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_phone_voip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pi_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pi_hole\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_piano\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pickaxe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pier\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pier_crane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pig\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pillar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pin_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pin_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pin_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pine_tree\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pine_tree_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pinterest\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pinterest_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pinwheel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pinwheel_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pipe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pipe_disconnected\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pipe_leak\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pirate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pistol\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_piston\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pizza\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_pause\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_protected_content\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_play_speed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_music_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playlist_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_playstation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_circle_multiple_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_minus_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_one\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pocket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_podcast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_podium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_podium_bronze\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_podium_gold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_podium_silver\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_point_of_sale\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pokeball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pokemon_go\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_poker_chip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_polaroid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_poll\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_poll_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_polymer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pool\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_popcorn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_postage_stamp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pot_mix\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pound\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pound_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_cycle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_on\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_plug\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_plug_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_sleep\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_socket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_socket_au\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_socket_eu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_socket_uk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_socket_us\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_power_standby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_powershell\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_prescription\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_presentation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_presentation_play\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_printer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_printer_3d\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_printer_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_printer_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_printer_wireless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_priority_high\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_priority_low\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_professional_hexagon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_progress_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_progress_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_progress_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_progress_download\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_progress_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_progress_wrench\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_projector\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_projector_screen\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_publish\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pulse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_pumpkin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_puzzle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_puzzle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_qi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_qqchat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_qrcode\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_qrcode_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_qrcode_scan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_quadcopter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_quality_high\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_quality_low\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_quality_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_quicktime\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_quora\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rabbit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_racing_helmet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_racquetball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radar\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radiator\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radiator_disabled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radiator_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radio_am\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radio_fm\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radio_handheld\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radio_tower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radioactive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radiobox_blank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radiobox_marked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radius\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_radius_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_raspberry_pi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ray_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ray_end_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ray_start\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ray_start_arrow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ray_start_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ray_vertex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_react\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_read\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_receipt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_record\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_record_player\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_record_rec\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_recycle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reddit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_redo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_redo_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reflect_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reflect_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_refresh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_regex\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_registered_trademark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_relative_scale\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reminder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_remote\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_remote_desktop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rename_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reorder_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reorder_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_repeat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_repeat_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_repeat_once\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_replay\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reply\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reply_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_reproduction\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_resistor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_resistor_nodes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_resize\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_resize_bottom_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_responsive\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_restart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_restart_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_restore_clock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rewind\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rewind_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rewind_30\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rewind_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rhombus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rhombus_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rhombus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rhombus_split\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ribbon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ring\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_road\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_road_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_robot\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_robot_industrial\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_robot_vacuum\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_robot_vacuum_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rocket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_roller_skate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rollerblade\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rollupjs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_room_service\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_room_service_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rotate_3d\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rotate_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rotate_left_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rotate_orbit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rotate_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rotate_right_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rounded_corner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_router_wireless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_router_wireless_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_routes\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rowing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rss\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rss_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ruby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_rugby\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ruler\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ruler_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_run\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_run_fast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sack_percent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_safe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_safety_goggles\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sale\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_salesforce\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sass\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_satellite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_satellite_uplink\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_satellite_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sausage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_saxophone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_scale\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_scale_balance\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_scale_bathroom\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_scanner\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_scanner_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_school\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_scissors_cutting\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screen_rotation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screen_rotation_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screw_flat_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screw_lag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screw_machine_flat_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screw_machine_round_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screw_round_top\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_screwdriver\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_script\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_script_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_script_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_script_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_search_web\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_flat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_flat_angled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_individual_suite\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_legroom_extra\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_legroom_normal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_legroom_reduced\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_recline_extra\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seat_recline_normal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_seatbelt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_security\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_security_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_select\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_select_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_select_color\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_select_compare\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_select_drag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_select_inverse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_select_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_selection\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_selection_drag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_selection_ellipse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_selection_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_send\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_send_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_send_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_send_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_serial_port\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server_network_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_server_security\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_all\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_center_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_left_center\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_left_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_none\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_set_top_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_settings_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_settings_helper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_settings_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shape\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shape_circle_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shape_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shape_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shape_polygon_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shape_rectangle_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shape_square_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_share\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_share_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_share_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sheep\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_account_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_airplane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_airplane_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_check_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_cross\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_cross_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_half_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_home\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_home_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_key\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_key_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_link_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_link_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_lock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_remove_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shield_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ship_wheel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shoe_formal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shoe_heel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shoe_print\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shopify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shopping\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shopping_music\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shovel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shovel_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shower_head\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shredder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shuffle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shuffle_disabled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_shuffle_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sigma\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sigma_lower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sign_caution\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sign_direction\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sign_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_2g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_3g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_4g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_5g\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_cellular_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_cellular_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_cellular_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_cellular_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_hspa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_hspa_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signal_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signature\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signature_freehand\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signature_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_signature_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_silo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_silverware\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_silverware_fork\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_silverware_fork_knife\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_silverware_spoon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_silverware_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sim\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sim_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sim_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sina_weibo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sitemap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skew_less\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skew_more\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_backward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_next\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_next_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_next_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_previous\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_previous_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skip_previous_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skull\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skull_crossbones\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skull_crossbones_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skull_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skype\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_skype_business\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_slack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_slackware\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sleep\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sleep_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_slope_downhill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_slope_uphill\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_smog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_smoke_detector\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_smoking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_smoking_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_snapchat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_snowflake\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_snowman\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_soccer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_soccer_field\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sofa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_solar_panel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_solar_panel_large\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_solar_power\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_solid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort_alphabetical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort_ascending\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort_descending\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort_numeric\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort_variant_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sort_variant_lock_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_soundcloud\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_branch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_commit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_commit_end\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_commit_end_local\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_commit_local\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_commit_next_local\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_commit_start\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_commit_start_next_local\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_fork\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_merge\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_pull\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_repository\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_source_repository_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_soy_sauce\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spa\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spa_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_space_invaders\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_speaker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_speaker_bluetooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_speaker_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_speaker_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_speaker_wireless\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_speedometer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spellcheck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spider_web\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spotify\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spotlight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spotlight_beam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spray\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_spray_bottle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_edit_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_inc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_inc_cash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_medium_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_root\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_root_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_square_small\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_squeegee\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ssh\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stack_exchange\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stack_overflow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stadium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stairs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stamper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_standard_definition\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_box_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_face\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_four_points\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_four_points_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_half\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_three_points\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_star_three_points_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_steam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_steam_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_steering\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_steering_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_step_backward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_step_backward_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_step_forward\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_step_forward_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stethoscope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sticker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sticker_emoji\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stocking\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stop\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stop_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stop_circle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_store\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_store_24_hour\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_stove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_strava\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_subdirectory_arrow_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_subdirectory_arrow_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_subtitles\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_subtitles_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_subway\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_subway_alert_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_subway_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_summit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sunglasses\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_surround_sound\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_surround_sound_2_0\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_surround_sound_3_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_surround_sound_5_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_surround_sound_7_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_svg\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_swap_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_swap_horizontal_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_swap_horizontal_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_swap_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_swap_vertical_bold\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_swap_vertical_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_swim\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sword\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sword_cross\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_symfony\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sync\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sync_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_sync_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tab\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tab_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tab_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tab_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tab_unselected\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_border\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_column\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_column_plus_after\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_column_plus_before\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_column_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_column_width\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_large\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_merge_cells\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_of_contents\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_row\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_row_height\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_row_plus_after\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_row_plus_before\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_row_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_search\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_table_settings\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tablet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tablet_android\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tablet_cellphone\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tablet_ipad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_taco\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_faces\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_heart\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_heart_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_remove\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tag_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tank\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tape_measure\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_target\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_target_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_target_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_taxi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tea\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tea_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_teach\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_teamviewer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_telegram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_telescope\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_television\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_television_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_television_classic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_television_classic_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_television_guide\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_television_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_temperature_celsius\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_temperature_fahrenheit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_temperature_kelvin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tennis\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tennis_ball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_terrain\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_test_tube\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_test_tube_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_test_tube_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_text_shadow\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_text_short\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_text_subject\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_text_to_speech\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_text_to_speech_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_textbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_textbox_password\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_texture\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_theater\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_theme_light_dark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermometer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermometer_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermometer_chevron_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermometer_chevron_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermometer_lines\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermometer_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermometer_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermostat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thermostat_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thought_bubble\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thought_bubble_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thumb_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thumb_down_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thumb_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thumb_up_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_thumbs_up_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ticket\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ticket_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ticket_confirmation\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ticket_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ticket_percent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tie\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tilde\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timelapse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timeline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timeline_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timeline_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timeline_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timer_10\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timer_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timer_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timer_sand\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timer_sand_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timer_sand_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_timetable\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toaster_oven\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toggle_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toggle_switch_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toggle_switch_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toggle_switch_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toilet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toolbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_toolbox_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_edit\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_image_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_plus_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_text\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooltip_text_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooth\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tooth_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tortoise\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tournament\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tower_beach\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tower_fire\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_towing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_track_light\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trackpad\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trackpad_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tractor\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trademark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_traffic_light\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_train\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_train_car\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_train_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transcribe\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transcribe_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transfer_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transfer_left\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transfer_right\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transfer_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transit_connection\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transit_connection_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transit_transfer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transition\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transition_masked\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_translate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_translate_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_transmission_tower\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trash_can\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trash_can_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_treasure_chest\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tree\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trello\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trending_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trending_neutral\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trending_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_triangle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_triangle_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_triforce\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trophy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trophy_award\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trophy_broken\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trophy_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trophy_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_trophy_variant_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_truck\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_truck_check\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_truck_delivery\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_truck_fast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_truck_trailer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tshirt_crew\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tshirt_crew_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tshirt_v\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tshirt_v_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tumble_dryer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tumblr\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tumblr_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tumblr_reblog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tune\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_tune_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_turnstile\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_turnstile_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_turtle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_twitch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_twitter\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_twitter_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_twitter_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_twitter_retweet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_two_factor_authentication\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_uber\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ubisoft\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ubuntu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ultra_high_definition\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_umbraco\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_umbrella\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_umbrella_closed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_umbrella_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_undo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_undo_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_unfold_less_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_unfold_less_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_unfold_more_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_unfold_more_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_ungroup\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_unity\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_unreal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_untappd\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_update\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_upload\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_upload_multiple\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_upload_network\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_upload_network_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_upload_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_usb\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_van_passenger\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_van_utility\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vanish\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_variable\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_arrange_above\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_arrange_below\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_bezier\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_circle_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_combine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_curve\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_difference\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_difference_ab\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_difference_ba\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_ellipse\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_intersection\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_line\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_point\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_polygon\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_polyline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_radius\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_rectangle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_selection\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_square\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_triangle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vector_union\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_venmo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vhs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vibrate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vibrate_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_3d\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_4k_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_account\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_image\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_input_antenna\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_input_component\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_input_hdmi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_input_svideo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_stabilization\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_switch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_video_vintage\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_agenda\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_array\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_carousel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_column\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_dashboard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_dashboard_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_dashboard_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_day\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_grid\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_headline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_list\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_module\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_parallel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_quilt\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_sequential\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_split_horizontal\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_split_vertical\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_stream\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_view_week\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vimeo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_violin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_virtual_reality\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_visual_studio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_visual_studio_code\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vk_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vk_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vlc\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_voice\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_voicemail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volleyball\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_high\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_low\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_minus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_mute\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_plus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_volume_variant_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vote\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vote_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vpn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_vuejs\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_walk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wall\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wall_sconce\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wall_sconce_flat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wall_sconce_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wallet\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wallet_giftcard\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wallet_membership\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wallet_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wallet_travel\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wallpaper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wan\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_washing_machine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch_export\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch_export_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch_import\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch_import_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch_vibrate\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watch_vibrate_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_water\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_water_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_water_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_water_percent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_water_pump\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_watermark\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_waves\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_waze\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_cloudy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_fog\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_hail\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_hurricane\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_lightning\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_lightning_rainy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_night\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_partlycloudy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_pouring\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_rainy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_snowy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_snowy_rainy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_sunny\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_sunset\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_sunset_down\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_sunset_up\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_windy\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weather_windy_variant\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_web\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_webcam\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_webhook\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_webpack\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wechat\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weight\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weight_gram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weight_kilogram\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_weight_pound\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_whatsapp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wheelchair_accessibility\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_whistle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_white_balance_auto\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_white_balance_incandescent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_white_balance_iridescent\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_white_balance_sunny\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_widgets\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_star\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_1\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_1_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_1_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_2\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_2_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_2_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_3\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_3_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_3_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_4\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_4_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_4_lock\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_alert_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_lock_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_off_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wifi_strength_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wii\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wiiu\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wikipedia\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wind_turbine\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_window_close\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_window_closed\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_window_maximize\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_window_minimize\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_window_open\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_window_restore\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_windows\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_windows_classic\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wiper\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wiper_wash\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wordpress\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_worker\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wrap\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wrap_disabled\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wrench\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wrench_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_wunderlist\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xamarin\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xamarin_outline\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xaml\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_battery_alert\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_battery_charging\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_battery_empty\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_battery_full\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_battery_low\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_battery_medium\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_battery_unknown\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xbox_controller_off\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xda\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xing\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xing_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xing_circle\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xml\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_xmpp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_yahoo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_yammer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_yeast\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_yelp\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_yin_yang\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_youtube\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_youtube_creator_studio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_youtube_gaming\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_youtube_subscription\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_youtube_tv\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_z_wave\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zend\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zigbee\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zip_box\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zip_disk\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_aquarius\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_aries\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_cancer\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_capricorn\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_gemini\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_leo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_libra\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_pisces\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_sagittarius\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_scorpio\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_taurus\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_zodiac_virgo\"; type: \"string\"; isReadonly: true }\n        Property { name: \"mdi_blank\"; type: \"string\"; isReadonly: true }\n        Method { name: \"init\"; type: \"QVariant\" }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/materialicons/qmake_asemanmaterialicons.qrc",
    "content": "<!DOCTYPE RCC><RCC version=\"1.0\">\n<qresource prefix=\"/AsemanQml/\">\n<file>MaterialIcons/materialdesignicons-webfont.ttf</file>\n<file>MaterialIcons/MaterialIcons-Regular.ttf</file>\n<file>MaterialIcons/MaterialIcons.qml</file>\n</qresource>\n</RCC>\n"
  },
  {
    "path": "src/asemanqml/materialicons/qmldir",
    "content": "module AsemanQml.MaterialIcons\nclassname AsemanMaterialIconsPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlmaterialicons\n\n"
  },
  {
    "path": "src/asemanqml/models/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmodelsplugin.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemmodels.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicklistmodel.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicklistmodelsource.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanabstractquicklistmodelhint.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicklistmodelcamelcasehint.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicklistmodelcopyhint.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicklistmodeldeletehint.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicklistmodelformathint.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmodelsplugin.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemmodels.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicklistmodel.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicklistmodelsource.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanabstractquicklistmodelhint.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicklistmodelcamelcasehint.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicklistmodelcopyhint.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicklistmodeldeletehint.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicklistmodelformathint.cpp\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/asemanqml/models/asemanabstractquicklistmodelhint.cpp",
    "content": "#include \"asemanabstractquicklistmodelhint.h\"\n\n#include <QRegularExpression>\n\nAsemanAbstractQuickListModelHint::AsemanAbstractQuickListModelHint(QObject *parent) :\n    QObject(parent)\n{\n\n}\n\nQVariant AsemanAbstractQuickListModelHint::getPathValue(QVariant data, const QString &path)\n{\n    if (path.isEmpty())\n        return data;\n\n    QStringList pathList = path.split(QStringLiteral(\"->\"));\n    for (const QString &pt: pathList)\n    {\n        QRegularExpression rx(QStringLiteral(\"(\\\\w+)\\\\s*\\\\[\\\\s*(\\\\d+)\\\\s*\\\\]$\"));\n        auto i = rx.globalMatch(pt);\n        if (i.hasNext())\n        {\n            auto m = i.next();\n            QString key = m.captured(1);\n            qint32 idx = m.captured(2).toInt();\n\n            QVariantList list = data.toMap().value(key).toList();\n            if (idx < list.count())\n                data = list.at(idx);\n            else\n            {\n                data = QVariant();\n                break;\n            }\n        }\n        else\n            data = data.toMap().value(pt);\n    }\n\n    return data;\n}\n\nQVariant AsemanAbstractQuickListModelHint::setPathValue(const QVariant &data, const QString &path, const QVariant &value)\n{\n    if (path.isEmpty())\n        return value;\n\n    QStringList pathList = path.split(QStringLiteral(\"->\"));\n    return setPathValue(data, pathList, value);\n}\n\nQVariant AsemanAbstractQuickListModelHint::setPathValue(const QVariant &data, QStringList pathList, const QVariant &value)\n{\n    if (pathList.isEmpty())\n        return value;\n\n    QString pt = pathList.takeFirst();\n\n    QVariantMap map = data.toMap();\n\n    QRegularExpression rx(QStringLiteral(\"(\\\\w+)\\\\s*\\\\[\\\\s*(\\\\d+)\\\\s*\\\\]$\"));\n    auto i = rx.globalMatch(pt);\n    if (i.hasNext())\n    {\n        auto m = i.next();\n        QString key = m.captured(1);\n        qint32 idx = m.captured(2).toInt();\n\n        QVariantList list = map.value(key).toList();\n        if (idx < list.count())\n            list[idx] = setPathValue(list.at(idx), pathList, value);\n        else\n            list << setPathValue(QVariant(), pathList, value);\n\n        map[key] = list;\n    }\n    else\n        map[pt] = setPathValue(map.value(pt), pathList, value);\n\n    return map;\n}\n\nQVariant AsemanAbstractQuickListModelHint::deletePath(const QVariant &data, const QString &path)\n{\n    if (path.isEmpty())\n        return QVariantMap();\n\n    QStringList pathList = path.split(QStringLiteral(\"->\"));\n    return deletePath(data, pathList);\n}\n\nQVariant AsemanAbstractQuickListModelHint::deletePath(const QVariant &data, QStringList pathList)\n{\n    if (pathList.isEmpty())\n        return QVariant();\n\n    QString pt = pathList.takeFirst();\n\n    QVariantMap map = data.toMap();\n\n    QRegularExpression rx(QStringLiteral(\"(\\\\w+)\\\\s*\\\\[\\\\s*(\\\\d+)\\\\s*\\\\]$\"));\n    auto i = rx.globalMatch(pt);\n    if (i.hasNext())\n    {\n        auto m = i.next();\n        QString key = m.captured(1);\n        qint32 idx = m.captured(2).toInt();\n\n        QVariantList list = map.value(key).toList();\n        if (idx < list.count())\n            list[idx] = deletePath(list.at(idx), pathList);\n\n        map[key] = list;\n    }\n    else\n    {\n        if (pathList.isEmpty())\n            map.remove(pt);\n        else\n            map[pt] = deletePath(map.value(pt), pathList);\n    }\n\n    return map;\n}\n\nAsemanAbstractQuickListModelHint::~AsemanAbstractQuickListModelHint()\n{\n\n}\n"
  },
  {
    "path": "src/asemanqml/models/asemanabstractquicklistmodelhint.h",
    "content": "#ifndef ASEMANABSTRACTQUICKLISTMODELHINT_H\n#define ASEMANABSTRACTQUICKLISTMODELHINT_H\n\n#include <QObject>\n#include <QVariant>\n\nclass AsemanAbstractQuickListModelHint : public QObject\n{\n    Q_OBJECT\n    friend class AsemanQuickListModel;\n    friend class AsemanQuickListModelSource;\n\npublic:\n    AsemanAbstractQuickListModelHint(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanAbstractQuickListModelHint();\n\nprotected:\n    virtual QVariantMap analyze(const QVariantMap &map) = 0;\n    static QVariant getPathValue(QVariant data, const QString &path);\n    static QVariant setPathValue(const QVariant &data, const QString &path, const QVariant &value);\n    static QVariant deletePath(const QVariant &data, const QString &path);\n\nprivate:\n    static QVariant setPathValue(const QVariant &data, QStringList pathList, const QVariant &value);\n    static QVariant deletePath(const QVariant &data, QStringList pathList);\n};\n\n#endif // ASEMANABSTRACTQUICKLISTMODELHINT_H\n"
  },
  {
    "path": "src/asemanqml/models/asemanmodelsplugin.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanmodelsplugin.h\"\n\n#include \"asemanqttoolsitemmodels.h\"\n\n#include <QDebug>\n#include <QDir>\n#include <QStringList>\n#include <QtQml>\n\n#ifdef QT_ASEMAN_EMBEDDED\nbool asemanqml_models_plugin_registered = AsemanModelsPlugin::registerStaticTypes(\"AsemanQml.Models\");\n#endif\n\nbool AsemanModelsPlugin::registerStaticTypes(const char *uri)\n{\n    AsemanQtToolsItemModels::registerTypes(uri);\n    return true;\n}\n\nvoid AsemanModelsPlugin::registerTypes(const char *uri)\n{\n    AsemanModelsPlugin::registerStaticTypes(uri);\n}\n\nvoid AsemanModelsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)\n{\n    QQmlExtensionPlugin::initializeEngine(engine, uri);\n    AsemanQtTools::initializeEngine(engine, uri);\n}\n"
  },
  {
    "path": "src/asemanqml/models/asemanmodelsplugin.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANMODELSPLUGIN_H\n#define ASEMANMODELSPLUGIN_H\n\n#include <QQmlExtensionPlugin>\n\nclass AsemanModelsPlugin : public QQmlExtensionPlugin\n{\n    Q_OBJECT\n\n#ifndef QT_ASEMAN_EMBEDDED\n    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)\n#endif\n\npublic:\n    static bool registerStaticTypes(const char *uri);\n\n    void registerTypes(const char *uri);\n    void initializeEngine(QQmlEngine *engine, const char *uri);\n};\n\n#endif // ASEMANMODELSPLUGIN_H\n"
  },
  {
    "path": "src/asemanqml/models/asemanqttoolsitemmodels.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtToolsItemModels is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtToolsItemModels is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanqttoolsitemmodels.h\"\n\n#include \"asemancountriesmodel.h\"\n#include \"asemanfilesystemmodel.h\"\n#include \"asemancalendarmodel.h\"\n#include \"asemanmixedlistmodel.h\"\n#include \"asemanquicklistmodel.h\"\n#include \"asemanquicklistmodelcopyhint.h\"\n#include \"asemanquicklistmodelsource.h\"\n#include \"asemanquicklistmodelformathint.h\"\n#include \"asemanabstractquicklistmodelhint.h\"\n#include \"asemanquicklistmodelcamelcasehint.h\"\n#include \"asemanquicklistmodeldeletehint.h\"\n\n#include <qqml.h>\n#include <QHash>\n#include <QSet>\n#include <QPointer>\n#include <QFile>\n#include <QDir>\n\nstatic QStringList aseman_qt_tools_indexCache;\nstatic QString aseman_qt_tools_destination;\n\nvoid AsemanQtToolsItemModels::registerTypes(const char *uri, bool exportMode)\n{\n    static QSet<QByteArray> register_list;\n    if (register_list.contains(uri) && !exportMode)\n        return;\n\n    registerType<AsemanCalendarModel>(uri, 2, 0, \"CalendarModel\", exportMode);\n    registerType<AsemanQuickListModel>(uri, 2, 0, \"AsemanListModel\", exportMode);\n    registerType<AsemanQuickListModelSource>(uri, 2, 0, \"AsemanListModelSource\", exportMode);\n    registerType<AsemanQuickListModelCopyHint>(uri, 2, 0, \"ModelCopyHint\", exportMode);\n    registerType<AsemanQuickListModelFormatHint>(uri, 2, 0, \"ModelFormatHint\", exportMode);\n    registerType<AsemanQuickListModelCamelCaseHint>(uri, 2, 0, \"ModelCamelCaseHint\", exportMode);\n    registerType<AsemanQuickListModelDeleteHint>(uri, 2, 0, \"ModelDeleteHint\", exportMode);\n    registerModel<AsemanMixedListModel>(uri, 2, 0, \"MixedListModel\", exportMode);\n    registerModel<AsemanCountriesModel>(uri, 2, 0, \"CountriesModel\", exportMode);\n    registerModel<AsemanFileSystemModel>(uri, 2, 0, \"FileSystemModel\", exportMode);\n\n    qmlRegisterUncreatableType<AsemanAbstractQuickListModelHint>(uri, 2, 0, \"AsemanAbstractQuickListModelHint\", \"\");\n\n    register_list.insert(uri);\n}\n\nvoid AsemanQtToolsItemModels::registerFiles(const QString &filesLocation, const char *uri)\n{\n    QFile file(filesLocation + QStringLiteral(\"/qmldir\"));\n    if(file.open(QFile::ReadOnly))\n    {\n        QStringList lines = QString::fromUtf8(file.readAll()).split(QStringLiteral(\"\\n\"), Qt::SkipEmptyParts);\n        file.close();\n\n        for(const QString &l: lines)\n        {\n            QStringList parts = l.trimmed().split(QStringLiteral(\" \"), Qt::SkipEmptyParts);\n            bool singleton = false;\n            if(parts.count() && parts.first() == \"singleton\")\n                singleton = parts.takeFirst().count();\n            if(parts.length() != 3)\n                continue;\n\n            QStringList version = parts.at(1).split(QStringLiteral(\".\"), Qt::SkipEmptyParts);\n            if(version.count() != 2)\n                continue;\n\n            if(singleton)\n                qmlRegisterSingletonType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                         uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n            else\n                qmlRegisterType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n        }\n    }\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemModels::registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemModels::registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportModel<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemModels::registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterSingletonType<T>(uri, versionMajor, versionMinor, typeName, callback);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemModels::registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(qmlName));\n    else\n        return qmlRegisterUncreatableType<T>(uri, versionMajor, versionMinor, qmlName, reason);\n    return 0;\n}\n\n\nvoid AsemanQtToolsItemModels::exportDocuments(const QString &destination)\n{\n    aseman_qt_tools_destination = destination;\n\n    QDir().mkpath(aseman_qt_tools_destination);\n    aseman_qt_tools_indexCache.clear();\n\n    AsemanQtToolsItemModels::registerTypes(\"AsemanToolsItem\", true);\n\n    QString index = QStringLiteral(\"# AsemanToolsItem Documents\\n\\n\");\n    index += QStringLiteral(\"### [Getting Started](gettingstarted.md)\\n\\n\");\n    index += QStringLiteral(\"### How to import:\\n\\n\");\n    index += QStringLiteral(\"```c++\\nimport AsemanQml.Base 2.0\\n```\\n\\nor\\n\\n\"\n             \"```c++\\nimport AsemanQml.Base 2.0 as Aseman\\n```\\n\\n\");\n    index += QStringLiteral(\"### Types\\n\\nHere are all components of the AsemanToolsItem:\\n\\n\");\n    for(const QString cmpnt: aseman_qt_tools_indexCache)\n    {\n        if(cmpnt == QStringLiteral(\"MimeData\"))\n            index += QStringLiteral(\"\\n##### Normal types\\n\\n\");\n        if(cmpnt == QStringLiteral(\"MixedListModel\"))\n            index += QStringLiteral(\"\\n##### Models\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Devices\"))\n            index += QStringLiteral(\"\\n##### Singletons\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Screen\"))\n            index += QStringLiteral(\"\\n##### Uncreatable types\\n\\n\");\n        index += QStringLiteral(\" * [%1](%2.md)\\n\").arg(cmpnt).arg(cmpnt.toLower());\n    }\n\n    QString path = aseman_qt_tools_destination + \"/start.md\";\n    aseman_qt_tools_destination.clear();\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return;\n\n    file.write(index.toUtf8());\n    file.close();\n}\n\nQString AsemanQtToolsItemModels::fixType(const QString &type)\n{\n    if(type == QStringLiteral(\"QSizeF\") || type == QStringLiteral(\"QSize\"))\n        return QStringLiteral(\"size\");\n    if(type == QStringLiteral(\"QPoint\") || type == QStringLiteral(\"QPointF\"))\n        return QStringLiteral(\"point\");\n    if(type == QStringLiteral(\"QUrl\"))\n        return QStringLiteral(\"url\");\n    if(type == QStringLiteral(\"QString\"))\n        return QStringLiteral(\"string\");\n    if(type == QStringLiteral(\"QByteArray\"))\n        return QStringLiteral(\"byte\");\n    if(type == QStringLiteral(\"bool\"))\n        return QStringLiteral(\"boolean\");\n    if(type == QStringLiteral(\"double\") || type == QStringLiteral(\"qreal\"))\n        return QStringLiteral(\"real\");\n    if(type == QStringLiteral(\"QVariant\"))\n        return QStringLiteral(\"variant\");\n    if(type == QStringLiteral(\"QJSValue\"))\n        return QStringLiteral(\"function(){[code]}\");\n    if(type == QStringLiteral(\"QVariantMap\"))\n        return QStringLiteral(\"map\");\n    if(type == QStringLiteral(\"QVariantList\"))\n        return QStringLiteral(\"list&lt;variant&gt;\");\n    if(type == QStringLiteral(\"QStringList\"))\n        return QStringLiteral(\"list&lt;string&gt;\");\n    if(type == QStringLiteral(\"QList<qint32>\"))\n        return QStringLiteral(\"list&lt;int&gt;\");\n    if(type.contains(QStringLiteral(\"*\")))\n    {\n        if(type == QStringLiteral(\"QObject*\"))\n            return QStringLiteral(\"object\");\n        if(type.contains(QStringLiteral(\"Telegram\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Telegram\"));\n            return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n        }\n        if(type.contains(QStringLiteral(\"Object\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Object\"));\n            return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                    .arg(name).arg(name.toLower());\n        }\n        if(type == QStringLiteral(\"QQmlComponent*\"))\n            return QStringLiteral(\"Component\");\n        if(type == QStringLiteral(\"QQuickItem\"))\n            return QStringLiteral(\"Item\");\n    }\n    if(type.contains(QStringLiteral(\"Telegram\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Telegram\"));\n        return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n    }\n    if(type == QStringLiteral(\"QQuickItem\"))\n        return QStringLiteral(\"Item\");\n    if(type == QStringLiteral(\"QObject\"))\n        return QStringLiteral(\"object\");\n    if(type.contains(QStringLiteral(\"Object\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Object\"));\n        return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                .arg(name).arg(name.toLower());\n    }\n    return type;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemModels::exportItem(const QString &module, int major, int minor, const QString &component, bool store)\n{\n    QString result;\n    aseman_qt_tools_indexCache << component;\n\n    QMetaObject meta = T::staticMetaObject;\n    QString inherits = fixType(QString::fromUtf8(meta.superClass()? meta.superClass()->className() : \"\"));\n    bool isModel = component.toLower().contains(QStringLiteral(\"model\"));\n\n    result += QStringLiteral(\"# %1\\n\\n\").arg(component);\n\n    QString headers;\n    headers += QStringLiteral(\" * [Component details](#component-details)\\n\");\n\n    QString details = QStringLiteral(\"\\n### Component details:\\n\\n\");\n    details += QStringLiteral(\"|Detail|Value|\\n\"\n                       \"|------|-----|\\n\");\n    details += QStringLiteral(\"|%1|%2 %3.%4|\\n\").arg(QStringLiteral(\"Import\")).arg(module).arg(major).arg(minor);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Component\")).arg(component);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"C++ class\")).arg(QString::fromUtf8(meta.className()));\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Inherits\")).arg(inherits);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Model\")).arg(QString::fromUtf8(isModel?\"Yes\":\"No\"));\n\n    QString resultProperties;\n    QStringList propertiesSignals;\n    for(int i=0; i<meta.propertyCount(); i++)\n    {\n        QMetaProperty property = meta.property(i);\n        const QString &propertyName = QString::fromUtf8(property.name());\n        const QString &propertyType = fixType(QString::fromUtf8(property.typeName()));\n        propertiesSignals << QString::fromUtf8(property.notifySignal().name());\n\n        QString text = QStringLiteral(\"* <font color='#074885'><b>%1</b></font>: %2\").arg(propertyName).arg(propertyType);\n        if(!property.isWritable())\n            text += QStringLiteral(\" (readOnly)\");\n\n        text += QStringLiteral(\"\\n\");\n        if(meta.propertyOffset()<=i)\n            resultProperties += text;\n    }\n\n    QString enumResults;\n    for(int i=meta.enumeratorOffset(); i<meta.enumeratorCount(); i++)\n    {\n        QMetaEnum enumerator = meta.enumerator(i);\n        const QString &enumName = QString::fromUtf8(enumerator.name());\n\n        enumResults += QStringLiteral(\"\\n##### %1\\n\\n\").arg(enumName);\n        enumResults += QStringLiteral(\"|Key|Value|\\n\"\n                               \"|---|-----|\\n\");\n\n        for(int j=0; j<enumerator.keyCount(); j++)\n            enumResults += QStringLiteral(\"|%1|%2|\\n\").arg(QString::fromUtf8(enumerator.key(j))).arg(enumerator.value(j));\n    }\n\n    QString resultSlots;\n    QString resultSignals;\n    for(int i=meta.methodOffset(); i<meta.methodCount(); i++)\n    {\n        QMetaMethod method = meta.method(i);\n        if(method.access() != QMetaMethod::Public)\n            continue;\n\n        const QString &methodName = QString::fromUtf8(method.name());\n        if(propertiesSignals.contains(methodName))\n            continue;\n\n        const QString &methodType = fixType(QString::fromUtf8(method.typeName()));\n\n        QString args;\n        const QList<QByteArray> &paramNames = method.parameterNames();\n        const QList<QByteArray> &paramTypes = method.parameterTypes();\n        for(int j=0; j<paramNames.count(); j++)\n        {\n            if(j != 0)\n                args += QStringLiteral(\", \");\n\n            args += fixType(QString::fromUtf8(paramTypes[j])) + QStringLiteral(\" \") + paramNames[j];\n        }\n\n        QString text = QStringLiteral(\" * %1 <font color='#074885'><b>%2</b></font>(%3)\\n\").arg(methodType).arg(methodName).arg(args);\n        switch(static_cast<int>(method.methodType()))\n        {\n        case QMetaMethod::Slot:\n            resultSlots += text;\n            break;\n        case QMetaMethod::Signal:\n            resultSignals += text;\n            break;\n        }\n    }\n\n    if(!resultProperties.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Normal Properties](#normal-properties)\\n\");\n        resultProperties = QStringLiteral(\"\\n### Normal Properties\\n\\n\") + resultProperties;\n    }\n    if(!enumResults.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Enumerator](#enumerator)\\n\");\n        enumResults = QStringLiteral(\"\\n### Enumerator\\n\\n\") + enumResults;\n    }\n    if(!resultSlots.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Methods](#methods)\\n\");\n        resultSlots = QStringLiteral(\"\\n### Methods\\n\\n\") + resultSlots;\n    }\n    if(!resultSignals.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Signals](#Q_SIGNALS)\\n\");\n        resultSignals = QStringLiteral(\"\\n### Signals\\n\\n\") + resultSignals;\n    }\n    if(isModel)\n        headers += QStringLiteral(\" * [Roles](#roles)\\n\");\n\n    result += headers + QStringLiteral(\"\\n\");\n    result += details + QStringLiteral(\"\\n\");\n    result += resultProperties + QStringLiteral(\"\\n\");\n    result += resultSlots + QStringLiteral(\"\\n\");\n    result += resultSignals + QStringLiteral(\"\\n\");\n    result += enumResults + QStringLiteral(\"\\n\");\n\n    if(!store)\n        return result;\n\n    QString path = aseman_qt_tools_destination + QStringLiteral(\"/\") + component.toLower() + QStringLiteral(\".md\");\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemModels::exportModel(const QString &module, int major, int minor, const QString &component)\n{\n    QString result = exportItem<T>(module, major, minor, component, false);\n    T *model = new T();\n\n    QHash<qint32,QByteArray> roleNames = model->roleNames();\n    QMap<qint32,QByteArray> rolesMap;\n    QHashIterator<qint32,QByteArray> i(roleNames);\n    while(i.hasNext())\n    {\n        i.next();\n        rolesMap[i.key()] = i.value();\n    }\n\n    result += QStringLiteral(\"\\n### Roles\\n\\n\");\n    Q_FOREACH(const QByteArray &name, rolesMap)\n        result += QStringLiteral(\" * model.<font color='#074885'>%1</font>\\n\").arg(QString::fromUtf8(name));\n\n    delete model;\n\n    QString path = aseman_qt_tools_destination + \"/\" + component.toLower() + \".md\";\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n"
  },
  {
    "path": "src/asemanqml/models/asemanqttoolsitemmodels.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQTTOOLSITEMMODELS_H\n#define ASEMANQTTOOLSITEMMODELS_H\n\n#include <QtGlobal>\n#include <QString>\n\n#include <asemanqttools.h>\n\nclass QObject;\nclass QQmlEngine;\nclass QJSEngine;\nclass AsemanQtToolsItemModels: public AsemanQtTools\n{\npublic:\n    static void registerTypes(const char *uri, bool exportMode = false);\n    static void registerFiles(const QString &filesLocation, const char *uri);\n\n    template<typename T>\n    static int registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template<typename T>\n    static int registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template <typename T>\n    static int registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName,\n                                 QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode);\n\n    template<typename T>\n    static int registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason, bool exportMode);\n\n    static void exportDocuments(const QString &destination);\n\nprotected:\n    template<typename T>\n    static QString exportItem(const QString &module, int major, int minor, const QString &component, bool store = true);\n    template<typename T>\n    static QString exportModel(const QString &module, int major, int minor, const QString &component);\n\n    static QString fixType(const QString &type);\n};\n\n#endif // ASEMANQTTOOLSITEMMODELS_H\n"
  },
  {
    "path": "src/asemanqml/models/asemanquicklistmodel.cpp",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanquicklistmodel.h\"\n#include \"asemanquicklistmodelsource.h\"\n\n#include <QTimer>\n#include <QDebug>\n\nclass AsemanQuickListModel::Private\n{\npublic:\n    QList<QObject*> items;\n    QList<AsemanQuickListModelSource*> sources;\n    QList<AsemanAbstractQuickListModelHint*> hints;\n\n    QList<QVariantMap> backupList;\n    QString sortField;\n    bool sortDescending;\n\n    QTimer *reloadTimer;\n};\n\nAsemanQuickListModel::AsemanQuickListModel(QObject *parent) :\n    AsemanListModel(parent)\n{\n    p = new Private;\n    p->sortDescending = false;\n\n    p->reloadTimer = new QTimer(this);\n    p->reloadTimer->setInterval(100);\n    p->reloadTimer->setSingleShot(true);\n\n    QTimer *sourceChangeTimer = new QTimer(this);\n    sourceChangeTimer->setInterval(100);\n    sourceChangeTimer->setSingleShot(true);\n\n    connect(this, &AsemanQuickListModel::itemsChanged, sourceChangeTimer, [sourceChangeTimer](){\n        sourceChangeTimer->stop();\n        sourceChangeTimer->start();\n    });\n    connect(sourceChangeTimer, &QTimer::timeout, this, &AsemanQuickListModel::reloadItems);\n\n    connect(p->reloadTimer, &QTimer::timeout, this, &AsemanQuickListModel::refreshData_prv);\n}\n\nQQmlListProperty<QObject> AsemanQuickListModel::items()\n{\n    return QQmlListProperty<QObject>(this, &p->items, QQmlListProperty<QObject>::AppendFunction(append),\n                                                      QQmlListProperty<QObject>::CountFunction(count),\n                                                      QQmlListProperty<QObject>::AtFunction(at),\n                                                      QQmlListProperty<QObject>::ClearFunction(clear) );\n}\n\nQList<QObject *> AsemanQuickListModel::itemsList() const\n{\n    return p->items;\n}\n\nvoid AsemanQuickListModel::setSortField(const QString &sortField)\n{\n    if (p->sortField == sortField)\n        return;\n\n    p->sortField = sortField;\n    Q_EMIT sortFieldChanged();\n}\n\nQString AsemanQuickListModel::sortField() const\n{\n    return p->sortField;\n}\n\nvoid AsemanQuickListModel::setSortDescending(bool sortDescending)\n{\n    if (p->sortDescending == sortDescending)\n        return;\n\n    p->sortDescending = sortDescending;\n    Q_EMIT sortDescendingChanged();\n}\n\nbool AsemanQuickListModel::sortDescending() const\n{\n    return p->sortDescending;\n}\n\nvoid AsemanQuickListModel::reload()\n{\n    changed(p->backupList);\n}\n\nvoid AsemanQuickListModel::append(QQmlListProperty<QObject> *p, QObject *v)\n{\n    AsemanQuickListModel *aobj = static_cast<AsemanQuickListModel*>(p->object);\n    aobj->p->items.append(v);\n    Q_EMIT aobj->itemsChanged();\n}\n\nint AsemanQuickListModel::count(QQmlListProperty<QObject> *p)\n{\n    AsemanQuickListModel *aobj = static_cast<AsemanQuickListModel*>(p->object);\n    return aobj->p->items.count();\n}\n\nQObject *AsemanQuickListModel::at(QQmlListProperty<QObject> *p, int idx)\n{\n    AsemanQuickListModel *aobj = static_cast<AsemanQuickListModel*>(p->object);\n    return aobj->p->items.at(idx);\n}\n\nvoid AsemanQuickListModel::clear(QQmlListProperty<QObject> *p)\n{\n    AsemanQuickListModel *aobj = static_cast<AsemanQuickListModel*>(p->object);\n    aobj->p->items.clear();\n    Q_EMIT aobj->itemsChanged();\n}\n\nvoid AsemanQuickListModel::reloadItems()\n{\n    while (p->sources.count())\n        disconnect(p->sources.takeFirst(), &AsemanQuickListModelSource::dataChanged, this, &AsemanQuickListModel::refreshData);\n\n    for (QObject *obj: p->items)\n    {\n        AsemanQuickListModelSource *source = qobject_cast<AsemanQuickListModelSource*>(obj);\n        if (!source)\n            continue;\n\n        connect(source, &AsemanQuickListModelSource::dataChanged, this, &AsemanQuickListModel::refreshData);\n        p->sources << source;\n    }\n\n    p->hints.clear();\n    for (QObject *obj: p->items)\n    {\n        AsemanAbstractQuickListModelHint *hint = qobject_cast<AsemanAbstractQuickListModelHint*>(obj);\n        if (!hint)\n            continue;\n\n        p->hints << hint;\n    }\n\n    refreshData();\n}\n\nvoid AsemanQuickListModel::refreshData()\n{\n    p->reloadTimer->stop();\n    p->reloadTimer->start();\n}\n\nvoid AsemanQuickListModel::refreshData_prv()\n{\n    if (p->sources.count())\n    {\n        QVariantList list;\n        for (AsemanQuickListModelSource *src: p->sources)\n            list << src->data();\n\n        change(list);\n    }\n    else\n    if (p->hints.count())\n        changed(p->backupList);\n}\n\nvoid AsemanQuickListModel::changed(const QList<QVariantMap> &l)\n{\n    p->backupList = l;\n    QList<QVariantMap> list = l;\n\n    QList<AsemanAbstractQuickListModelHint*> hints;\n    for (QObject *obj: p->items)\n    {\n        AsemanAbstractQuickListModelHint *hint = qobject_cast<AsemanAbstractQuickListModelHint*>(obj);\n        if (hint)\n            hints << hint;\n    }\n\n    for (qint32 i=0; i<list.count(); i++)\n    {\n        QVariantMap &l = list[i];\n        for (AsemanAbstractQuickListModelHint *h: hints)\n            l = h->analyze(l);\n    }\n\n    if (p->sortField.count())\n    {\n        QMap<QString, QVariantMap> sortMapStr;\n        QMap<qint32, QVariantMap> sortMapInt;\n        for (const QVariantMap &l: list)\n        {\n            QVariant val = AsemanAbstractQuickListModelHint::getPathValue(l, p->sortField);\n            if (val.type() == QVariant::Int || (val.canConvert(QVariant::Int) && val.convert(QVariant::Int)))\n                sortMapInt.insert(val.toInt(), l);\n            else\n                sortMapStr.insert(val.toString(), l);\n        }\n\n        list.clear();\n        list << sortMapInt.values();\n        list << sortMapStr.values();\n\n        if (p->sortDescending)\n            std::reverse(list.begin(), list.end());\n    }\n\n    if (list.isEmpty() && cachePath().length())\n        return;\n\n    AsemanListModel::changed(list);\n}\n\nAsemanQuickListModel::~AsemanQuickListModel()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/asemanqml/models/asemanquicklistmodel.h",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQUICKLISTMODEL_H\n#define ASEMANQUICKLISTMODEL_H\n\n#include <asemanlistmodel.h>\n#include <QQmlListProperty>\n\nclass AsemanQuickListModel : public AsemanListModel\n{\n    Q_OBJECT\n    class Private;\n\n    Q_PROPERTY(QString sortField READ sortField WRITE setSortField NOTIFY sortFieldChanged)\n    Q_PROPERTY(bool sortDescending READ sortDescending WRITE setSortDescending NOTIFY sortDescendingChanged)\n    Q_PROPERTY(QQmlListProperty<QObject> items READ items NOTIFY itemsChanged)\n    Q_CLASSINFO(\"DefaultProperty\", \"items\")\n\npublic:\n    AsemanQuickListModel(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanQuickListModel();\n\n    QQmlListProperty<QObject> items();\n    QList<QObject*> itemsList() const;\n\n    void setSortField(const QString &sortField);\n    QString sortField() const;\n\n    void setSortDescending(bool sortDescending);\n    bool sortDescending() const;\n\nQ_SIGNALS:\n    void itemsChanged();\n    void sortFieldChanged();\n    void sortDescendingChanged();\n\npublic Q_SLOTS:\n    void reload();\n\nprivate:\n    static void append(QQmlListProperty<QObject> *p, QObject *v);\n    static int count(QQmlListProperty<QObject> *p);\n    static QObject *at(QQmlListProperty<QObject> *p, int idx);\n    static void clear(QQmlListProperty<QObject> *p);\n\n    void reloadItems();\n    void refreshData();\n    void refreshData_prv();\n\nprotected:\n    virtual void changed(const QList<QVariantMap> &list);\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanQuickListModel QAsemanQuickListModel;\n\n#endif // ASEMANQUICKLISTMODEL_H\n"
  },
  {
    "path": "src/asemanqml/models/asemanquicklistmodelcamelcasehint.cpp",
    "content": "#include \"asemanquicklistmodelcamelcasehint.h\"\n\n#include <QtQml>\n\nclass AsemanQuickListModelCamelCaseHint::Private\n{\npublic:\n    QString path;\n};\n\nAsemanQuickListModelCamelCaseHint::AsemanQuickListModelCamelCaseHint(QObject *parent) :\n    AsemanAbstractQuickListModelHint(parent)\n{\n    p = new Private;\n}\n\nvoid AsemanQuickListModelCamelCaseHint::setPath(const QString &path)\n{\n    if (p->path == path)\n        return;\n\n    p->path = path;\n    Q_EMIT pathChanged();\n    Q_EMIT changeRequest();\n}\n\nQString AsemanQuickListModelCamelCaseHint::path() const\n{\n    return p->path;\n}\n\nQVariantMap AsemanQuickListModelCamelCaseHint::analyze(const QVariantMap &map)\n{\n    QVariant data = AsemanAbstractQuickListModelHint::getPathValue(map, p->path);\n    QVariant camelCase = toCamelCase(data);\n\n    return AsemanAbstractQuickListModelHint::setPathValue(map, p->path, camelCase.toMap()).toMap();\n}\n\nQVariant AsemanQuickListModelCamelCaseHint::toCamelCase(const QVariant &var)\n{\n    QVariant res;\n\n    switch ( static_cast<int>(var.type()) )\n    {\n    case QVariant::List:\n    {\n        QVariantList listRes;\n        const QVariantList &list = var.toList();\n        for (const QVariant &l: list)\n            listRes << toCamelCase(l);\n\n        res = listRes;\n    }\n        break;\n\n    case QVariant::Map:\n    {\n        QVariantMap map;\n        QMapIterator<QString, QVariant> i(var.toMap());\n        while (i.hasNext())\n        {\n            i.next();\n\n            QStringList parts = i.key().split('_', Qt::SkipEmptyParts);\n            for (int i=1; i<parts.size(); ++i)\n                parts[i].replace(0, 1, parts[i][0].toUpper());\n\n            map[ parts.join(\"\") ] = toCamelCase(i.value());\n        }\n\n        res = map;\n    }\n        break;\n\n    default:\n        res = var;\n        break;\n    }\n\n    return res;\n}\n\nAsemanQuickListModelCamelCaseHint::~AsemanQuickListModelCamelCaseHint()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/asemanqml/models/asemanquicklistmodelcamelcasehint.h",
    "content": "#ifndef ASEMANQUICKLISTMODELCAMELCASEHINT_H\n#define ASEMANQUICKLISTMODELCAMELCASEHINT_H\n\n#include <QObject>\n#include <QJSValue>\n\n#include \"asemanabstractquicklistmodelhint.h\"\n\nclass AsemanQuickListModelCamelCaseHint : public AsemanAbstractQuickListModelHint\n{\n    Q_OBJECT\n    class Private;\n    friend class AsemanQuickListModelSource;\n\n    Q_PROPERTY(QString path READ path WRITE setPath NOTIFY pathChanged)\n\npublic:\n    AsemanQuickListModelCamelCaseHint(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanQuickListModelCamelCaseHint();\n\n    void setPath(const QString &path);\n    QString path() const;\n\nQ_SIGNALS:\n    void pathChanged();\n    void changeRequest();\n\nprotected:\n    virtual QVariantMap analyze(const QVariantMap &map);\n\nprivate:\n    QVariant toCamelCase(const QVariant &var);\n\nprivate:\n    Private *p;\n};\n\n#endif // ASEMANQUICKLISTMODELCAMELCASEHINT_H\n"
  },
  {
    "path": "src/asemanqml/models/asemanquicklistmodelcopyhint.cpp",
    "content": "#include \"asemanquicklistmodelcopyhint.h\"\n\n#include <QtQml>\n\nclass AsemanQuickListModelCopyHint::Private\n{\npublic:\n    QString path;\n    QString targetPath;\n};\n\nAsemanQuickListModelCopyHint::AsemanQuickListModelCopyHint(QObject *parent) :\n    AsemanAbstractQuickListModelHint(parent)\n{\n    p = new Private;\n}\n\nvoid AsemanQuickListModelCopyHint::setPath(const QString &path)\n{\n    if (p->path == path)\n        return;\n\n    p->path = path;\n    Q_EMIT pathChanged();\n    Q_EMIT changeRequest();\n}\n\nQString AsemanQuickListModelCopyHint::path() const\n{\n    return p->path;\n}\n\nvoid AsemanQuickListModelCopyHint::setTargetPath(const QString &targetPath)\n{\n    if (p->targetPath == targetPath)\n        return;\n\n    p->targetPath = targetPath;\n    Q_EMIT targetPathChanged();\n    Q_EMIT changeRequest();\n}\n\nQString AsemanQuickListModelCopyHint::targetPath() const\n{\n    return p->targetPath;\n}\n\nQVariantMap AsemanQuickListModelCopyHint::analyze(const QVariantMap &map)\n{\n    if (p->path.isEmpty())\n    {\n        qmlWarning(this) << \"ModelCopyHint.path is empty\";\n        return map;\n    }\n    if (p->targetPath.isEmpty())\n    {\n        qmlWarning(this) << \"ModelCopyHint.targetPath is empty\";\n        return map;\n    }\n\n    QVariant data = AsemanAbstractQuickListModelHint::getPathValue(map, p->path);\n\n    return AsemanAbstractQuickListModelHint::setPathValue(map, p->targetPath, data).toMap();\n}\n\nAsemanQuickListModelCopyHint::~AsemanQuickListModelCopyHint()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/asemanqml/models/asemanquicklistmodelcopyhint.h",
    "content": "#ifndef ASEMANQUICKLISTMODELCOPYHINT_H\n#define ASEMANQUICKLISTMODELCOPYHINT_H\n\n#include <QObject>\n\n#include \"asemanabstractquicklistmodelhint.h\"\n\nclass AsemanQuickListModelCopyHint : public AsemanAbstractQuickListModelHint\n{\n    Q_OBJECT\n    class Private;\n    friend class AsemanQuickListModelSource;\n\n    Q_PROPERTY(QString path READ path WRITE setPath NOTIFY pathChanged)\n    Q_PROPERTY(QString targetPath READ targetPath WRITE setTargetPath NOTIFY targetPathChanged)\n\npublic:\n    AsemanQuickListModelCopyHint(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanQuickListModelCopyHint();\n\n    void setPath(const QString &path);\n    QString path() const;\n\n    void setTargetPath(const QString &targetPath);\n    QString targetPath() const;\n\nQ_SIGNALS:\n    void pathChanged();\n    void changeRequest();\n    void targetPathChanged();\n\nprotected:\n    virtual QVariantMap analyze(const QVariantMap &map);\n\nprivate:\n    Private *p;\n};\n\n#endif // ASEMANQUICKLISTMODELCOPYHINT_H\n"
  },
  {
    "path": "src/asemanqml/models/asemanquicklistmodeldeletehint.cpp",
    "content": "#include \"asemanquicklistmodeldeletehint.h\"\n\n#include <QtQml>\n\nclass AsemanQuickListModelDeleteHint::Private\n{\npublic:\n    QString path;\n};\n\nAsemanQuickListModelDeleteHint::AsemanQuickListModelDeleteHint(QObject *parent) :\n    AsemanAbstractQuickListModelHint(parent)\n{\n    p = new Private;\n}\n\nvoid AsemanQuickListModelDeleteHint::setPath(const QString &path)\n{\n    if (p->path == path)\n        return;\n\n    p->path = path;\n    Q_EMIT pathChanged();\n    Q_EMIT changeRequest();\n}\n\nQString AsemanQuickListModelDeleteHint::path() const\n{\n    return p->path;\n}\n\nQVariantMap AsemanQuickListModelDeleteHint::analyze(const QVariantMap &map)\n{\n    if (p->path.isEmpty())\n    {\n        qmlWarning(this) << \"ModelDeleteHint.path is empty\";\n        return map;\n    }\n\n    return AsemanAbstractQuickListModelHint::deletePath(map, p->path).toMap();\n}\n\nAsemanQuickListModelDeleteHint::~AsemanQuickListModelDeleteHint()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/asemanqml/models/asemanquicklistmodeldeletehint.h",
    "content": "#ifndef ASEMANQUICKLISTMODELDELETEHINT_H\n#define ASEMANQUICKLISTMODELDELETEHINT_H\n\n#include <QObject>\n#include <QJSValue>\n\n#include \"asemanabstractquicklistmodelhint.h\"\n\nclass AsemanQuickListModelDeleteHint : public AsemanAbstractQuickListModelHint\n{\n    Q_OBJECT\n    class Private;\n    friend class AsemanQuickListModelSource;\n\n    Q_PROPERTY(QString path READ path WRITE setPath NOTIFY pathChanged)\n\npublic:\n    AsemanQuickListModelDeleteHint(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanQuickListModelDeleteHint();\n\n    void setPath(const QString &path);\n    QString path() const;\n\nQ_SIGNALS:\n    void pathChanged();\n    void changeRequest();\n\nprotected:\n    virtual QVariantMap analyze(const QVariantMap &map);\n\nprivate:\n    Private *p;\n};\n\n#endif // ASEMANQUICKLISTMODELDELETEHINT_H\n"
  },
  {
    "path": "src/asemanqml/models/asemanquicklistmodelformathint.cpp",
    "content": "#include \"asemanquicklistmodelformathint.h\"\n\n#include <QtQml>\n\nclass AsemanQuickListModelFormatHint::Private\n{\npublic:\n    QString path;\n    QJSValue method;\n};\n\nAsemanQuickListModelFormatHint::AsemanQuickListModelFormatHint(QObject *parent) :\n    AsemanAbstractQuickListModelHint(parent)\n{\n    p = new Private;\n}\n\nvoid AsemanQuickListModelFormatHint::setPath(const QString &path)\n{\n    if (p->path == path)\n        return;\n\n    p->path = path;\n    Q_EMIT pathChanged();\n    Q_EMIT changeRequest();\n}\n\nQString AsemanQuickListModelFormatHint::path() const\n{\n    return p->path;\n}\n\nvoid AsemanQuickListModelFormatHint::setMethod(const QJSValue &method)\n{\n    p->method = method;\n    Q_EMIT methodChanged();\n    Q_EMIT changeRequest();\n}\n\nQJSValue AsemanQuickListModelFormatHint::method() const\n{\n    return p->method;\n}\n\nQVariantMap AsemanQuickListModelFormatHint::analyze(const QVariantMap &map)\n{\n    if (p->path.isEmpty())\n    {\n        qmlWarning(this) << \"ModelFormatHint.path is empty\";\n        return map;\n    }\n    if (!p->method.isCallable())\n    {\n        qmlWarning(this) << \"ModelFormatHint.method is empty\";\n        return map;\n    }\n\n    QQmlEngine *engine = qmlEngine(this);\n    if (!engine)\n        return map;\n\n    QVariant data = AsemanAbstractQuickListModelHint::getPathValue(map, p->path);\n\n    QJSValueList args = { engine->toScriptValue(data) };\n    QJSValue result = p->method.call(args);\n\n    return AsemanAbstractQuickListModelHint::setPathValue(map, p->path, result.toVariant()).toMap();\n}\n\nAsemanQuickListModelFormatHint::~AsemanQuickListModelFormatHint()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/asemanqml/models/asemanquicklistmodelformathint.h",
    "content": "#ifndef ASEMANQUICKLISTMODELFORMATHINT_H\n#define ASEMANQUICKLISTMODELFORMATHINT_H\n\n#include <QObject>\n#include <QJSValue>\n\n#include \"asemanabstractquicklistmodelhint.h\"\n\nclass AsemanQuickListModelFormatHint : public AsemanAbstractQuickListModelHint\n{\n    Q_OBJECT\n    class Private;\n    friend class AsemanQuickListModelSource;\n\n    Q_PROPERTY(QString path READ path WRITE setPath NOTIFY pathChanged)\n    Q_PROPERTY(QJSValue method READ method WRITE setMethod NOTIFY methodChanged)\n\npublic:\n    AsemanQuickListModelFormatHint(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanQuickListModelFormatHint();\n\n    void setPath(const QString &path);\n    QString path() const;\n\n    void setMethod(const QJSValue &method);\n    QJSValue method() const;\n\nQ_SIGNALS:\n    void pathChanged();\n    void methodChanged();\n    void changeRequest();\n\nprotected:\n    virtual QVariantMap analyze(const QVariantMap &map);\n\nprivate:\n    Private *p;\n};\n\n#endif // ASEMANQUICKLISTMODELFORMATHINT_H\n"
  },
  {
    "path": "src/asemanqml/models/asemanquicklistmodelsource.cpp",
    "content": "#include \"asemanquicklistmodelsource.h\"\n\n#include <QPointer>\n#include <QDebug>\n\nclass AsemanQuickListModelSource::Private\n{\npublic:\n    QVariant source;\n    QString path;\n\n    QVariantList data;\n    QPointer<QObject> networkRequest;\n    QList<AsemanAbstractQuickListModelHint*> hints;\n};\n\nAsemanQuickListModelSource::AsemanQuickListModelSource(QObject *parent) :\n    QObject(parent)\n{\n    p = new Private;\n}\n\nvoid AsemanQuickListModelSource::setSource(const QVariant &source)\n{\n    if (p->source == source)\n        return;\n\n    p->source = source;\n    refresh();\n    Q_EMIT sourceChanged();\n}\n\nQVariant AsemanQuickListModelSource::source() const\n{\n    return p->source;\n}\n\nvoid AsemanQuickListModelSource::setPath(const QString &path)\n{\n    if (p->path == path)\n        return;\n\n    p->path = path;\n    refresh();\n    Q_EMIT pathChanged();\n}\n\nQString AsemanQuickListModelSource::path() const\n{\n    return p->path;\n}\n\nQVariantList AsemanQuickListModelSource::data() const\n{\n    return p->data;\n}\n\nQQmlListProperty<AsemanAbstractQuickListModelHint> AsemanQuickListModelSource::hints()\n{\n    return QQmlListProperty<AsemanAbstractQuickListModelHint>(this, &p->hints,\n                                                            QQmlListProperty<AsemanAbstractQuickListModelHint>::AppendFunction(append),\n                                                            QQmlListProperty<AsemanAbstractQuickListModelHint>::CountFunction(count),\n                                                            QQmlListProperty<AsemanAbstractQuickListModelHint>::AtFunction(at),\n                                                            QQmlListProperty<AsemanAbstractQuickListModelHint>::ClearFunction(clear) );\n}\n\nvoid AsemanQuickListModelSource::refresh()\n{\n    QVariant data = AsemanAbstractQuickListModelHint::getPathValue(p->source, p->path);\n\n    QVariantList vlist;\n    switch (static_cast<int>(data.type()))\n    {\n    case QVariant::StringList:\n    {\n        QStringList list = data.toStringList();\n        for (const QString &l: list)\n            vlist << QVariantMap( {{\"value\", l}} );\n    }\n        break;\n    case QVariant::Map:\n    {\n        QVariantMap map = data.toMap();\n        QMapIterator<QString, QVariant> i(map);\n        while (i.hasNext())\n        {\n            i.next();\n           vlist << QVariantMap( {{\"key\", i.key()}, {\"value\", i.value()}} );\n        }\n    }\n        break;\n    case QVariant::Hash:\n    {\n        QVariantHash hash = data.toHash();\n        QHashIterator<QString, QVariant> i(hash);\n        while (i.hasNext())\n        {\n            i.next();\n            vlist << QVariantMap( {{\"key\", i.key()}, {\"value\", i.value()}} );\n        }\n    }\n        break;\n    case QVariant::List:\n    default:\n        vlist = data.toList();\n        break;\n    }\n\n    p->data.clear();\n    for (const QVariant &l: vlist)\n    {\n        QVariantMap m = l.toMap();\n        for (AsemanAbstractQuickListModelHint *h: p->hints)\n            m = h->analyze(m);\n\n        p->data << m;\n    }\n\n    Q_EMIT dataChanged();\n}\n\nvoid AsemanQuickListModelSource::append(QQmlListProperty<AsemanAbstractQuickListModelHint> *p, AsemanAbstractQuickListModelHint *v)\n{\n    AsemanQuickListModelSource *aobj = static_cast<AsemanQuickListModelSource*>(p->object);\n    aobj->p->hints.append(v);\n    Q_EMIT aobj->hintsChanged();\n}\n\nint AsemanQuickListModelSource::count(QQmlListProperty<AsemanAbstractQuickListModelHint> *p)\n{\n    AsemanQuickListModelSource *aobj = static_cast<AsemanQuickListModelSource*>(p->object);\n    return aobj->p->hints.count();\n}\n\nAsemanAbstractQuickListModelHint *AsemanQuickListModelSource::at(QQmlListProperty<AsemanAbstractQuickListModelHint> *p, int idx)\n{\n    AsemanQuickListModelSource *aobj = static_cast<AsemanQuickListModelSource*>(p->object);\n    return aobj->p->hints.at(idx);\n}\n\nvoid AsemanQuickListModelSource::clear(QQmlListProperty<AsemanAbstractQuickListModelHint> *p)\n{\n    AsemanQuickListModelSource *aobj = static_cast<AsemanQuickListModelSource*>(p->object);\n    aobj->p->hints.clear();\n    Q_EMIT aobj->hintsChanged();\n}\n\nAsemanQuickListModelSource::~AsemanQuickListModelSource()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/asemanqml/models/asemanquicklistmodelsource.h",
    "content": "#ifndef ASEMANQUICKLISTMODELSOURCE_H\n#define ASEMANQUICKLISTMODELSOURCE_H\n\n#include <QObject>\n#include <QQmlListProperty>\n#include <QVariant>\n\n#include \"asemanquicklistmodelcopyhint.h\"\n\nclass AsemanQuickListModelSource : public QObject\n{\n    Q_OBJECT\n    class Private;\n\n    Q_PROPERTY(QVariant source READ source WRITE setSource NOTIFY sourceChanged)\n    Q_PROPERTY(QString path READ path WRITE setPath NOTIFY pathChanged)\n    Q_PROPERTY(QVariantList data READ data NOTIFY dataChanged)\n\n    Q_PROPERTY(QQmlListProperty<AsemanAbstractQuickListModelHint> hints READ hints NOTIFY hintsChanged)\n    Q_CLASSINFO(\"DefaultProperty\", \"hints\")\n\npublic:\n    AsemanQuickListModelSource(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanQuickListModelSource();\n\n    void setSource(const QVariant &source);\n    QVariant source() const;\n\n    void setPath(const QString &path);\n    QString path() const;\n\n    QVariantList data() const;\n\n    QQmlListProperty<AsemanAbstractQuickListModelHint> hints();\n\nQ_SIGNALS:\n    void hintsChanged();\n    void sourceChanged();\n    void pathChanged();\n    void dataChanged();\n\npublic Q_SLOTS:\n    void refresh();\n\nprivate:\n    static void append(QQmlListProperty<AsemanAbstractQuickListModelHint> *p, AsemanAbstractQuickListModelHint *v);\n    static int count(QQmlListProperty<AsemanAbstractQuickListModelHint> *p);\n    static AsemanAbstractQuickListModelHint *at(QQmlListProperty<AsemanAbstractQuickListModelHint> *p, int idx);\n    static void clear(QQmlListProperty<AsemanAbstractQuickListModelHint> *p);\n\nprivate:\n    Private *p;\n};\n\n#endif // ASEMANQUICKLISTMODELSOURCE_H\n"
  },
  {
    "path": "src/asemanqml/models/models.pri",
    "content": "INCLUDEPATH += $$PWD\nQT += core gui network quick\n\n#greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat\n\nHEADERS += \\\n    $$PWD/asemanmodelsplugin.h \\\n    $$PWD/asemanqttoolsitemmodels.h  \\\n    $$PWD/asemanquicklistmodel.h \\\n    $$PWD/asemanquicklistmodelsource.h \\\n    $$PWD/asemanabstractquicklistmodelhint.h \\\n    $$PWD/asemanquicklistmodelcamelcasehint.h \\\n    $$PWD/asemanquicklistmodelcopyhint.h \\\n    $$PWD/asemanquicklistmodeldeletehint.h \\\n    $$PWD/asemanquicklistmodelformathint.h\n\nSOURCES += \\\n    $$PWD/asemanmodelsplugin.cpp \\\n    $$PWD/asemanqttoolsitemmodels.cpp  \\\n    $$PWD/asemanquicklistmodel.cpp \\\n    $$PWD/asemanquicklistmodelsource.cpp \\\n    $$PWD/asemanabstractquicklistmodelhint.cpp \\\n    $$PWD/asemanquicklistmodelcamelcasehint.cpp \\\n    $$PWD/asemanquicklistmodelcopyhint.cpp \\\n    $$PWD/asemanquicklistmodeldeletehint.cpp \\\n    $$PWD/asemanquicklistmodelformathint.cpp\n\nstatic: !linux: !win32: DEFINES += ASEMAN_STATIC_BUILD\n\n\n"
  },
  {
    "path": "src/asemanqml/models/models.pro",
    "content": "TARGET  = asemanqmlmodels\nTARGETPATH = AsemanQml/Models\nIMPORT_VERSION = 2.0\n\nQT += asemanqml asemangui asemancore\ninclude(models.pri)\n\nload(qml_plugin)\n"
  },
  {
    "path": "src/asemanqml/models/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Models 2.0'\n\nModule {\n    dependencies: [\n        \"AsemanQml.Base 2.0\",\n        \"QtGraphicalEffects 1.12\",\n        \"QtQml 2.1\",\n        \"QtQml.Models 2.2\",\n        \"QtQuick 2.9\",\n        \"QtQuick.Controls 2.5\",\n        \"QtQuick.Controls.Fusion 2.12\",\n        \"QtQuick.Controls.Fusion.impl 2.12\",\n        \"QtQuick.Controls.IOSStyle 2.12\",\n        \"QtQuick.Controls.IOSStyle.impl 2.12\",\n        \"QtQuick.Controls.Imagine 2.12\",\n        \"QtQuick.Controls.Imagine.impl 2.12\",\n        \"QtQuick.Controls.Material 2.12\",\n        \"QtQuick.Controls.Material.impl 2.12\",\n        \"QtQuick.Controls.Styles 1.4\",\n        \"QtQuick.Controls.Styles.Plasma 2.0\",\n        \"QtQuick.Controls.Universal 2.12\",\n        \"QtQuick.Controls.Universal.impl 2.12\",\n        \"QtQuick.Controls.impl 2.12\",\n        \"QtQuick.Extras 1.4\",\n        \"QtQuick.Layouts 1.4\",\n        \"QtQuick.Templates 2.5\",\n        \"QtQuick.Window 2.2\",\n        \"org.kde.kconfig 1.0\",\n        \"org.kde.kirigami 2.9\",\n        \"org.kde.kquickcontrolsaddons 2.0\",\n        \"org.kde.plasma.components 2.0\",\n        \"org.kde.plasma.core 2.0\",\n        \"org.kde.plasma.extras 2.0\"\n    ]\n    Component {\n        name: \"AsemanAbstractListModel\"\n        prototype: \"QAbstractListModel\"\n        Method {\n            name: \"get\"\n            type: \"QVariant\"\n            Parameter { name: \"index\"; type: \"int\" }\n            Parameter { name: \"role\"; type: \"int\" }\n        }\n        Method {\n            name: \"get\"\n            type: \"QVariant\"\n            Parameter { name: \"index\"; type: \"int\" }\n            Parameter { name: \"roleName\"; type: \"string\" }\n        }\n        Method {\n            name: \"get\"\n            type: \"QVariantMap\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n        Method { name: \"roles\"; type: \"QStringList\" }\n    }\n    Component {\n        name: \"AsemanAbstractQuickListModelHint\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Models/AsemanAbstractQuickListModelHint 2.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n    }\n    Component {\n        name: \"AsemanCalendarModel\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Models/CalendarModel 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"CalendarTypes\"\n            values: {\n                \"CalendarGregorian\": 0,\n                \"CalendarJalali\": 1,\n                \"CalendarHijri\": 2\n            }\n        }\n        Property { name: \"years\"; type: \"QList<int>\"; isReadonly: true }\n        Property { name: \"months\"; type: \"QList<int>\"; isReadonly: true }\n        Property { name: \"days\"; type: \"QList<int>\"; isReadonly: true }\n        Property { name: \"hours\"; type: \"QList<int>\"; isReadonly: true }\n        Property { name: \"minutes\"; type: \"QList<int>\"; isReadonly: true }\n        Property { name: \"currentYearIndex\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentMonthIndex\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentDaysIndex\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentHoursIndex\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentMinutesIndex\"; type: \"int\"; isReadonly: true }\n        Property { name: \"dateTime\"; type: \"QDateTime\" }\n        Property { name: \"calendar\"; type: \"int\" }\n        Property { name: \"minimum\"; type: \"QDateTime\" }\n        Property { name: \"maximum\"; type: \"QDateTime\" }\n        Signal { name: \"secondsChanged\" }\n        Method {\n            name: \"setConvertDate\"\n            Parameter { name: \"yearIdx\"; type: \"int\" }\n            Parameter { name: \"monthIdx\"; type: \"int\" }\n            Parameter { name: \"dayIdx\"; type: \"int\" }\n            Parameter { name: \"hourIdx\"; type: \"int\" }\n            Parameter { name: \"minuteIdx\"; type: \"int\" }\n        }\n        Method {\n            name: \"monthName\"\n            type: \"string\"\n            Parameter { name: \"month\"; type: \"int\" }\n        }\n    }\n    Component {\n        name: \"AsemanCountriesModel\"\n        prototype: \"AsemanAbstractListModel\"\n        exports: [\"AsemanQml.Models/CountriesModel 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"ColorfullListModelRoles\"\n            values: {\n                \"NameRole\": 256,\n                \"NativeNameRole\": 257,\n                \"TldRole\": 258,\n                \"Cca2Role\": 259,\n                \"Ccn3Role\": 260,\n                \"Cca3Role\": 261,\n                \"CurrencyRole\": 262,\n                \"CallingCodeRole\": 263,\n                \"CapitalRole\": 264,\n                \"AltSpellingsRole\": 265,\n                \"RelevanceRole\": 266,\n                \"RegionRole\": 267,\n                \"SubregionRole\": 268,\n                \"LanguageRole\": 269,\n                \"LanguageCodesRole\": 270,\n                \"TranslationsRole\": 271,\n                \"LatlngRole\": 272,\n                \"DemonymRole\": 273,\n                \"BordersRole\": 274,\n                \"AreaRole\": 275,\n                \"KeyRole\": 276\n            }\n        }\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"filter\"; type: \"string\" }\n        Property { name: \"systemCountry\"; type: \"string\"; isReadonly: true }\n        Method {\n            name: \"indexOf\"\n            type: \"int\"\n            Parameter { name: \"name\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanFileSystemModel\"\n        prototype: \"AsemanAbstractListModel\"\n        exports: [\"AsemanQml.Models/FileSystemModel 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"SortFlag\"\n            values: {\n                \"Name\": 0,\n                \"Size\": 1,\n                \"Date\": 2\n            }\n        }\n        Enum {\n            name: \"DataRole\"\n            values: {\n                \"FilePath\": 256,\n                \"FileUrl\": 257,\n                \"FileName\": 258,\n                \"FileMime\": 259,\n                \"FileSize\": 260,\n                \"FileSuffix\": 261,\n                \"FileBaseName\": 262,\n                \"FileIsDir\": 263,\n                \"FileModifiedDate\": 264,\n                \"FileCreatedDate\": 265\n            }\n        }\n        Property { name: \"showDirs\"; type: \"bool\" }\n        Property { name: \"showDotAndDotDot\"; type: \"bool\" }\n        Property { name: \"showDirsFirst\"; type: \"bool\" }\n        Property { name: \"showFiles\"; type: \"bool\" }\n        Property { name: \"showHidden\"; type: \"bool\" }\n        Property { name: \"recursive\"; type: \"bool\" }\n        Property { name: \"nameFilters\"; type: \"QStringList\" }\n        Property { name: \"folder\"; type: \"string\" }\n        Property { name: \"limit\"; type: \"int\" }\n        Property { name: \"parentFolder\"; type: \"string\"; isReadonly: true }\n        Property { name: \"sortField\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Signal { name: \"listChanged\" }\n        Method { name: \"refresh\" }\n    }\n    Component {\n        name: \"AsemanListModel\"\n        prototype: \"AsemanAbstractListModel\"\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"cachePath\"; type: \"string\" }\n        Property { name: \"data\"; type: \"QVariantList\" }\n        Signal { name: \"listChanged\" }\n        Signal { name: \"dataListChanged\" }\n        Method {\n            name: \"insert\"\n            Parameter { name: \"row\"; type: \"int\" }\n            Parameter { name: \"map\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"append\"\n            Parameter { name: \"map\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"remove\"\n            Parameter { name: \"row\"; type: \"int\" }\n        }\n        Method {\n            name: \"move\"\n            Parameter { name: \"from\"; type: \"int\" }\n            Parameter { name: \"to\"; type: \"int\" }\n        }\n        Method { name: \"clear\" }\n        Method {\n            name: \"change\"\n            Parameter { name: \"list\"; type: \"QVariantList\" }\n        }\n    }\n    Component {\n        name: \"AsemanMixedListModel\"\n        prototype: \"AsemanAbstractListModel\"\n        exports: [\"AsemanQml.Models/MixedListModel 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"models\"; type: \"QVariantList\" }\n    }\n    Component {\n        name: \"AsemanQuickListModel\"\n        defaultProperty: \"items\"\n        prototype: \"AsemanListModel\"\n        exports: [\"AsemanQml.Models/AsemanListModel 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"sortField\"; type: \"string\" }\n        Property { name: \"sortDescending\"; type: \"bool\" }\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Method { name: \"reload\" }\n    }\n    Component {\n        name: \"AsemanQuickListModelCamelCaseHint\"\n        prototype: \"AsemanAbstractQuickListModelHint\"\n        exports: [\"AsemanQml.Models/ModelCamelCaseHint 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"path\"; type: \"string\" }\n        Signal { name: \"changeRequest\" }\n    }\n    Component {\n        name: \"AsemanQuickListModelCopyHint\"\n        prototype: \"AsemanAbstractQuickListModelHint\"\n        exports: [\"AsemanQml.Models/ModelCopyHint 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"path\"; type: \"string\" }\n        Property { name: \"targetPath\"; type: \"string\" }\n        Signal { name: \"changeRequest\" }\n    }\n    Component {\n        name: \"AsemanQuickListModelDeleteHint\"\n        prototype: \"AsemanAbstractQuickListModelHint\"\n        exports: [\"AsemanQml.Models/ModelDeleteHint 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"path\"; type: \"string\" }\n        Signal { name: \"changeRequest\" }\n    }\n    Component {\n        name: \"AsemanQuickListModelFormatHint\"\n        prototype: \"AsemanAbstractQuickListModelHint\"\n        exports: [\"AsemanQml.Models/ModelFormatHint 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"path\"; type: \"string\" }\n        Property { name: \"method\"; type: \"QJSValue\" }\n        Signal { name: \"changeRequest\" }\n    }\n    Component {\n        name: \"AsemanQuickListModelSource\"\n        defaultProperty: \"hints\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Models/AsemanListModelSource 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"source\"; type: \"QVariant\" }\n        Property { name: \"path\"; type: \"string\" }\n        Property { name: \"data\"; type: \"QVariantList\"; isReadonly: true }\n        Property {\n            name: \"hints\"\n            type: \"AsemanAbstractQuickListModelHint\"\n            isList: true\n            isReadonly: true\n        }\n        Method { name: \"refresh\" }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/models/qmldir",
    "content": "module AsemanQml.Models\nclassname AsemanModelsPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlmodels\ndepends AsemanQml.Base 2.0\n"
  },
  {
    "path": "src/asemanqml/modern/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/modernplugin.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemmodern.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/modernplugin.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemmodern.cpp\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/qmake_asemanmodern.qrc\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/asemanqml/modern/Modern/FancyNavigationBar.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nItem {\n    id: navigBar\n    data: [back, bar]\n\n    property alias color: back.color\n    default property alias contents: back.data\n\n    property int currentIndex\n    readonly property int count: repeater.model.length\n\n    property alias barHeight: bar.height\n    readonly property FancyPage currentPage: back.currentIndex>=0 && back.currentIndex<repeater.model.length? repeater.model[back.currentIndex] : null\n\n    onCurrentIndexChanged: {\n        back.lastCurrentIndex = back.currentIndex\n        back.currentIndex = currentIndex\n    }\n\n    Rectangle {\n        id: back\n        anchors.fill: parent\n\n        property int currentIndex\n        property int lastCurrentIndex\n        property int animDuration\n\n        Timer {\n            interval: 50\n            running: true\n            repeat: false\n            onTriggered: back.animDuration = 300\n        }\n    }\n\n    Item {\n        id: bar\n        width: navigBar.width\n        height: 50 * Devices.density\n        anchors.bottom: navigBar.bottom\n\n        property real normalWidth: back.currentIndex>=0? bar.height*1.2 : bar.width / navigBar.count\n        property real selectedWidth: bar.width - normalWidth*(navigBar.count-1)\n\n        Rectangle {\n            id: highlighter\n            width: bar.normalWidth * 2\n            height: 4 * Devices.density\n            anchors.bottom: parent.bottom\n            color: currentPage? currentPage.textColor : \"#333\"\n            x: back.currentIndex * bar.normalWidth + (bar.selectedWidth - width)/2\n\n            Behavior on x {\n                NumberAnimation { easing.type: Easing.OutBack; duration: back.animDuration }\n            }\n            Behavior on color {\n                ColorAnimation { easing.type: Easing.OutCubic; duration: back.animDuration }\n            }\n        }\n\n        Repeater {\n            id: repeater\n            model: back.children\n            Item {\n                id: btn\n                x: {\n                    var res = bar.normalWidth * index\n                    if(back.currentIndex >= 0 && index > back.currentIndex)\n                        res = res - bar.normalWidth + bar.selectedWidth\n                    return res\n                }\n                width: selected? bar.selectedWidth : bar.normalWidth\n                height: bar.height\n\n                property FancyPage page: repeater.model[index]\n                readonly property bool selected: index == back.currentIndex\n                onSelectedChanged: {\n                    if(selected) {\n                        if(back.lastCurrentIndex < index)\n                            page.openFromRight()\n                        else\n                            page.openFromLeft()\n                    } else {\n                        if(back.currentIndex < index)\n                            page.closeToRight()\n                        else\n                            page.closeToLeft()\n                    }\n                }\n\n                Behavior on x {\n                    NumberAnimation { easing.type: Easing.OutBack; duration: back.animDuration }\n                }\n                Behavior on width {\n                    NumberAnimation { easing.type: Easing.OutBack; duration: back.animDuration }\n                }\n\n\n                Text {\n                    anchors.centerIn: parent\n                    font: btn.page.font\n                    color: currentPage.textColor\n                    text: btn.page.title\n                    scale: btn.selected? 1.0 : 0.6\n\n                    Behavior on scale {\n                        NumberAnimation { easing.type: Easing.OutBack; duration: back.animDuration }\n                    }\n                }\n\n                MouseArea {\n                    anchors.fill: parent\n                    onClicked: navigBar.currentIndex = index\n                }\n\n                Timer {\n                    interval: 50\n                    running: true\n                    repeat: false\n                    onTriggered: page.init(btn.selected)\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/modern/Modern/FancyPage.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nItem {\n    id: base\n    anchors.fill: parent\n    data: [scene]\n\n    default property alias contents: back.data\n\n    property Item delegateItem\n    property Component delegate\n\n    onDelegateChanged: if(delegateItem) delegateItem.destroy()\n\n    property string title\n    property alias color: back.color\n\n    property font font\n    property color textColor: \"#333\"\n\n    function init(opened) {\n        if(scene.inited)\n            return\n\n        scene.opened = opened\n        scene.inited = true\n    }\n\n    Item {\n        id: scene\n        width: opened? parent.width : 0\n        height: parent.height\n        clip: true\n        visible: width > 0\n\n        property bool opened: false\n        property bool inited: false\n\n        onOpenedChanged: initDelegate()\n        onInitedChanged: initDelegate()\n\n        function initDelegate() {\n            if(!delegate)\n                return\n            if(delegateItem)\n                return\n            if(!opened)\n                return\n\n            delegateItem = delegate.createObject(back)\n        }\n\n        Behavior on width {\n            NumberAnimation { easing.type: Easing.OutBack; duration: scene.inited? 300 : 0 }\n        }\n\n        Rectangle {\n            id: back\n            width: base.width\n            height: base.height\n        }\n    }\n\n    function openFromLeft() {\n        scene.anchors.right = undefined\n        scene.anchors.left = base.left\n        back.anchors.right = undefined\n        back.anchors.left = scene.left\n        scene.opened = true\n    }\n\n    function openFromRight() {\n        scene.anchors.right = base.right\n        scene.anchors.left = undefined\n        back.anchors.right = scene.right\n        back.anchors.left = undefined\n        scene.opened = true\n    }\n\n    function closeToLeft() {\n        scene.anchors.right = undefined\n        scene.anchors.left = base.left\n        back.anchors.right = undefined\n        back.anchors.left = scene.left\n        scene.opened = false\n    }\n\n    function closeToRight() {\n        scene.anchors.right = base.right\n        scene.anchors.left = undefined\n        back.anchors.right = scene.right\n        back.anchors.left = undefined\n        scene.opened = false\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/modern/Modern/FancySearchBar.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Awesome 2.0\nimport AsemanQml.GraphicalEffects 2.0\n\nItem {\n    id: item\n\n    property alias toolbarHeight: toolbar.height\n    property alias toolbarTopMargin: toolbar.y\n    property alias searchBarButton: searchIcon\n    property alias clearButton: clearIcon\n\n    property alias panelColor: panelRect.color\n    property alias searchBarColor: searchbarArea.color\n    property alias background: _background.color\n\n    property Item mainList\n\n    property alias opened: openedAction.active\n\n    readonly property real ratio: searchbar.ratio\n    property alias textInput: text_input\n    property alias placeholder: searchPlaceholder.text\n\n    property string keyword\n\n    BackAction { id: openedAction }\n\n    onMainListChanged: {\n        if(!mainList)\n            return\n\n        mainList.parent = scene\n    }\n\n    onRatioChanged: {\n        if(ratio == 1)\n            focusTimer.restart()\n        else\n        if(ratio == 0)\n            text_input.focus = false\n    }\n\n    Item {\n        id: privateScene\n        anchors.fill: parent\n\n        Timer {\n            id: focusTimer\n            interval: 200\n            repeat: false\n            onTriggered: text_input.forceActiveFocus()\n        }\n\n        Rectangle {\n            id: _background\n            anchors.fill: parent\n            color: \"#99000000\"\n            opacity: searchbar.ratio\n        }\n\n        MouseArea {\n            anchors.fill: parent\n            visible: opened\n            onClicked: opened = false\n        }\n\n        Item {\n            id: scene\n            anchors.topMargin: searchbar.height\n            anchors.fill: parent\n        }\n\n        FastRectengleShadow {\n            anchors.fill: searchbar\n            radius: 48\n            opacity: searchbar.ratio\n            visible: opacity > 0\n        }\n\n        Item {\n            id: searchbar\n            width: parent.width\n            height: toolbarTopMargin + Devices.standardTitleBarHeight\n            clip: true\n            y: -height * (1-ratio)\n\n            property real ratio: opened? 1 : 0\n\n            Behavior on ratio {\n                NumberAnimation { easing.type: Easing.OutCubic; duration: 300 }\n            }\n\n            MouseArea {\n                anchors.fill: parent\n            }\n\n            Rectangle {\n                id: panelRect\n                anchors.fill: parent\n                opacity: 1\n            }\n\n            Item {\n                id: searchbarScene\n                anchors.fill: parent\n                transform: Scale {\n                    xScale: 0.5 + item.ratio*0.5\n                    origin.x: searchbarScene.width/2\n                }\n\n                opacity: item.ratio\n\n                Rectangle {\n                    id: searchbarArea\n                    anchors.fill: parent\n                    anchors.topMargin: anchors.margins + toolbarTopMargin\n                    anchors.margins: (Devices.isDesktop? 10 : 7) * Devices.density\n                    radius: 8 * Devices.density\n                    color: \"#000\"\n                    opacity: 0.2\n                }\n\n                TextInput {\n                    id: text_input\n                    anchors.fill: searchbarArea\n                    leftPadding: Devices.isIOS? 0 : height\n                    selectedTextColor: \"#fff\"\n                    selectionColor: \"#18f\"\n                    verticalAlignment: Text.AlignVCenter\n                    horizontalAlignment: Text.AlignLeft\n                    inputMethodHints: Qt.ImhNoPredictiveText\n                    font.family: AsemanApp.globalFont.family\n                    font.pixelSize: 10*Devices.fontDensity\n                    onTextChanged: searchTimer.restart()\n\n                    Text {\n                        id: searchPlaceholder\n                        anchors.fill: parent\n                        leftPadding: text_input.leftPadding\n                        rightPadding: text_input.rightPadding\n                        verticalAlignment: text_input.verticalAlignment\n                        horizontalAlignment: text_input.horizontalAlignment\n                        font: text_input.font\n                        color: text_input.color\n                        opacity: 0.6\n                        visible: text_input.length == 0\n                    }\n\n                    TextCursorArea { id: cursor; active: true; cursorParent: item}\n\n                    Timer {\n                        id: searchTimer\n                        interval: 500\n                        repeat: false\n                        onTriggered: item.keyword = text_input.text\n                    }\n                }\n            }\n        }\n\n        Item {\n            id: toolbar\n            y: Devices.statusBarHeight\n            width: parent.width\n            height: Devices.standardTitleBarHeight\n\n            Item {\n                width: height\n                height: {\n                    var s1 = parent.height\n                    var s2 = searchbar.height - toolbarTopMargin\n                    return item.ratio*s2 + (1-item.ratio)*s1\n                }\n                x: LayoutMirroring.enabled? 0 : parent.width - width\n\n                Rectangle {\n                    id: searchHighlight\n                    anchors.fill: parent\n                    anchors.margins: item.opened? 18 * Devices.density : 8 * Devices.density\n                    radius: item.opened? searchbarArea.radius : 4 * Devices.density\n                    opacity: searchMouseArea.pressed? 0.2 : 0\n                    color: searchIcon.color\n                }\n\n                MouseArea {\n                    id: searchMouseArea\n                    anchors.fill: parent\n                    onClicked: {\n                        if(item.opened) {\n                            if(text_input.length == 0)\n                                opened = false\n                            else\n                                text_input.clear()\n                        } else\n                            item.opened = true\n                    }\n                }\n\n                Text {\n                    id: searchIcon\n                    anchors.centerIn: parent\n                    scale: 1 - item.ratio\n                    font.family: Awesome.family\n                    font.pixelSize: 12*Devices.fontDensity\n                    text: Awesome.fa_search\n                    color: \"#666\"\n                }\n\n                Text {\n                    id: clearIcon\n                    anchors.centerIn: parent\n                    scale: item.ratio\n                    font.family: Awesome.family\n                    font.pixelSize: 12*Devices.fontDensity\n                    text: Awesome.fa_times\n                    color: \"#666\"\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/modern/Modern/FastDropShadow.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.GraphicalEffects 2.0\nimport AsemanQml.Base 2.0\n\nItem {\n    id: item\n\n    property alias radius: blur.radius\n    property alias color: shadowMask.color\n    property real horizontalOffset\n    property real verticalOffset\n    property bool cached: true\n    property alias source: shadowArea.maskSource\n\n    FastBlur {\n        id: blur\n        x: parent.width/2 - width/2 + item.horizontalOffset\n        y: parent.height/2 - height/2 + item.verticalOffset\n        width: shadowScene.width\n        height: shadowScene.height\n        source: shadowScene\n        cached: item.cached\n    }\n\n    Item {\n        id: shadowScene\n        anchors.fill: parent\n        anchors.margins: -item.radius*2\n        visible: false\n\n        Item {\n            width: item.width\n            height: item.height\n            anchors.centerIn: parent\n\n            OpacityMask {\n                id: shadowArea\n                anchors.fill: parent\n                source: shadowMask\n                cached: item.cached\n            }\n\n            Rectangle {\n                id: shadowMask\n                color: \"#333\"\n                anchors.fill: parent\n                visible: false\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/modern/Modern/FastRectengleShadow.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.GraphicalEffects 2.0\nimport AsemanQml.Base 2.0\n\nItem {\n    id: item\n\n    property alias radius: blur.radius\n    property alias color: shadowMask.color\n    property alias roundRadius: shadowMask.radius\n    property real horizontalOffset\n    property real verticalOffset\n    property bool cached: true\n\n    FastBlur {\n        id: blur\n        x: parent.width/2 - width/2 + item.horizontalOffset\n        y: parent.height/2 - height/2 + item.verticalOffset\n        width: shadowScene.width\n        height: shadowScene.height\n        source: shadowScene\n        cached: item.cached\n    }\n\n    Item {\n        id: shadowScene\n        anchors.fill: parent\n        anchors.margins: -item.radius*2\n        visible: false\n\n        Rectangle {\n            id: shadowMask\n            width: item.width\n            height: item.height\n            anchors.centerIn: parent\n            color: \"#333\"\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/modern/Modern/LazyList.qml",
    "content": "import QtQuick 2.9\nimport AsemanQml.Base 2.0\n\nItem {\n    default property alias contentItem: prv.list\n\n    onContentItemChanged: {\n        if(!contentItem)\n            return\n\n        data = [contentItem, marea]\n        var list = contentItem\n\n        if(list.displayMarginBeginning == 0) list.displayMarginBeginning = 500 * Devices.density\n        if(list.displayMarginEnd == 0) list.displayMarginEnd = 500 * Devices.density\n        if(list.delegate) {\n            prv.lazyDelegate = list.delegate\n            list.delegate = delegate_component\n        } else {\n            list.delegate = delegate_component\n        }\n    }\n\n    QtObject {\n        id: prv\n\n        property ListView list\n        property int mouseIndex\n\n        property real maxVelocity\n        property real velocity: {\n            if(!list)\n                return 0\n            switch(list.orientation) {\n            case ListView.Horizontal:\n                return list.horizontalVelocity\n            default:\n            case ListView.Vertical:\n                return list.verticalVelocity\n            }\n        }\n\n        property real flicking: list? list.flicking : 0\n        property Component lazyDelegate\n\n        onVelocityChanged: {\n            if(velocity == 0)\n            {\n                prv.maxVelocity = 0\n                timer.stop()\n            }\n            else\n            if(!timer.running)\n                timer.start()\n        }\n    }\n\n    Timer {\n        id: timer\n        interval: 20\n        repeat: true\n        onTriggered: refresh()\n\n        property real maximum: 2000 * Devices.density\n\n        function refresh() {\n            var res = prv.velocity\n            if(res > maximum)\n                res = maximum\n            else\n            if(res < -maximum)\n                res = -maximum\n            if(prv.flicking)\n                res = 0\n            prv.maxVelocity = res\n        }\n    }\n\n    Component {\n        id: delegate_component\n        Item {\n            width: proxy.object? proxy.object.width : 1\n            height: proxy.object? proxy.object.height : 1\n            z: proxy.object? proxy.object.z : 0\n\n            property int index: model.index\n\n            Item {\n                width: parent.width\n                height: parent.height\n\n                y: {\n                    if(prv.list.orientation == ListView.Vertical)\n                        return value\n                    else\n                        return 0\n                }\n                x: {\n                    if(prv.list.orientation == ListView.Horizontal)\n                        return value\n                    else\n                        return 0\n                }\n\n                property real value: {\n                    if(prv.mouseIndex == -1)\n                        return 0\n                    var baseIdx = prv.mouseIndex - index\n                    var res = baseIdx * -Math.abs(prv.maxVelocity)/40\n                    return res\n                }\n\n                Behavior on value {\n                    NumberAnimation { easing.type: Easing.OutBack; duration: 300 }\n                }\n\n                ProxyComponent {\n                    id: proxy\n                    source: prv.lazyDelegate\n                }\n            }\n\n            MouseArea {\n                anchors.fill: parent\n                onPressed: {\n                    mouse.accepted = false\n                    prv.mouseIndex = index\n                }\n            }\n        }\n    }\n\n    MouseArea {\n        id: marea\n//        visible: contentItem.flicking\n        anchors.fill: contentItem? contentItem : undefined\n        onPressed: {\n            var y = mouseY + contentItem.contentY\n            var x = mouseX + contentItem.contentX\n            var item = contentItem.itemAt(x, y)\n            mouse.accepted = false\n            if(item)\n            {\n                prv.mouseIndex = item.index\n                timer.stop()\n                prv.maxVelocity = 0\n            }\n            else\n                prv.mouseIndex = -1\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/modern/Modern/qmldir",
    "content": "module AsemanQml.Modern\nFancyNavigationBar 2.0 FancyNavigationBar.qml\nFancyPage 2.0 FancyPage.qml\nFancySearchBar 2.0 FancySearchBar.qml\nFastDropShadow 2.0 FastDropShadow.qml\nFastRectengleShadow 2.0 FastRectengleShadow.qml\nLazyList 2.0 LazyList.qml\n"
  },
  {
    "path": "src/asemanqml/modern/asemanqttoolsitemmodern.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtToolsItemModern is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtToolsItemModern is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanqttoolsitemmodern.h\"\n\n#include <qqml.h>\n#include <QHash>\n#include <QPointer>\n#include <QFile>\n#include <QDir>\n#include <QSet>\n\nstatic QStringList aseman_qt_tools_indexCache;\nstatic QString aseman_qt_tools_destination;\n\nvoid AsemanQtToolsItemModern::registerTypes(const char *uri, bool exportMode)\n{\n    static QSet<QByteArray> register_list;\n    if(register_list.contains(uri) && !exportMode)\n        return;\n\n    register_list.insert(uri);\n}\n\nvoid AsemanQtToolsItemModern::registerFiles(const QString &filesLocation, const char *uri)\n{\n    QFile file(filesLocation + QStringLiteral(\"/qmldir\"));\n    if(file.open(QFile::ReadOnly))\n    {\n        QStringList lines = QString::fromUtf8(file.readAll()).split(QStringLiteral(\"\\n\"), Qt::SkipEmptyParts);\n        file.close();\n\n        for(const QString &l: lines)\n        {\n            QStringList parts = l.trimmed().split(QStringLiteral(\" \"), Qt::SkipEmptyParts);\n            bool singleton = false;\n            if(parts.count() && parts.first() == \"singleton\")\n                singleton = parts.takeFirst().count();\n            if(parts.length() != 3)\n                continue;\n\n            QStringList version = parts.at(1).split(QStringLiteral(\".\"), Qt::SkipEmptyParts);\n            if(version.count() != 2)\n                continue;\n\n            if(singleton)\n                qmlRegisterSingletonType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                         uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n            else\n                qmlRegisterType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n        }\n    }\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemModern::registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemModern::registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportModel<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemModern::registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterSingletonType<T>(uri, versionMajor, versionMinor, typeName, callback);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemModern::registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(qmlName));\n    else\n        return qmlRegisterUncreatableType<T>(uri, versionMajor, versionMinor, qmlName, reason);\n    return 0;\n}\n\n\nvoid AsemanQtToolsItemModern::exportDocuments(const QString &destination)\n{\n    aseman_qt_tools_destination = destination;\n\n    QDir().mkpath(aseman_qt_tools_destination);\n    aseman_qt_tools_indexCache.clear();\n\n    AsemanQtToolsItemModern::registerTypes(\"AsemanToolsItem\", true);\n\n    QString index = QStringLiteral(\"# AsemanToolsItem Documents\\n\\n\");\n    index += QStringLiteral(\"### [Getting Started](gettingstarted.md)\\n\\n\");\n    index += QStringLiteral(\"### How to import:\\n\\n\");\n    index += QStringLiteral(\"```c++\\nimport AsemanQml.Base 2.0\\n```\\n\\nor\\n\\n\"\n             \"```c++\\nimport AsemanQml.Base 2.0 as Aseman\\n```\\n\\n\");\n    index += QStringLiteral(\"### Types\\n\\nHere are all components of the AsemanToolsItem:\\n\\n\");\n    for(const QString cmpnt: aseman_qt_tools_indexCache)\n    {\n        if(cmpnt == QStringLiteral(\"MimeData\"))\n            index += QStringLiteral(\"\\n##### Normal types\\n\\n\");\n        if(cmpnt == QStringLiteral(\"MixedListModel\"))\n            index += QStringLiteral(\"\\n##### Models\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Devices\"))\n            index += QStringLiteral(\"\\n##### Singletons\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Screen\"))\n            index += QStringLiteral(\"\\n##### Uncreatable types\\n\\n\");\n        index += QStringLiteral(\" * [%1](%2.md)\\n\").arg(cmpnt).arg(cmpnt.toLower());\n    }\n\n    QString path = aseman_qt_tools_destination + \"/start.md\";\n    aseman_qt_tools_destination.clear();\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return;\n\n    file.write(index.toUtf8());\n    file.close();\n}\n\nQString AsemanQtToolsItemModern::fixType(const QString &type)\n{\n    if(type == QStringLiteral(\"QSizeF\") || type == QStringLiteral(\"QSize\"))\n        return QStringLiteral(\"size\");\n    if(type == QStringLiteral(\"QPoint\") || type == QStringLiteral(\"QPointF\"))\n        return QStringLiteral(\"point\");\n    if(type == QStringLiteral(\"QUrl\"))\n        return QStringLiteral(\"url\");\n    if(type == QStringLiteral(\"QString\"))\n        return QStringLiteral(\"string\");\n    if(type == QStringLiteral(\"QByteArray\"))\n        return QStringLiteral(\"byte\");\n    if(type == QStringLiteral(\"bool\"))\n        return QStringLiteral(\"boolean\");\n    if(type == QStringLiteral(\"double\") || type == QStringLiteral(\"qreal\"))\n        return QStringLiteral(\"real\");\n    if(type == QStringLiteral(\"QVariant\"))\n        return QStringLiteral(\"variant\");\n    if(type == QStringLiteral(\"QJSValue\"))\n        return QStringLiteral(\"function(){[code]}\");\n    if(type == QStringLiteral(\"QVariantMap\"))\n        return QStringLiteral(\"map\");\n    if(type == QStringLiteral(\"QVariantList\"))\n        return QStringLiteral(\"list&lt;variant&gt;\");\n    if(type == QStringLiteral(\"QStringList\"))\n        return QStringLiteral(\"list&lt;string&gt;\");\n    if(type == QStringLiteral(\"QList<qint32>\"))\n        return QStringLiteral(\"list&lt;int&gt;\");\n    if(type.contains(QStringLiteral(\"*\")))\n    {\n        if(type == QStringLiteral(\"QObject*\"))\n            return QStringLiteral(\"object\");\n        if(type.contains(QStringLiteral(\"Telegram\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Telegram\"));\n            return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n        }\n        if(type.contains(QStringLiteral(\"Object\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Object\"));\n            return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                    .arg(name).arg(name.toLower());\n        }\n        if(type == QStringLiteral(\"QQmlComponent*\"))\n            return QStringLiteral(\"Component\");\n        if(type == QStringLiteral(\"QQuickItem\"))\n            return QStringLiteral(\"Item\");\n    }\n    if(type.contains(QStringLiteral(\"Telegram\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Telegram\"));\n        return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n    }\n    if(type == QStringLiteral(\"QQuickItem\"))\n        return QStringLiteral(\"Item\");\n    if(type == QStringLiteral(\"QObject\"))\n        return QStringLiteral(\"object\");\n    if(type.contains(QStringLiteral(\"Object\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Object\"));\n        return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                .arg(name).arg(name.toLower());\n    }\n    return type;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemModern::exportItem(const QString &module, int major, int minor, const QString &component, bool store)\n{\n    QString result;\n    aseman_qt_tools_indexCache << component;\n\n    QMetaObject meta = T::staticMetaObject;\n    QString inherits = fixType(QString::fromUtf8(meta.superClass()? meta.superClass()->className() : \"\"));\n    bool isModel = component.toLower().contains(QStringLiteral(\"model\"));\n\n    result += QStringLiteral(\"# %1\\n\\n\").arg(component);\n\n    QString headers;\n    headers += QStringLiteral(\" * [Component details](#component-details)\\n\");\n\n    QString details = QStringLiteral(\"\\n### Component details:\\n\\n\");\n    details += QStringLiteral(\"|Detail|Value|\\n\"\n                       \"|------|-----|\\n\");\n    details += QStringLiteral(\"|%1|%2 %3.%4|\\n\").arg(QStringLiteral(\"Import\")).arg(module).arg(major).arg(minor);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Component\")).arg(component);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"C++ class\")).arg(QString::fromUtf8(meta.className()));\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Inherits\")).arg(inherits);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Model\")).arg(QString::fromUtf8(isModel?\"Yes\":\"No\"));\n\n    QString resultProperties;\n    QStringList propertiesSignals;\n    for(int i=0; i<meta.propertyCount(); i++)\n    {\n        QMetaProperty property = meta.property(i);\n        const QString &propertyName = QString::fromUtf8(property.name());\n        const QString &propertyType = fixType(QString::fromUtf8(property.typeName()));\n        propertiesSignals << QString::fromUtf8(property.notifySignal().name());\n\n        QString text = QStringLiteral(\"* <font color='#074885'><b>%1</b></font>: %2\").arg(propertyName).arg(propertyType);\n        if(!property.isWritable())\n            text += QStringLiteral(\" (readOnly)\");\n\n        text += QStringLiteral(\"\\n\");\n        if(meta.propertyOffset()<=i)\n            resultProperties += text;\n    }\n\n    QString enumResults;\n    for(int i=meta.enumeratorOffset(); i<meta.enumeratorCount(); i++)\n    {\n        QMetaEnum enumerator = meta.enumerator(i);\n        const QString &enumName = QString::fromUtf8(enumerator.name());\n\n        enumResults += QStringLiteral(\"\\n##### %1\\n\\n\").arg(enumName);\n        enumResults += QStringLiteral(\"|Key|Value|\\n\"\n                               \"|---|-----|\\n\");\n\n        for(int j=0; j<enumerator.keyCount(); j++)\n            enumResults += QStringLiteral(\"|%1|%2|\\n\").arg(QString::fromUtf8(enumerator.key(j))).arg(enumerator.value(j));\n    }\n\n    QString resultSlots;\n    QString resultSignals;\n    for(int i=meta.methodOffset(); i<meta.methodCount(); i++)\n    {\n        QMetaMethod method = meta.method(i);\n        if(method.access() != QMetaMethod::Public)\n            continue;\n\n        const QString &methodName = QString::fromUtf8(method.name());\n        if(propertiesSignals.contains(methodName))\n            continue;\n\n        const QString &methodType = fixType(QString::fromUtf8(method.typeName()));\n\n        QString args;\n        const QList<QByteArray> &paramNames = method.parameterNames();\n        const QList<QByteArray> &paramTypes = method.parameterTypes();\n        for(int j=0; j<paramNames.count(); j++)\n        {\n            if(j != 0)\n                args += QStringLiteral(\", \");\n\n            args += fixType(QString::fromUtf8(paramTypes[j])) + QStringLiteral(\" \") + paramNames[j];\n        }\n\n        QString text = QStringLiteral(\" * %1 <font color='#074885'><b>%2</b></font>(%3)\\n\").arg(methodType).arg(methodName).arg(args);\n        switch(static_cast<int>(method.methodType()))\n        {\n        case QMetaMethod::Slot:\n            resultSlots += text;\n            break;\n        case QMetaMethod::Signal:\n            resultSignals += text;\n            break;\n        }\n    }\n\n    if(!resultProperties.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Normal Properties](#normal-properties)\\n\");\n        resultProperties = QStringLiteral(\"\\n### Normal Properties\\n\\n\") + resultProperties;\n    }\n    if(!enumResults.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Enumerator](#enumerator)\\n\");\n        enumResults = QStringLiteral(\"\\n### Enumerator\\n\\n\") + enumResults;\n    }\n    if(!resultSlots.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Methods](#methods)\\n\");\n        resultSlots = QStringLiteral(\"\\n### Methods\\n\\n\") + resultSlots;\n    }\n    if(!resultSignals.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Signals](#Q_SIGNALS)\\n\");\n        resultSignals = QStringLiteral(\"\\n### Signals\\n\\n\") + resultSignals;\n    }\n    if(isModel)\n        headers += QStringLiteral(\" * [Roles](#roles)\\n\");\n\n    result += headers + QStringLiteral(\"\\n\");\n    result += details + QStringLiteral(\"\\n\");\n    result += resultProperties + QStringLiteral(\"\\n\");\n    result += resultSlots + QStringLiteral(\"\\n\");\n    result += resultSignals + QStringLiteral(\"\\n\");\n    result += enumResults + QStringLiteral(\"\\n\");\n\n    if(!store)\n        return result;\n\n    QString path = aseman_qt_tools_destination + QStringLiteral(\"/\") + component.toLower() + QStringLiteral(\".md\");\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemModern::exportModel(const QString &module, int major, int minor, const QString &component)\n{\n    QString result = exportItem<T>(module, major, minor, component, false);\n    T *model = new T();\n\n    QHash<qint32,QByteArray> roleNames = model->roleNames();\n    QMap<qint32,QByteArray> rolesMap;\n    QHashIterator<qint32,QByteArray> i(roleNames);\n    while(i.hasNext())\n    {\n        i.next();\n        rolesMap[i.key()] = i.value();\n    }\n\n    result += QStringLiteral(\"\\n### Roles\\n\\n\");\n    Q_FOREACH(const QByteArray &name, rolesMap)\n        result += QStringLiteral(\" * model.<font color='#074885'>%1</font>\\n\").arg(QString::fromUtf8(name));\n\n    delete model;\n\n    QString path = aseman_qt_tools_destination + \"/\" + component.toLower() + \".md\";\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n"
  },
  {
    "path": "src/asemanqml/modern/asemanqttoolsitemmodern.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQTTOOLSITEMMODERN_H\n#define ASEMANQTTOOLSITEMMODERN_H\n\n#include <QtGlobal>\n#include <QString>\n\n#include <asemanqttools.h>\n\nclass QObject;\nclass QQmlEngine;\nclass QJSEngine;\nclass AsemanQtToolsItemModern: public AsemanQtTools\n{\npublic:\n    static void registerTypes(const char *uri, bool exportMode = false);\n    static void registerFiles(const QString &filesLocation, const char *uri);\n\n    template<typename T>\n    static int registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template<typename T>\n    static int registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template <typename T>\n    static int registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName,\n                                 QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode);\n\n    template<typename T>\n    static int registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason, bool exportMode);\n\n    static void exportDocuments(const QString &destination);\n\nprotected:\n    template<typename T>\n    static QString exportItem(const QString &module, int major, int minor, const QString &component, bool store = true);\n    template<typename T>\n    static QString exportModel(const QString &module, int major, int minor, const QString &component);\n\n    static QString fixType(const QString &type);\n};\n\n#endif // ASEMANQTTOOLSITEMMODERN_H\n"
  },
  {
    "path": "src/asemanqml/modern/modern.pri",
    "content": "INCLUDEPATH += $$PWD\nQT += qml core gui\n\nHEADERS += \\\n    $$PWD/modernplugin.h \\\n    $$PWD/asemanqttoolsitemmodern.h\n\nSOURCES += \\\n    $$PWD/modernplugin.cpp \\\n    $$PWD/asemanqttoolsitemmodern.cpp\n\nstatic: !linux: !win32: DEFINES += ASEMAN_STATIC_BUILD\n\nASEMAN_QML_FILES = $$files($$PWD/Modern/*.*) $$PWD/Modern/qmldir\n\nINCLUDED_RESOURCE_FILES = \\\n    $$ASEMAN_QML_FILES\n\nasemanmodern.files = $$INCLUDED_RESOURCE_FILES\nasemanmodern.prefix = /AsemanQml/\n\ncontains(DEFINES, QT_ASEMAN_EMBEDDED) {\n    RESOURCES += $$PWD/qmake_asemanmodern.qrc\n} else {\n    RESOURCES += asemanmodern\n}\n"
  },
  {
    "path": "src/asemanqml/modern/modern.pro",
    "content": "TARGET  = asemanqmlmodern\nTARGETPATH = AsemanQml/Modern\nIMPORT_VERSION = 2.0\n\nQT += asemanqml asemancore\ninclude(modern.pri)\n\nload(qml_plugin)\n"
  },
  {
    "path": "src/asemanqml/modern/modernplugin.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"modernplugin.h\"\n#include \"asemanqttoolsitemmodern.h\"\n\n#include <QDebug>\n#include <QDir>\n#include <QStringList>\n#include <QtQml>\n\n#ifdef QT_ASEMAN_EMBEDDED\nbool asemanqml_modern_plugin_registered = AsemanModernPlugin::registerStaticTypes(\"AsemanQml.Modern\");\n#endif\n\nbool AsemanModernPlugin::registerStaticTypes(const char *uri)\n{\n    Q_INIT_RESOURCE(qmake_asemanmodern);\n    AsemanQtToolsItemModern::registerTypes(uri);\n    AsemanQtToolsItemModern::registerFiles(QStringLiteral(\":/AsemanQml/Modern\"), uri);\n    return true;\n}\n\nvoid AsemanModernPlugin::registerTypes(const char *uri)\n{\n    AsemanModernPlugin::registerStaticTypes(uri);\n}\n\nvoid AsemanModernPlugin::initializeEngine(QQmlEngine *engine, const char *uri)\n{\n    QQmlExtensionPlugin::initializeEngine(engine, uri);\n}\n"
  },
  {
    "path": "src/asemanqml/modern/modernplugin.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANMODERNPLUGIN_H\n#define ASEMANMODERNPLUGIN_H\n\n#include <QQmlExtensionPlugin>\n\nclass AsemanModernPlugin : public QQmlExtensionPlugin\n{\n    Q_OBJECT\n\n#ifndef QT_ASEMAN_EMBEDDED\n    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)\n#endif\n\npublic:\n    static bool registerStaticTypes(const char *uri);\n    void registerTypes(const char *uri);\n    void initializeEngine(QQmlEngine *engine, const char *uri);\n};\n\n#endif // ASEMANMODERNPLUGIN_H\n"
  },
  {
    "path": "src/asemanqml/modern/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Modern 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.8\"]\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Modern/FancyNavigationBar 2.0\"\n        exports: [\"AsemanQml.Modern/FancyNavigationBar 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"contents\"\n        Property { name: \"currentIndex\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"currentPage\"; type: \"FancyPage_QMLTYPE_0\"; isReadonly: true; isPointer: true }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"contents\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Property { name: \"barHeight\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Modern/FancyPage 2.0\"\n        exports: [\"AsemanQml.Modern/FancyPage 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"contents\"\n        Property { name: \"delegateItem\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"delegate\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"title\"; type: \"string\" }\n        Property { name: \"font\"; type: \"QFont\" }\n        Property { name: \"textColor\"; type: \"QColor\" }\n        Property { name: \"contents\"; type: \"QObject\"; isList: true; isReadonly: true }\n        Property { name: \"color\"; type: \"QColor\" }\n        Method {\n            name: \"init\"\n            type: \"QVariant\"\n            Parameter { name: \"opened\"; type: \"QVariant\" }\n        }\n        Method { name: \"openFromLeft\"; type: \"QVariant\" }\n        Method { name: \"openFromRight\"; type: \"QVariant\" }\n        Method { name: \"closeToLeft\"; type: \"QVariant\" }\n        Method { name: \"closeToRight\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Modern/FancySearchBar 2.0\"\n        exports: [\"AsemanQml.Modern/FancySearchBar 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"layoutDirection\"; type: \"int\" }\n        Property { name: \"mainList\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"ratio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"keyword\"; type: \"string\" }\n        Property { name: \"toolbarHeight\"; type: \"double\" }\n        Property { name: \"toolbarTopMargin\"; type: \"double\" }\n        Property { name: \"searchBarButton\"; type: \"QQuickText\"; isReadonly: true; isPointer: true }\n        Property { name: \"clearButton\"; type: \"QQuickText\"; isReadonly: true; isPointer: true }\n        Property { name: \"panelColor\"; type: \"QColor\" }\n        Property { name: \"searchBarColor\"; type: \"QColor\" }\n        Property { name: \"background\"; type: \"QColor\" }\n        Property { name: \"opened\"; type: \"bool\" }\n        Property { name: \"textInput\"; type: \"QQuickTextInput\"; isReadonly: true; isPointer: true }\n        Property { name: \"placeholder\"; type: \"string\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Modern/FastDropShadow 2.0\"\n        exports: [\"AsemanQml.Modern/FastDropShadow 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"horizontalOffset\"; type: \"double\" }\n        Property { name: \"verticalOffset\"; type: \"double\" }\n        Property { name: \"cached\"; type: \"bool\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"source\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Modern/FastRectengleShadow 2.0\"\n        exports: [\"AsemanQml.Modern/FastRectengleShadow 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"horizontalOffset\"; type: \"double\" }\n        Property { name: \"verticalOffset\"; type: \"double\" }\n        Property { name: \"cached\"; type: \"bool\" }\n        Property { name: \"radius\"; type: \"double\" }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"roundRadius\"; type: \"double\" }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Modern/LazyList 2.0\"\n        exports: [\"AsemanQml.Modern/LazyList 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"contentItem\"\n        Property { name: \"contentItem\"; type: \"QQuickListView\"; isPointer: true }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/modern/qmake_asemanmodern.qrc",
    "content": "<!DOCTYPE RCC><RCC version=\"1.0\">\n<qresource prefix=\"/AsemanQml/\">\n<file>Modern/FancyNavigationBar.qml</file>\n<file>Modern/FancyPage.qml</file>\n<file>Modern/FancySearchBar.qml</file>\n<file>Modern/FastDropShadow.qml</file>\n<file>Modern/FastRectengleShadow.qml</file>\n<file>Modern/LazyList.qml</file>\n<file>Modern/qmldir</file>\n</qresource>\n</RCC>\n"
  },
  {
    "path": "src/asemanqml/modern/qmldir",
    "content": "module AsemanQml.Modern\nclassname AsemanModernPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlmodern\n"
  },
  {
    "path": "src/asemanqml/multimedia/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmultimediaplugin.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemmultimedia.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmultimediaplugin.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemmultimedia.cpp\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/qmake_asemanmultimedia.qrc\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/asemanqml/multimedia/Multimedia/VideoPlayer.qml",
    "content": "import QtQuick 2.9\nimport QtMultimedia 5.8\nimport AsemanQml.Base 2.0\nimport AsemanQml.Awesome 2.0\nimport QtQuick.Controls 2.2\nimport QtQuick.Layouts 1.2\nimport AsemanQml.GraphicalEffects 2.0\nimport QtQuick.Controls.Material 2.2\n\nItem {\n    id: videoPlayer\n\n    property bool controlsVisibled: true\n    property alias source: video.source\n    property alias title: titleLabel.text\n    readonly property bool playing: video.playbackState == MediaPlayer.PlayingState\n    readonly property bool loading: video.status == MediaPlayer.Loading\n    property color color: Devices.isAndroid? \"#55000000\" : \"#55ffffff\"\n    property color background: \"#000000\"\n    property bool blur: !Devices.isAndroid\n\n    onPlayingChanged: {\n        if(playing)\n            timer.restart()\n        else\n            controlsVisibled = true\n    }\n\n    Rectangle {\n        id: videoRect\n        color: videoPlayer.background\n        anchors.fill: parent\n\n        Video {\n            id: video\n            anchors.fill: parent\n\n            MouseArea {\n                anchors.fill: parent\n                onClicked: {\n                    if(controlsVisibled && playing)\n                        controlsVisibled = false\n                    else\n                        controlsVisibled = true\n                    if(playing)\n                        timer.restart()\n                }\n            }\n\n            Label {\n                id: errorLabel\n                anchors.centerIn: parent\n                width: parent.width\n                horizontalAlignment: Text.AlignHCenter\n                wrapMode: Text.WrapAtWordBoundaryOrAnywhere\n                color: \"#ffffff\"\n                text: {\n                    var res = \"\"\n                    switch(video.error) {\n                    case MediaPlayer.NoError:\n                        break\n                    case MediaPlayer.ResourceError:\n                        res += \"ResourceError\\n\"\n                        break\n                    case MediaPlayer.FormatError:\n                        res += \"FormatError\\n\"\n                        break\n                    case MediaPlayer.NetworkError:\n                        res += \"NetworkError\\n\"\n                        break\n                    case MediaPlayer.AccessDenied:\n                        res += \"AccessDenied\\n\"\n                        break\n                    case MediaPlayer.ServiceMissing:\n                        res += \"ServiceMissing\\n\"\n                        break\n                    }\n                    res += video.errorString\n                    return res\n                }\n            }\n\n            focus: true\n            Keys.onSpacePressed: playing? videoPlayer.pause() : videoPlayer.play()\n        }\n\n        BusyIndicator {\n            anchors.centerIn: parent\n            height: 48*Devices.density\n            width: height\n            running: loading\n            transformOrigin: Item.Center\n            Material.accent: \"#ffffff\"\n        }\n    }\n\n    Timer {\n        id: timer\n        interval: 2000\n        repeat: false\n        onTriggered: if(playing && !slider.pressed) controlsVisibled = false\n    }\n\n    FastBlur {\n        id: blurFrame\n        source: videoRect\n        width: videoRect.width\n        height: videoRect.height\n        anchors.bottom: parent.bottom\n        radius: videoPlayer.blur? 64 : 0\n        visible: false\n    }\n\n    OpacityMask {\n        anchors.fill: parent\n        maskSource: controlsMask\n        source: blurFrame\n        visible: videoPlayer.blur\n    }\n\n    Item {\n        id: controlsMask\n        anchors.fill: videoRect\n        visible: false\n\n        Rectangle {\n            width: parent.width\n            height: topControls.height\n            y: topControls.y\n        }\n\n        Rectangle {\n            width: parent.width\n            height: bottomControls.height\n            y: bottomControls.y\n        }\n    }\n\n    Item {\n        id: controls\n        anchors.fill: controlsMask\n\n        property real ratio: controlsVisibled? 1 : 0\n\n        Behavior on ratio {\n            NumberAnimation { easing.type: Easing.OutCubic; duration: 250 }\n        }\n\n        Rectangle {\n            id: topControls\n            width: parent.width\n            height: topRow.height\n            y: height*(controls.ratio-1)\n            color: videoPlayer.color\n\n            RowLayout {\n                id: topRow\n                anchors.left: parent.left\n                anchors.right: parent.right\n                anchors.verticalCenter: parent.verticalCenter\n\n                Button {\n                    flat: true\n                    text: \"Done\"\n                    Material.theme: Material.Dark\n                    onClicked: {\n                        video.stop()\n                        BackHandler.back()\n                    }\n                }\n\n                Label {\n                    id: titleLabel\n                    color: \"#ffffff\"\n                    Layout.fillWidth: true\n                    horizontalAlignment: Text.AlignHCenter\n                }\n\n                Button {\n                    flat: true\n                    text: playing? Awesome.fa_pause : Awesome.fa_play\n                    font.family: Awesome.family\n                    Material.theme: Material.Dark\n                    onClicked: playing? pause() : play()\n                }\n            }\n        }\n\n        Rectangle {\n            id: bottomControls\n            width: parent.width\n            height: bottomRow.height\n            y: parent.height - height*controls.ratio\n            color: videoPlayer.color\n\n            RowLayout {\n                id: bottomRow\n                anchors.left: parent.left\n                anchors.right: parent.right\n                anchors.margins: 20*Devices.density\n                anchors.verticalCenter: parent.verticalCenter\n\n                Label {\n                    color: \"#ffffff\"\n                    text: {\n                        var pos = slider.pressed? slider.value : video.position\n                        var time = Math.floor(pos/1000)\n                        var secs = time%60\n                        var allMins = Math.floor(time/60)\n                        var mins = allMins % 60\n                        var hours = Math.floor(allMins/60)\n                        if(secs < 10)\n                            secs = \"0\" + secs\n                        if(mins < 10)\n                            mins = \"0\" + mins\n\n                        if(hours > 0)\n                            return hours + \":\" + mins + \":\" + secs\n                        else\n                            return mins + \":\" + secs\n                    }\n                }\n\n                Slider {\n                    id: slider\n                    from: 0\n                    value: video.position\n                    to: video.duration\n                    onMoved: video.seek(value)\n                    Material.accent: \"#ffffff\"\n                    Layout.fillWidth: true\n                }\n\n                Label {\n                    color: \"#ffffff\"\n                    text: {\n                        var time = Math.floor(video.duration/1000)\n                        var secs = time%60\n                        var allMins = Math.floor(time/60)\n                        var mins = allMins % 60\n                        var hours = Math.floor(allMins/60)\n                        if(secs < 10)\n                            secs = \"0\" + secs\n                        if(mins < 10)\n                            mins = \"0\" + mins\n\n                        if(hours > 0)\n                            return hours + \":\" + mins + \":\" + secs\n                        else\n                            return mins + \":\" + secs\n                    }\n                }\n            }\n        }\n    }\n\n    function play() {\n        video.play()\n    }\n\n    function pause() {\n        timer.stop()\n        video.pause()\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/multimedia/Multimedia/qmldir",
    "content": "module AsemanQml.Multimedia\nVideoPlayer 2.0 VideoPlayer.qml\n"
  },
  {
    "path": "src/asemanqml/multimedia/asemanmultimediaplugin.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanmultimediaplugin.h\"\n\n#include \"asemanqttoolsitemmultimedia.h\"\n\n#include <QDebug>\n#include <QDir>\n#include <QStringList>\n#include <QtQml>\n\n#ifdef QT_ASEMAN_EMBEDDED\nbool asemanqml_multimedia_plugin_registered = AsemanMultimediaPlugin::registerStaticTypes(\"AsemanQml.Multimedia\");\n#endif\n\nbool AsemanMultimediaPlugin::registerStaticTypes(const char *uri)\n{\n    Q_INIT_RESOURCE(qmake_asemanmultimedia);\n    AsemanQtToolsItemMultimedia::registerTypes(uri);\n    AsemanQtToolsItemMultimedia::registerFiles(QStringLiteral(\":/AsemanQml/Multimedia\"), uri);\n    return true;\n}\n\nvoid AsemanMultimediaPlugin::registerTypes(const char *uri)\n{\n    AsemanMultimediaPlugin::registerStaticTypes(uri);\n}\n\nvoid AsemanMultimediaPlugin::initializeEngine(QQmlEngine *engine, const char *uri)\n{\n    QQmlExtensionPlugin::initializeEngine(engine, uri);\n    AsemanQtTools::initializeEngine(engine, uri);\n}\n"
  },
  {
    "path": "src/asemanqml/multimedia/asemanmultimediaplugin.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANMULTIMEDIAPLUGIN_H\n#define ASEMANMULTIMEDIAPLUGIN_H\n\n#include <QQmlExtensionPlugin>\n\nclass AsemanMultimediaPlugin : public QQmlExtensionPlugin\n{\n    Q_OBJECT\n\n#ifndef QT_ASEMAN_EMBEDDED\n    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)\n#endif\n\npublic:\n    static bool registerStaticTypes(const char *uri);\n\n    void registerTypes(const char *uri);\n    void initializeEngine(QQmlEngine *engine, const char *uri);\n};\n\n#endif // ASEMANMULTIMEDIAPLUGIN_H\n"
  },
  {
    "path": "src/asemanqml/multimedia/asemanqttoolsitemmultimedia.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtToolsItemMultimedia is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtToolsItemMultimedia is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanqttoolsitemmultimedia.h\"\n\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n#include \"asemanaudiorecorder.h\"\n#include \"asemanaudioencodersettings.h\"\n#include \"asemanmultimediadatabase.h\"\n#endif\n\n#include <qqml.h>\n#include <QHash>\n#include <QPointer>\n#include <QFile>\n#include <QDir>\n\nstatic QStringList aseman_qt_tools_indexCache;\nstatic QString aseman_qt_tools_destination;\n\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\nstatic QObject *aseman_multimedia_AsemanMultimediaDatabase(QQmlEngine *engine, QJSEngine *scriptEngine) {\n    Q_UNUSED(engine)\n    Q_UNUSED(scriptEngine)\n    static QPointer<AsemanMultimediaDatabase> singleton;\n    if (!singleton)\n        singleton = new AsemanMultimediaDatabase();\n\n    return singleton;\n}\n#endif\n\nvoid AsemanQtToolsItemMultimedia::registerTypes(const char *uri, bool exportMode)\n{\n    static QSet<QByteArray> register_list;\n    if(register_list.contains(uri) && !exportMode)\n        return;\n\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n    registerType<AsemanAudioRecorder>(uri, 2, 0, \"AudioRecorder\", exportMode);\n    registerType<AsemanAudioEncoderSettings>(uri, 2, 0, \"AudioEncoderSettings\", exportMode);\n    registerSingletonType<AsemanMultimediaDatabase>(uri, 2, 0, \"MultimediaDatabase\", aseman_multimedia_AsemanMultimediaDatabase, exportMode);\n#endif\n\n    register_list.insert(uri);\n}\n\nvoid AsemanQtToolsItemMultimedia::registerFiles(const QString &filesLocation, const char *uri)\n{\n    QFile file(filesLocation + QStringLiteral(\"/qmldir\"));\n    if(file.open(QFile::ReadOnly))\n    {\n        QStringList lines = QString::fromUtf8(file.readAll()).split(QStringLiteral(\"\\n\"), Qt::SkipEmptyParts);\n        file.close();\n\n        for(const QString &l: lines)\n        {\n            QStringList parts = l.trimmed().split(QStringLiteral(\" \"), Qt::SkipEmptyParts);\n            bool singleton = false;\n            if(parts.count() && parts.first() == \"singleton\")\n                singleton = parts.takeFirst().count();\n            if(parts.length() != 3)\n                continue;\n\n            QStringList version = parts.at(1).split(QStringLiteral(\".\"), Qt::SkipEmptyParts);\n            if(version.count() != 2)\n                continue;\n\n            if(singleton)\n                qmlRegisterSingletonType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                         uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n            else\n                qmlRegisterType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n        }\n    }\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemMultimedia::registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemMultimedia::registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportModel<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemMultimedia::registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterSingletonType<T>(uri, versionMajor, versionMinor, typeName, callback);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemMultimedia::registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(qmlName));\n    else\n        return qmlRegisterUncreatableType<T>(uri, versionMajor, versionMinor, qmlName, reason);\n    return 0;\n}\n\n\nvoid AsemanQtToolsItemMultimedia::exportDocuments(const QString &destination)\n{\n    aseman_qt_tools_destination = destination;\n\n    QDir().mkpath(aseman_qt_tools_destination);\n    aseman_qt_tools_indexCache.clear();\n\n    AsemanQtToolsItemMultimedia::registerTypes(\"AsemanToolsItem\", true);\n\n    QString index = QStringLiteral(\"# AsemanToolsItem Documents\\n\\n\");\n    index += QStringLiteral(\"### [Getting Started](gettingstarted.md)\\n\\n\");\n    index += QStringLiteral(\"### How to import:\\n\\n\");\n    index += QStringLiteral(\"```c++\\nimport AsemanQml.Base 2.0\\n```\\n\\nor\\n\\n\"\n             \"```c++\\nimport AsemanQml.Base 2.0 as Aseman\\n```\\n\\n\");\n    index += QStringLiteral(\"### Types\\n\\nHere are all components of the AsemanToolsItem:\\n\\n\");\n    for(const QString cmpnt: aseman_qt_tools_indexCache)\n    {\n        if(cmpnt == QStringLiteral(\"MimeData\"))\n            index += QStringLiteral(\"\\n##### Normal types\\n\\n\");\n        if(cmpnt == QStringLiteral(\"MixedListModel\"))\n            index += QStringLiteral(\"\\n##### Models\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Devices\"))\n            index += QStringLiteral(\"\\n##### Singletons\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Screen\"))\n            index += QStringLiteral(\"\\n##### Uncreatable types\\n\\n\");\n        index += QStringLiteral(\" * [%1](%2.md)\\n\").arg(cmpnt).arg(cmpnt.toLower());\n    }\n\n    QString path = aseman_qt_tools_destination + \"/start.md\";\n    aseman_qt_tools_destination.clear();\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return;\n\n    file.write(index.toUtf8());\n    file.close();\n}\n\nQString AsemanQtToolsItemMultimedia::fixType(const QString &type)\n{\n    if(type == QStringLiteral(\"QSizeF\") || type == QStringLiteral(\"QSize\"))\n        return QStringLiteral(\"size\");\n    if(type == QStringLiteral(\"QPoint\") || type == QStringLiteral(\"QPointF\"))\n        return QStringLiteral(\"point\");\n    if(type == QStringLiteral(\"QUrl\"))\n        return QStringLiteral(\"url\");\n    if(type == QStringLiteral(\"QString\"))\n        return QStringLiteral(\"string\");\n    if(type == QStringLiteral(\"QByteArray\"))\n        return QStringLiteral(\"byte\");\n    if(type == QStringLiteral(\"bool\"))\n        return QStringLiteral(\"boolean\");\n    if(type == QStringLiteral(\"double\") || type == QStringLiteral(\"qreal\"))\n        return QStringLiteral(\"real\");\n    if(type == QStringLiteral(\"QVariant\"))\n        return QStringLiteral(\"variant\");\n    if(type == QStringLiteral(\"QJSValue\"))\n        return QStringLiteral(\"function(){[code]}\");\n    if(type == QStringLiteral(\"QVariantMap\"))\n        return QStringLiteral(\"map\");\n    if(type == QStringLiteral(\"QVariantList\"))\n        return QStringLiteral(\"list&lt;variant&gt;\");\n    if(type == QStringLiteral(\"QStringList\"))\n        return QStringLiteral(\"list&lt;string&gt;\");\n    if(type == QStringLiteral(\"QList<qint32>\"))\n        return QStringLiteral(\"list&lt;int&gt;\");\n    if(type.contains(QStringLiteral(\"*\")))\n    {\n        if(type == QStringLiteral(\"QObject*\"))\n            return QStringLiteral(\"object\");\n        if(type.contains(QStringLiteral(\"Telegram\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Telegram\"));\n            return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n        }\n        if(type.contains(QStringLiteral(\"Object\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Object\"));\n            return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                    .arg(name).arg(name.toLower());\n        }\n        if(type == QStringLiteral(\"QQmlComponent*\"))\n            return QStringLiteral(\"Component\");\n        if(type == QStringLiteral(\"QQuickItem\"))\n            return QStringLiteral(\"Item\");\n    }\n    if(type.contains(QStringLiteral(\"Telegram\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Telegram\"));\n        return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n    }\n    if(type == QStringLiteral(\"QQuickItem\"))\n        return QStringLiteral(\"Item\");\n    if(type == QStringLiteral(\"QObject\"))\n        return QStringLiteral(\"object\");\n    if(type.contains(QStringLiteral(\"Object\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Object\"));\n        return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                .arg(name).arg(name.toLower());\n    }\n    return type;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemMultimedia::exportItem(const QString &module, int major, int minor, const QString &component, bool store)\n{\n    QString result;\n    aseman_qt_tools_indexCache << component;\n\n    QMetaObject meta = T::staticMetaObject;\n    QString inherits = fixType(QString::fromUtf8(meta.superClass()? meta.superClass()->className() : \"\"));\n    bool isModel = component.toLower().contains(QStringLiteral(\"model\"));\n\n    result += QStringLiteral(\"# %1\\n\\n\").arg(component);\n\n    QString headers;\n    headers += QStringLiteral(\" * [Component details](#component-details)\\n\");\n\n    QString details = QStringLiteral(\"\\n### Component details:\\n\\n\");\n    details += QStringLiteral(\"|Detail|Value|\\n\"\n                       \"|------|-----|\\n\");\n    details += QStringLiteral(\"|%1|%2 %3.%4|\\n\").arg(QStringLiteral(\"Import\")).arg(module).arg(major).arg(minor);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Component\")).arg(component);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"C++ class\")).arg(QString::fromUtf8(meta.className()));\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Inherits\")).arg(inherits);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Model\")).arg(QString::fromUtf8(isModel?\"Yes\":\"No\"));\n\n    QString resultProperties;\n    QStringList propertiesSignals;\n    for(int i=0; i<meta.propertyCount(); i++)\n    {\n        QMetaProperty property = meta.property(i);\n        const QString &propertyName = QString::fromUtf8(property.name());\n        const QString &propertyType = fixType(QString::fromUtf8(property.typeName()));\n        propertiesSignals << QString::fromUtf8(property.notifySignal().name());\n\n        QString text = QStringLiteral(\"* <font color='#074885'><b>%1</b></font>: %2\").arg(propertyName).arg(propertyType);\n        if(!property.isWritable())\n            text += QStringLiteral(\" (readOnly)\");\n\n        text += QStringLiteral(\"\\n\");\n        if(meta.propertyOffset()<=i)\n            resultProperties += text;\n    }\n\n    QString enumResults;\n    for(int i=meta.enumeratorOffset(); i<meta.enumeratorCount(); i++)\n    {\n        QMetaEnum enumerator = meta.enumerator(i);\n        const QString &enumName = QString::fromUtf8(enumerator.name());\n\n        enumResults += QStringLiteral(\"\\n##### %1\\n\\n\").arg(enumName);\n        enumResults += QStringLiteral(\"|Key|Value|\\n\"\n                               \"|---|-----|\\n\");\n\n        for(int j=0; j<enumerator.keyCount(); j++)\n            enumResults += QStringLiteral(\"|%1|%2|\\n\").arg(QString::fromUtf8(enumerator.key(j))).arg(enumerator.value(j));\n    }\n\n    QString resultSlots;\n    QString resultSignals;\n    for(int i=meta.methodOffset(); i<meta.methodCount(); i++)\n    {\n        QMetaMethod method = meta.method(i);\n        if(method.access() != QMetaMethod::Public)\n            continue;\n\n        const QString &methodName = QString::fromUtf8(method.name());\n        if(propertiesSignals.contains(methodName))\n            continue;\n\n        const QString &methodType = fixType(QString::fromUtf8(method.typeName()));\n\n        QString args;\n        const QList<QByteArray> &paramNames = method.parameterNames();\n        const QList<QByteArray> &paramTypes = method.parameterTypes();\n        for(int j=0; j<paramNames.count(); j++)\n        {\n            if(j != 0)\n                args += QStringLiteral(\", \");\n\n            args += fixType(QString::fromUtf8(paramTypes[j])) + QStringLiteral(\" \") + paramNames[j];\n        }\n\n        QString text = QStringLiteral(\" * %1 <font color='#074885'><b>%2</b></font>(%3)\\n\").arg(methodType).arg(methodName).arg(args);\n        switch(static_cast<int>(method.methodType()))\n        {\n        case QMetaMethod::Slot:\n            resultSlots += text;\n            break;\n        case QMetaMethod::Signal:\n            resultSignals += text;\n            break;\n        }\n    }\n\n    if(!resultProperties.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Normal Properties](#normal-properties)\\n\");\n        resultProperties = QStringLiteral(\"\\n### Normal Properties\\n\\n\") + resultProperties;\n    }\n    if(!enumResults.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Enumerator](#enumerator)\\n\");\n        enumResults = QStringLiteral(\"\\n### Enumerator\\n\\n\") + enumResults;\n    }\n    if(!resultSlots.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Methods](#methods)\\n\");\n        resultSlots = QStringLiteral(\"\\n### Methods\\n\\n\") + resultSlots;\n    }\n    if(!resultSignals.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Signals](#Q_SIGNALS)\\n\");\n        resultSignals = QStringLiteral(\"\\n### Signals\\n\\n\") + resultSignals;\n    }\n    if(isModel)\n        headers += QStringLiteral(\" * [Roles](#roles)\\n\");\n\n    result += headers + QStringLiteral(\"\\n\");\n    result += details + QStringLiteral(\"\\n\");\n    result += resultProperties + QStringLiteral(\"\\n\");\n    result += resultSlots + QStringLiteral(\"\\n\");\n    result += resultSignals + QStringLiteral(\"\\n\");\n    result += enumResults + QStringLiteral(\"\\n\");\n\n    if(!store)\n        return result;\n\n    QString path = aseman_qt_tools_destination + QStringLiteral(\"/\") + component.toLower() + QStringLiteral(\".md\");\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemMultimedia::exportModel(const QString &module, int major, int minor, const QString &component)\n{\n    QString result = exportItem<T>(module, major, minor, component, false);\n    T *model = new T();\n\n    QHash<qint32,QByteArray> roleNames = model->roleNames();\n    QMap<qint32,QByteArray> rolesMap;\n    QHashIterator<qint32,QByteArray> i(roleNames);\n    while(i.hasNext())\n    {\n        i.next();\n        rolesMap[i.key()] = i.value();\n    }\n\n    result += QStringLiteral(\"\\n### Roles\\n\\n\");\n    Q_FOREACH(const QByteArray &name, rolesMap)\n        result += QStringLiteral(\" * model.<font color='#074885'>%1</font>\\n\").arg(QString::fromUtf8(name));\n\n    delete model;\n\n    QString path = aseman_qt_tools_destination + \"/\" + component.toLower() + \".md\";\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n"
  },
  {
    "path": "src/asemanqml/multimedia/asemanqttoolsitemmultimedia.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQTTOOLSITEMMULTIEMEDIA_H\n#define ASEMANQTTOOLSITEMMULTIEMEDIA_H\n\n#include <QtGlobal>\n#include <QString>\n\n#include <asemanqttools.h>\n\nclass QObject;\nclass QQmlEngine;\nclass QJSEngine;\nclass AsemanQtToolsItemMultimedia: public AsemanQtTools\n{\npublic:\n    static void registerTypes(const char *uri, bool exportMode = false);\n    static void registerFiles(const QString &filesLocation, const char *uri);\n\n    template<typename T>\n    static int registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template<typename T>\n    static int registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template <typename T>\n    static int registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName,\n                                 QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode);\n\n    template<typename T>\n    static int registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason, bool exportMode);\n\n    static void exportDocuments(const QString &destination);\n\nprotected:\n    template<typename T>\n    static QString exportItem(const QString &module, int major, int minor, const QString &component, bool store = true);\n    template<typename T>\n    static QString exportModel(const QString &module, int major, int minor, const QString &component);\n\n    static QString fixType(const QString &type);\n};\n\n#endif // ASEMANQTTOOLSITEMMULTIEMEDIA_H\n"
  },
  {
    "path": "src/asemanqml/multimedia/multimedia.pri",
    "content": "INCLUDEPATH += $$PWD\nQT += core gui network multimedia qml\n\nHEADERS += \\\n    $$PWD/asemanmultimediaplugin.h \\\n    $$PWD/asemanqttoolsitemmultimedia.h\n\nSOURCES += \\\n    $$PWD/asemanmultimediaplugin.cpp \\\n    $$PWD/asemanqttoolsitemmultimedia.cpp\n\nstatic: !linux: !win32: DEFINES += ASEMAN_STATIC_BUILD\n\nASEMAN_QML_FILES = $$files($$PWD/Multimedia/*.*) $$PWD/Multimedia/qmldir\n\nINCLUDED_RESOURCE_FILES = \\\n    $$ASEMAN_QML_FILES\n\nasemanmultimedia.files = $$INCLUDED_RESOURCE_FILES\nasemanmultimedia.prefix = /AsemanQml/\n\ncontains(DEFINES, QT_ASEMAN_EMBEDDED) {\n    RESOURCES += $$PWD/qmake_asemanmultimedia.qrc\n} else {\n    RESOURCES += asemanmultimedia\n}\n\n"
  },
  {
    "path": "src/asemanqml/multimedia/multimedia.pro",
    "content": "TARGET  = asemanqmlmultimedia\nTARGETPATH = AsemanQml/Multimedia\nIMPORT_VERSION = 2.0\n\nQT += asemanqml asemangui asemancore\nlessThan(QT_MAJOR_VERSION, 6): QT += asemanmultimedia\n\ninclude(multimedia.pri)\n\nload(qml_plugin)\n\n"
  },
  {
    "path": "src/asemanqml/multimedia/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Multimedia 2.0'\n\nModule {\n    dependencies: [\n        \"AsemanQml.Awesome 2.0\",\n        \"AsemanQml.Base 2.0\",\n        \"QtGraphicalEffects 1.12\",\n        \"QtMultimedia 5.11\",\n        \"QtQuick 2.13\",\n        \"QtQuick.Controls 2.5\",\n        \"QtQuick.Controls.Fusion 2.13\",\n        \"QtQuick.Controls.Fusion.impl 2.12\",\n        \"QtQuick.Controls.Imagine 2.13\",\n        \"QtQuick.Controls.Imagine.impl 2.13\",\n        \"QtQuick.Controls.Material 2.13\",\n        \"QtQuick.Controls.Material.impl 2.12\",\n        \"QtQuick.Controls.Universal 2.13\",\n        \"QtQuick.Controls.Universal.impl 2.12\",\n        \"QtQuick.Controls.impl 2.13\",\n        \"QtQuick.Layouts 1.2\",\n        \"QtQuick.Templates 2.13\",\n        \"QtQuick.Window 2.2\"\n    ]\n    Component {\n        name: \"AsemanAudioEncoderSettings\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Multimedia/AudioEncoderSettings 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"EncodingQuality\"\n            values: {\n                \"VeryLowQuality\": 0,\n                \"LowQuality\": 1,\n                \"NormalQuality\": 2,\n                \"HighQuality\": 3,\n                \"VeryHighQuality\": 4\n            }\n        }\n        Enum {\n            name: \"EncodingMode\"\n            values: {\n                \"ConstantQualityEncoding\": 0,\n                \"ConstantBitRateEncoding\": 1,\n                \"AverageBitRateEncoding\": 2,\n                \"TwoPassEncoding\": 3\n            }\n        }\n        Property { name: \"bitRate\"; type: \"int\" }\n        Property { name: \"channelCount\"; type: \"int\" }\n        Property { name: \"codec\"; type: \"string\" }\n        Property { name: \"encodingMode\"; type: \"int\" }\n        Property { name: \"encodingOptions\"; type: \"QVariantMap\" }\n        Property { name: \"quality\"; type: \"int\" }\n        Property { name: \"sampleRate\"; type: \"int\" }\n    }\n    Component {\n        name: \"AsemanAudioRecorder\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Multimedia/AudioRecorder 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"State\"\n            values: {\n                \"StoppedState\": 0,\n                \"RecordingState\": 1,\n                \"PausedState\": 2\n            }\n        }\n        Enum {\n            name: \"Status\"\n            values: {\n                \"UnavailableStatus\": 0,\n                \"UnloadedStatus\": 1,\n                \"LoadingStatus\": 2,\n                \"LoadedStatus\": 3,\n                \"StartingStatus\": 4,\n                \"RecordingStatus\": 5,\n                \"PausedStatus\": 6,\n                \"FinalizingStatus\": 7\n            }\n        }\n        Property { name: \"encoderSettings\"; type: \"AsemanAudioEncoderSettings\"; isPointer: true }\n        Property { name: \"output\"; type: \"QUrl\" }\n        Property { name: \"mute\"; type: \"bool\" }\n        Property { name: \"available\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"availability\"; type: \"int\"; isReadonly: true }\n        Property { name: \"state\"; type: \"int\"; isReadonly: true }\n        Property { name: \"status\"; type: \"int\"; isReadonly: true }\n        Property { name: \"volume\"; type: \"double\" }\n        Property { name: \"audioInput\"; type: \"string\" }\n        Property { name: \"audioInputs\"; type: \"QStringList\"; isReadonly: true }\n        Method { name: \"stop\" }\n        Method { name: \"pause\" }\n        Method { name: \"record\" }\n    }\n    Component {\n        name: \"AsemanMultimediaDatabase\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Multimedia/MultimediaDatabase 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Method { name: \"getAllMusics\"; type: \"QVariantList\" }\n        Method { name: \"getAllAlbums\"; type: \"QVariantList\" }\n        Method { name: \"getAllArtists\"; type: \"QVariantList\" }\n        Method {\n            name: \"getArtistAlbums\"\n            type: \"QVariantList\"\n            Parameter { name: \"artistId\"; type: \"string\" }\n        }\n        Method {\n            name: \"getArtistSongs\"\n            type: \"QVariantList\"\n            Parameter { name: \"artistId\"; type: \"string\" }\n        }\n        Method {\n            name: \"getAlbumSongs\"\n            type: \"QVariantList\"\n            Parameter { name: \"albumId\"; type: \"string\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Multimedia/VideoPlayer 2.0\"\n        exports: [\"AsemanQml.Multimedia/VideoPlayer 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"controlsVisibled\"; type: \"bool\" }\n        Property { name: \"playing\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"loading\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"color\"; type: \"QColor\" }\n        Property { name: \"background\"; type: \"QColor\" }\n        Property { name: \"blur\"; type: \"bool\" }\n        Property { name: \"source\"; type: \"QUrl\" }\n        Property { name: \"title\"; type: \"string\" }\n        Method { name: \"play\"; type: \"QVariant\" }\n        Method { name: \"pause\"; type: \"QVariant\" }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/multimedia/qmake_asemanmultimedia.qrc",
    "content": "<!DOCTYPE RCC><RCC version=\"1.0\">\n<qresource prefix=\"/AsemanQml/\">\n<file>Multimedia/VideoPlayer.qml</file>\n<file>Multimedia/qmldir</file>\n</qresource>\n</RCC>\n"
  },
  {
    "path": "src/asemanqml/multimedia/qmldir",
    "content": "module AsemanQml.Multimedia\nclassname AsemanMultimediaPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlmultimedia\ndepends QtMultimedia 5.8\ndepends AsemanQml.Base 2.0\ndepends AsemanQml.Awesome 2.0\n"
  },
  {
    "path": "src/asemanqml/network/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkplugin.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemnetwork.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkplugin.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemnetwork.cpp\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/asemanqml/network/asemannetworkplugin.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemannetworkplugin.h\"\n#include \"asemanqttoolsitemnetwork.h\"\n\n#include <QDebug>\n#include <QDir>\n#include <QStringList>\n#include <QtQml>\n\n#ifdef QT_ASEMAN_EMBEDDED\nbool asemanqml_network_plugin_registered = AsemanNetworkPlugin::registerStaticTypes(\"AsemanQml.Network\");\n#endif\n\nbool AsemanNetworkPlugin::registerStaticTypes(const char *uri)\n{\n    AsemanQtToolsItemNetwork::registerTypes(uri);\n    AsemanQtToolsItemNetwork::registerFiles(QStringLiteral(\":/AsemanQml/Network\"), uri);\n    return true;\n}\n\nvoid AsemanNetworkPlugin::registerTypes(const char *uri)\n{\n    AsemanNetworkPlugin::registerStaticTypes(uri);\n}\n\nvoid AsemanNetworkPlugin::initializeEngine(QQmlEngine *engine, const char *uri)\n{\n    QQmlExtensionPlugin::initializeEngine(engine, uri);\n    AsemanQtTools::initializeEngine(engine, uri);\n}\n"
  },
  {
    "path": "src/asemanqml/network/asemannetworkplugin.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANNETWORKPLUGIN_H\n#define ASEMANNETWORKPLUGIN_H\n\n#include <QQmlExtensionPlugin>\n\nclass AsemanNetworkPlugin : public QQmlExtensionPlugin\n{\n    Q_OBJECT\n\n#ifndef QT_ASEMAN_EMBEDDED\n    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)\n#endif\n\npublic:\n    static bool registerStaticTypes(const char *uri);\n\n    void registerTypes(const char *uri);\n    void initializeEngine(QQmlEngine *engine, const char *uri);\n};\n\n#endif // ASEMANNETWORKPLUGIN_H\n"
  },
  {
    "path": "src/asemanqml/network/asemanqttoolsitemnetwork.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtToolsItemNetwork is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtToolsItemNetwork is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanqttoolsitemnetwork.h\"\n#include \"asemannetworkrequestmanager.h\"\n\n#include <asemanfiledownloaderqueue.h>\n\n#include <qqml.h>\n#include <QHash>\n#include <QPointer>\n#include <QFile>\n#include <QDir>\n#include <QSet>\n#include <QQmlEngine>\n\n#define SINGLETON_PROVIDER(TYPE, FNC_NAME, NEW_CREATOR) \\\n    static QObject *FNC_NAME(QQmlEngine *engine, QJSEngine *scriptEngine) { \\\n        Q_UNUSED(engine) \\\n        Q_UNUSED(scriptEngine) \\\n        TYPE *singleton = NEW_CREATOR; \\\n        return singleton; \\\n    }\n\nSINGLETON_PROVIDER(AsemanFileDownloaderQueue, aseman_downloader_queue_singleton  , AsemanQtToolsItemNetwork::getDownloaderQueue(engine))\n\nstatic QStringList aseman_qt_tools_indexCache;\nstatic QString aseman_qt_tools_destination;\n\nvoid AsemanQtToolsItemNetwork::registerTypes(const char *uri, bool exportMode)\n{\n    static QSet<QByteArray> register_list;\n    if(register_list.contains(uri) && !exportMode)\n        return;\n\n    registerType<AsemanNetworkRequestObject>(uri, 2, 0, \"NetworkRequest\", exportMode);\n    registerType<AsemanNetworkRequestManager>(uri, 2, 0, \"NetworkRequestManager\", exportMode);\n    registerUncreatableType<AsemanNetworkRequestReply>(uri, 2, 0, \"NetworkRequestReply\", \"\", exportMode);\n    registerSingletonType<AsemanFileDownloaderQueue>(uri, 2, 0, \"DownloaderQueue\", aseman_downloader_queue_singleton, exportMode);\n\n    register_list.insert(uri);\n}\n\nvoid AsemanQtToolsItemNetwork::registerFiles(const QString &filesLocation, const char *uri)\n{\n    QFile file(filesLocation + QStringLiteral(\"/qmldir\"));\n    if(file.open(QFile::ReadOnly))\n    {\n        QStringList lines = QString::fromUtf8(file.readAll()).split(QStringLiteral(\"\\n\"), Qt::SkipEmptyParts);\n        file.close();\n\n        for(const QString &l: lines)\n        {\n            QStringList parts = l.trimmed().split(QStringLiteral(\" \"), Qt::SkipEmptyParts);\n            bool singleton = false;\n            if(parts.count() && parts.first() == \"singleton\")\n                singleton = parts.takeFirst().count();\n            if(parts.length() != 3)\n                continue;\n\n            QStringList version = parts.at(1).split(QStringLiteral(\".\"), Qt::SkipEmptyParts);\n            if(version.count() != 2)\n                continue;\n\n            if(singleton)\n                qmlRegisterSingletonType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                         uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n            else\n                qmlRegisterType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n        }\n    }\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemNetwork::registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemNetwork::registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportModel<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemNetwork::registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterSingletonType<T>(uri, versionMajor, versionMinor, typeName, callback);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemNetwork::registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(qmlName));\n    else\n        return qmlRegisterUncreatableType<T>(uri, versionMajor, versionMinor, qmlName, reason);\n    return 0;\n}\n\n\nvoid AsemanQtToolsItemNetwork::exportDocuments(const QString &destination)\n{\n    aseman_qt_tools_destination = destination;\n\n    QDir().mkpath(aseman_qt_tools_destination);\n    aseman_qt_tools_indexCache.clear();\n\n    AsemanQtToolsItemNetwork::registerTypes(\"AsemanToolsItem\", true);\n\n    QString index = QStringLiteral(\"# AsemanToolsItem Documents\\n\\n\");\n    index += QStringLiteral(\"### [Getting Started](gettingstarted.md)\\n\\n\");\n    index += QStringLiteral(\"### How to import:\\n\\n\");\n    index += QStringLiteral(\"```c++\\nimport AsemanQml.Base 2.0\\n```\\n\\nor\\n\\n\"\n             \"```c++\\nimport AsemanQml.Base 2.0 as Aseman\\n```\\n\\n\");\n    index += QStringLiteral(\"### Types\\n\\nHere are all components of the AsemanToolsItem:\\n\\n\");\n    for(const QString cmpnt: aseman_qt_tools_indexCache)\n    {\n        if(cmpnt == QStringLiteral(\"MimeData\"))\n            index += QStringLiteral(\"\\n##### Normal types\\n\\n\");\n        if(cmpnt == QStringLiteral(\"MixedListModel\"))\n            index += QStringLiteral(\"\\n##### Models\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Devices\"))\n            index += QStringLiteral(\"\\n##### Singletons\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Screen\"))\n            index += QStringLiteral(\"\\n##### Uncreatable types\\n\\n\");\n        index += QStringLiteral(\" * [%1](%2.md)\\n\").arg(cmpnt).arg(cmpnt.toLower());\n    }\n\n    QString path = aseman_qt_tools_destination + \"/start.md\";\n    aseman_qt_tools_destination.clear();\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return;\n\n    file.write(index.toUtf8());\n    file.close();\n}\n\nAsemanFileDownloaderQueue *AsemanQtToolsItemNetwork::getDownloaderQueue(QQmlEngine *engine)\n{\n    return new AsemanFileDownloaderQueue(engine);\n}\n\nQString AsemanQtToolsItemNetwork::fixType(const QString &type)\n{\n    if(type == QStringLiteral(\"QSizeF\") || type == QStringLiteral(\"QSize\"))\n        return QStringLiteral(\"size\");\n    if(type == QStringLiteral(\"QPoint\") || type == QStringLiteral(\"QPointF\"))\n        return QStringLiteral(\"point\");\n    if(type == QStringLiteral(\"QUrl\"))\n        return QStringLiteral(\"url\");\n    if(type == QStringLiteral(\"QString\"))\n        return QStringLiteral(\"string\");\n    if(type == QStringLiteral(\"QByteArray\"))\n        return QStringLiteral(\"byte\");\n    if(type == QStringLiteral(\"bool\"))\n        return QStringLiteral(\"boolean\");\n    if(type == QStringLiteral(\"double\") || type == QStringLiteral(\"qreal\"))\n        return QStringLiteral(\"real\");\n    if(type == QStringLiteral(\"QVariant\"))\n        return QStringLiteral(\"variant\");\n    if(type == QStringLiteral(\"QJSValue\"))\n        return QStringLiteral(\"function(){[code]}\");\n    if(type == QStringLiteral(\"QVariantMap\"))\n        return QStringLiteral(\"map\");\n    if(type == QStringLiteral(\"QVariantList\"))\n        return QStringLiteral(\"list&lt;variant&gt;\");\n    if(type == QStringLiteral(\"QStringList\"))\n        return QStringLiteral(\"list&lt;string&gt;\");\n    if(type == QStringLiteral(\"QList<qint32>\"))\n        return QStringLiteral(\"list&lt;int&gt;\");\n    if(type.contains(QStringLiteral(\"*\")))\n    {\n        if(type == QStringLiteral(\"QObject*\"))\n            return QStringLiteral(\"object\");\n        if(type.contains(QStringLiteral(\"Telegram\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Telegram\"));\n            return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n        }\n        if(type.contains(QStringLiteral(\"Object\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Object\"));\n            return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                    .arg(name).arg(name.toLower());\n        }\n        if(type == QStringLiteral(\"QQmlComponent*\"))\n            return QStringLiteral(\"Component\");\n        if(type == QStringLiteral(\"QQuickItem\"))\n            return QStringLiteral(\"Item\");\n    }\n    if(type.contains(QStringLiteral(\"Telegram\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Telegram\"));\n        return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n    }\n    if(type == QStringLiteral(\"QQuickItem\"))\n        return QStringLiteral(\"Item\");\n    if(type == QStringLiteral(\"QObject\"))\n        return QStringLiteral(\"object\");\n    if(type.contains(QStringLiteral(\"Object\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Object\"));\n        return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                .arg(name).arg(name.toLower());\n    }\n    return type;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemNetwork::exportItem(const QString &module, int major, int minor, const QString &component, bool store)\n{\n    QString result;\n    aseman_qt_tools_indexCache << component;\n\n    QMetaObject meta = T::staticMetaObject;\n    QString inherits = fixType(QString::fromUtf8(meta.superClass()? meta.superClass()->className() : \"\"));\n    bool isModel = component.toLower().contains(QStringLiteral(\"model\"));\n\n    result += QStringLiteral(\"# %1\\n\\n\").arg(component);\n\n    QString headers;\n    headers += QStringLiteral(\" * [Component details](#component-details)\\n\");\n\n    QString details = QStringLiteral(\"\\n### Component details:\\n\\n\");\n    details += QStringLiteral(\"|Detail|Value|\\n\"\n                       \"|------|-----|\\n\");\n    details += QStringLiteral(\"|%1|%2 %3.%4|\\n\").arg(QStringLiteral(\"Import\")).arg(module).arg(major).arg(minor);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Component\")).arg(component);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"C++ class\")).arg(QString::fromUtf8(meta.className()));\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Inherits\")).arg(inherits);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Model\")).arg(QString::fromUtf8(isModel?\"Yes\":\"No\"));\n\n    QString resultProperties;\n    QStringList propertiesSignals;\n    for(int i=0; i<meta.propertyCount(); i++)\n    {\n        QMetaProperty property = meta.property(i);\n        const QString &propertyName = QString::fromUtf8(property.name());\n        const QString &propertyType = fixType(QString::fromUtf8(property.typeName()));\n        propertiesSignals << QString::fromUtf8(property.notifySignal().name());\n\n        QString text = QStringLiteral(\"* <font color='#074885'><b>%1</b></font>: %2\").arg(propertyName).arg(propertyType);\n        if(!property.isWritable())\n            text += QStringLiteral(\" (readOnly)\");\n\n        text += QStringLiteral(\"\\n\");\n        if(meta.propertyOffset()<=i)\n            resultProperties += text;\n    }\n\n    QString enumResults;\n    for(int i=meta.enumeratorOffset(); i<meta.enumeratorCount(); i++)\n    {\n        QMetaEnum enumerator = meta.enumerator(i);\n        const QString &enumName = QString::fromUtf8(enumerator.name());\n\n        enumResults += QStringLiteral(\"\\n##### %1\\n\\n\").arg(enumName);\n        enumResults += QStringLiteral(\"|Key|Value|\\n\"\n                               \"|---|-----|\\n\");\n\n        for(int j=0; j<enumerator.keyCount(); j++)\n            enumResults += QStringLiteral(\"|%1|%2|\\n\").arg(QString::fromUtf8(enumerator.key(j))).arg(enumerator.value(j));\n    }\n\n    QString resultSlots;\n    QString resultSignals;\n    for(int i=meta.methodOffset(); i<meta.methodCount(); i++)\n    {\n        QMetaMethod method = meta.method(i);\n        if(method.access() != QMetaMethod::Public)\n            continue;\n\n        const QString &methodName = QString::fromUtf8(method.name());\n        if(propertiesSignals.contains(methodName))\n            continue;\n\n        const QString &methodType = fixType(QString::fromUtf8(method.typeName()));\n\n        QString args;\n        const QList<QByteArray> &paramNames = method.parameterNames();\n        const QList<QByteArray> &paramTypes = method.parameterTypes();\n        for(int j=0; j<paramNames.count(); j++)\n        {\n            if(j != 0)\n                args += QStringLiteral(\", \");\n\n            args += fixType(QString::fromUtf8(paramTypes[j])) + QStringLiteral(\" \") + paramNames[j];\n        }\n\n        QString text = QStringLiteral(\" * %1 <font color='#074885'><b>%2</b></font>(%3)\\n\").arg(methodType).arg(methodName).arg(args);\n        switch(static_cast<int>(method.methodType()))\n        {\n        case QMetaMethod::Slot:\n            resultSlots += text;\n            break;\n        case QMetaMethod::Signal:\n            resultSignals += text;\n            break;\n        }\n    }\n\n    if(!resultProperties.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Normal Properties](#normal-properties)\\n\");\n        resultProperties = QStringLiteral(\"\\n### Normal Properties\\n\\n\") + resultProperties;\n    }\n    if(!enumResults.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Enumerator](#enumerator)\\n\");\n        enumResults = QStringLiteral(\"\\n### Enumerator\\n\\n\") + enumResults;\n    }\n    if(!resultSlots.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Methods](#methods)\\n\");\n        resultSlots = QStringLiteral(\"\\n### Methods\\n\\n\") + resultSlots;\n    }\n    if(!resultSignals.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Signals](#Q_SIGNALS)\\n\");\n        resultSignals = QStringLiteral(\"\\n### Signals\\n\\n\") + resultSignals;\n    }\n    if(isModel)\n        headers += QStringLiteral(\" * [Roles](#roles)\\n\");\n\n    result += headers + QStringLiteral(\"\\n\");\n    result += details + QStringLiteral(\"\\n\");\n    result += resultProperties + QStringLiteral(\"\\n\");\n    result += resultSlots + QStringLiteral(\"\\n\");\n    result += resultSignals + QStringLiteral(\"\\n\");\n    result += enumResults + QStringLiteral(\"\\n\");\n\n    if(!store)\n        return result;\n\n    QString path = aseman_qt_tools_destination + QStringLiteral(\"/\") + component.toLower() + QStringLiteral(\".md\");\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemNetwork::exportModel(const QString &module, int major, int minor, const QString &component)\n{\n    QString result = exportItem<T>(module, major, minor, component, false);\n    T *model = new T();\n\n    QHash<qint32,QByteArray> roleNames = model->roleNames();\n    QMap<qint32,QByteArray> rolesMap;\n    QHashIterator<qint32,QByteArray> i(roleNames);\n    while(i.hasNext())\n    {\n        i.next();\n        rolesMap[i.key()] = i.value();\n    }\n\n    result += QStringLiteral(\"\\n### Roles\\n\\n\");\n    Q_FOREACH(const QByteArray &name, rolesMap)\n        result += QStringLiteral(\" * model.<font color='#074885'>%1</font>\\n\").arg(QString::fromUtf8(name));\n\n    delete model;\n\n    QString path = aseman_qt_tools_destination + \"/\" + component.toLower() + \".md\";\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n"
  },
  {
    "path": "src/asemanqml/network/asemanqttoolsitemnetwork.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQTTOOLSITEMNETWORK_H\n#define ASEMANQTTOOLSITEMNETWORK_H\n\n#include <QtGlobal>\n#include <QString>\n\n#include <asemanqttools.h>\n\nclass QObject;\nclass QQmlEngine;\nclass QJSEngine;\nclass AsemanQtToolsItemNetwork: public AsemanQtTools\n{\npublic:\n    static void registerTypes(const char *uri, bool exportMode = false);\n    static void registerFiles(const QString &filesLocation, const char *uri);\n\n    template<typename T>\n    static int registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template<typename T>\n    static int registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template <typename T>\n    static int registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName,\n                                 QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode);\n\n    template<typename T>\n    static int registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason, bool exportMode);\n\n    static void exportDocuments(const QString &destination);\n    static class AsemanFileDownloaderQueue *getDownloaderQueue(QQmlEngine *engine);\n\nprotected:\n    template<typename T>\n    static QString exportItem(const QString &module, int major, int minor, const QString &component, bool store = true);\n    template<typename T>\n    static QString exportModel(const QString &module, int major, int minor, const QString &component);\n\n    static QString fixType(const QString &type);\n};\n\n#endif // ASEMANQTTOOLSITEMNETWORK_H\n"
  },
  {
    "path": "src/asemanqml/network/network.pri",
    "content": "INCLUDEPATH += $$PWD\nQT += core gui network qml\n\nHEADERS += \\\n    $$PWD/asemannetworkplugin.h \\\n    $$PWD/asemanqttoolsitemnetwork.h\n\nSOURCES += \\\n    $$PWD/asemannetworkplugin.cpp \\\n    $$PWD/asemanqttoolsitemnetwork.cpp\n\nstatic: !linux: !win32: DEFINES += ASEMAN_STATIC_BUILD\n\n"
  },
  {
    "path": "src/asemanqml/network/network.pro",
    "content": "TARGET  = asemanqmlnetwork\nTARGETPATH = AsemanQml/Network\nIMPORT_VERSION = 2.0\n\nQT += asemanqml asemangui asemancore asemannetwork\ninclude(network.pri)\n\nload(qml_plugin)\n\n"
  },
  {
    "path": "src/asemanqml/network/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Network 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.12\"]\n    Component {\n        name: \"AsemanFileDownloaderQueue\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Network/DownloaderQueue 2.0\"]\n        isCreatable: false\n        isSingleton: true\n        exportMetaObjectRevisions: [0]\n        Property { name: \"capacity\"; type: \"int\" }\n        Property { name: \"destination\"; type: \"string\" }\n        Signal {\n            name: \"finished\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n        }\n        Signal {\n            name: \"progressChanged\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n            Parameter { name: \"percent\"; type: \"double\" }\n        }\n        Method {\n            name: \"download\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n            Parameter { name: \"header\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"download\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"fileName\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanNetworkRequestManager\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Network/NetworkRequestManager 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"boundaryToken\"; type: \"string\" }\n        Property { name: \"ignoreSslErrors\"; type: \"bool\" }\n        Method {\n            name: \"get\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n            Parameter { name: \"ignoreEmptyValues\"; type: \"bool\" }\n        }\n        Method {\n            name: \"get\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n        }\n        Method {\n            name: \"post\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n            Parameter { name: \"ignoreEmptyValues\"; type: \"bool\" }\n        }\n        Method {\n            name: \"post\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n        }\n        Method {\n            name: \"put\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n            Parameter { name: \"ignoreEmptyValues\"; type: \"bool\" }\n        }\n        Method {\n            name: \"put\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n        }\n        Method {\n            name: \"patch\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n            Parameter { name: \"ignoreEmptyValues\"; type: \"bool\" }\n        }\n        Method {\n            name: \"patch\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n        }\n        Method {\n            name: \"deleteMethod\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n            Parameter { name: \"ignoreEmptyValues\"; type: \"bool\" }\n        }\n        Method {\n            name: \"deleteMethod\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n        }\n        Method {\n            name: \"customMethod\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"method\"; type: \"string\" }\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n            Parameter { name: \"ignoreEmptyValues\"; type: \"bool\" }\n        }\n        Method {\n            name: \"customMethod\"\n            type: \"AsemanNetworkRequestReply*\"\n            Parameter { name: \"method\"; type: \"string\" }\n            Parameter { name: \"request\"; type: \"AsemanNetworkRequestObject\"; isPointer: true }\n        }\n    }\n    Component {\n        name: \"AsemanNetworkRequestObject\"\n        defaultProperty: \"items\"\n        prototype: \"AsemanQuickObject\"\n        exports: [\"AsemanQml.Network/NetworkRequest 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"ContentType\"\n            values: {\n                \"TypeJson\": 0,\n                \"TypeForm\": 1,\n                \"TypeWWWForm\": 2,\n                \"TypeNone\": 3\n            }\n        }\n        Property { name: \"response\"; type: \"QVariant\"; isReadonly: true }\n        Property { name: \"data\"; type: \"QVariant\" }\n        Property { name: \"cachedData\"; type: \"QVariant\" }\n        Property { name: \"contentType\"; type: \"int\" }\n        Property { name: \"status\"; type: \"int\"; isReadonly: true }\n        Property { name: \"refreshing\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"error\"; type: \"string\"; isReadonly: true }\n        Property { name: \"sslErrors\"; type: \"string\"; isReadonly: true }\n        Property { name: \"ignoreKeys\"; type: \"QStringList\" }\n        Property { name: \"ignoreRegExp\"; type: \"QRegExp\" }\n        Property { name: \"cachePath\"; type: \"string\" }\n        Property { name: \"headers\"; type: \"QVariantMap\" }\n        Property { name: \"url\"; type: \"QUrl\" }\n        Property { name: \"ignoreSslErrors\"; type: \"bool\" }\n        Signal {\n            name: \"successfull\"\n            Parameter { name: \"status\"; type: \"int\" }\n        }\n        Signal {\n            name: \"unsuccessfull\"\n            Parameter { name: \"status\"; type: \"int\" }\n        }\n        Signal {\n            name: \"clientError\"\n            Parameter { name: \"status\"; type: \"int\" }\n        }\n        Signal {\n            name: \"serverError\"\n            Parameter { name: \"status\"; type: \"int\" }\n        }\n        Signal {\n            name: \"uploadProgress\"\n            Parameter { name: \"bytesSent\"; type: \"qlonglong\" }\n            Parameter { name: \"bytesTotal\"; type: \"qlonglong\" }\n        }\n        Signal {\n            name: \"downloadProgress\"\n            Parameter { name: \"bytesReceived\"; type: \"qlonglong\" }\n            Parameter { name: \"bytesTotal\"; type: \"qlonglong\" }\n        }\n        Method { name: \"toMap\"; type: \"QVariantMap\" }\n        Method {\n            name: \"fromMap\"\n            Parameter { name: \"map\"; type: \"QVariantMap\" }\n        }\n        Method { name: \"toJson\"; type: \"string\" }\n        Method {\n            name: \"fromJson\"\n            Parameter { name: \"json\"; type: \"string\" }\n        }\n        Method {\n            name: \"toFormData\"\n            type: \"string\"\n            Parameter { name: \"ignoreEmpty\"; type: \"bool\" }\n        }\n        Method { name: \"toFormData\"; type: \"string\" }\n        Method {\n            name: \"fromFormData\"\n            Parameter { name: \"formData\"; type: \"string\" }\n        }\n        Method { name: \"properties\"; type: \"QStringList\" }\n    }\n    Component {\n        name: \"AsemanNetworkRequestReply\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Network/NetworkRequestReply 2.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        Signal {\n            name: \"finished\"\n            Parameter { name: \"status\"; type: \"int\" }\n            Parameter { name: \"data\"; type: \"QByteArray\" }\n        }\n        Signal {\n            name: \"uploadProgress\"\n            Parameter { name: \"bytesSent\"; type: \"qlonglong\" }\n            Parameter { name: \"bytesTotal\"; type: \"qlonglong\" }\n        }\n        Signal {\n            name: \"downloadProgress\"\n            Parameter { name: \"bytesReceived\"; type: \"qlonglong\" }\n            Parameter { name: \"bytesTotal\"; type: \"qlonglong\" }\n        }\n        Signal {\n            name: \"error\"\n            Parameter { name: \"errorString\"; type: \"string\" }\n            Parameter { name: \"errorCode\"; type: \"QNetworkReply::NetworkError\" }\n        }\n        Method { name: \"abort\" }\n    }\n    Component {\n        name: \"AsemanQuickObject\"\n        defaultProperty: \"items\"\n        prototype: \"QObject\"\n        Property { name: \"items\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/network/qmldir",
    "content": "module AsemanQml.Network\nclassname AsemanNetworkPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlnetwork\n"
  },
  {
    "path": "src/asemanqml/sql/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemansqlplugin.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemsql.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicksqlobject.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemansqlplugin.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemsql.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquicksqlobject.cpp\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/asemanqml/sql/asemanqttoolsitemsql.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtToolsItemSql is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtToolsItemSql is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanqttoolsitemsql.h\"\n#include \"asemanquicksqlobject.h\"\n\n#include <qqml.h>\n#include <QHash>\n#include <QPointer>\n#include <QFile>\n#include <QDir>\n#include <QSet>\n#include <QQmlEngine>\n\n#define SINGLETON_PROVIDER(TYPE, FNC_NAME, NEW_CREATOR) \\\n    static QObject *FNC_NAME(QQmlEngine *engine, QJSEngine *scriptEngine) { \\\n        Q_UNUSED(engine) \\\n        Q_UNUSED(scriptEngine) \\\n        TYPE *singleton = NEW_CREATOR; \\\n        return singleton; \\\n    }\n\nstatic QStringList aseman_qt_tools_indexCache;\nstatic QString aseman_qt_tools_destination;\n\nvoid AsemanQtToolsItemSql::registerTypes(const char *uri, bool exportMode)\n{\n    static QSet<QByteArray> register_list;\n    if(register_list.contains(uri) && !exportMode)\n        return;\n\n    registerType<AsemanQuickSqlObject>(uri, 2, 0, \"SqlObject\", exportMode);\n\n    register_list.insert(uri);\n}\n\nvoid AsemanQtToolsItemSql::registerFiles(const QString &filesLocation, const char *uri)\n{\n    QFile file(filesLocation + QStringLiteral(\"/qmldir\"));\n    if(file.open(QFile::ReadOnly))\n    {\n        QStringList lines = QString::fromUtf8(file.readAll()).split(QStringLiteral(\"\\n\"), Qt::SkipEmptyParts);\n        file.close();\n\n        for(const QString &l: lines)\n        {\n            QStringList parts = l.trimmed().split(QStringLiteral(\" \"), Qt::SkipEmptyParts);\n            bool singleton = false;\n            if(parts.count() && parts.first() == \"singleton\")\n                singleton = parts.takeFirst().count();\n            if(parts.length() != 3)\n                continue;\n\n            QStringList version = parts.at(1).split(QStringLiteral(\".\"), Qt::SkipEmptyParts);\n            if(version.count() != 2)\n                continue;\n\n            if(singleton)\n                qmlRegisterSingletonType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                         uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n            else\n                qmlRegisterType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n        }\n    }\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemSql::registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemSql::registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportModel<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemSql::registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterSingletonType<T>(uri, versionMajor, versionMinor, typeName, callback);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemSql::registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(qmlName));\n    else\n        return qmlRegisterUncreatableType<T>(uri, versionMajor, versionMinor, qmlName, reason);\n    return 0;\n}\n\n\nvoid AsemanQtToolsItemSql::exportDocuments(const QString &destination)\n{\n    aseman_qt_tools_destination = destination;\n\n    QDir().mkpath(aseman_qt_tools_destination);\n    aseman_qt_tools_indexCache.clear();\n\n    AsemanQtToolsItemSql::registerTypes(\"AsemanToolsItem\", true);\n\n    QString index = QStringLiteral(\"# AsemanToolsItem Documents\\n\\n\");\n    index += QStringLiteral(\"### [Getting Started](gettingstarted.md)\\n\\n\");\n    index += QStringLiteral(\"### How to import:\\n\\n\");\n    index += QStringLiteral(\"```c++\\nimport AsemanQml.Base 2.0\\n```\\n\\nor\\n\\n\"\n             \"```c++\\nimport AsemanQml.Base 2.0 as Aseman\\n```\\n\\n\");\n    index += QStringLiteral(\"### Types\\n\\nHere are all components of the AsemanToolsItem:\\n\\n\");\n    for(const QString cmpnt: aseman_qt_tools_indexCache)\n    {\n        if(cmpnt == QStringLiteral(\"MimeData\"))\n            index += QStringLiteral(\"\\n##### Normal types\\n\\n\");\n        if(cmpnt == QStringLiteral(\"MixedListModel\"))\n            index += QStringLiteral(\"\\n##### Models\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Devices\"))\n            index += QStringLiteral(\"\\n##### Singletons\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Screen\"))\n            index += QStringLiteral(\"\\n##### Uncreatable types\\n\\n\");\n        index += QStringLiteral(\" * [%1](%2.md)\\n\").arg(cmpnt).arg(cmpnt.toLower());\n    }\n\n    QString path = aseman_qt_tools_destination + \"/start.md\";\n    aseman_qt_tools_destination.clear();\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return;\n\n    file.write(index.toUtf8());\n    file.close();\n}\n\nQString AsemanQtToolsItemSql::fixType(const QString &type)\n{\n    if(type == QStringLiteral(\"QSizeF\") || type == QStringLiteral(\"QSize\"))\n        return QStringLiteral(\"size\");\n    if(type == QStringLiteral(\"QPoint\") || type == QStringLiteral(\"QPointF\"))\n        return QStringLiteral(\"point\");\n    if(type == QStringLiteral(\"QUrl\"))\n        return QStringLiteral(\"url\");\n    if(type == QStringLiteral(\"QString\"))\n        return QStringLiteral(\"string\");\n    if(type == QStringLiteral(\"QByteArray\"))\n        return QStringLiteral(\"byte\");\n    if(type == QStringLiteral(\"bool\"))\n        return QStringLiteral(\"boolean\");\n    if(type == QStringLiteral(\"double\") || type == QStringLiteral(\"qreal\"))\n        return QStringLiteral(\"real\");\n    if(type == QStringLiteral(\"QVariant\"))\n        return QStringLiteral(\"variant\");\n    if(type == QStringLiteral(\"QJSValue\"))\n        return QStringLiteral(\"function(){[code]}\");\n    if(type == QStringLiteral(\"QVariantMap\"))\n        return QStringLiteral(\"map\");\n    if(type == QStringLiteral(\"QVariantList\"))\n        return QStringLiteral(\"list&lt;variant&gt;\");\n    if(type == QStringLiteral(\"QStringList\"))\n        return QStringLiteral(\"list&lt;string&gt;\");\n    if(type == QStringLiteral(\"QList<qint32>\"))\n        return QStringLiteral(\"list&lt;int&gt;\");\n    if(type.contains(QStringLiteral(\"*\")))\n    {\n        if(type == QStringLiteral(\"QObject*\"))\n            return QStringLiteral(\"object\");\n        if(type.contains(QStringLiteral(\"Telegram\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Telegram\"));\n            return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n        }\n        if(type.contains(QStringLiteral(\"Object\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Object\"));\n            return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                    .arg(name).arg(name.toLower());\n        }\n        if(type == QStringLiteral(\"QQmlComponent*\"))\n            return QStringLiteral(\"Component\");\n        if(type == QStringLiteral(\"QQuickItem\"))\n            return QStringLiteral(\"Item\");\n    }\n    if(type.contains(QStringLiteral(\"Telegram\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Telegram\"));\n        return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n    }\n    if(type == QStringLiteral(\"QQuickItem\"))\n        return QStringLiteral(\"Item\");\n    if(type == QStringLiteral(\"QObject\"))\n        return QStringLiteral(\"object\");\n    if(type.contains(QStringLiteral(\"Object\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Object\"));\n        return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                .arg(name).arg(name.toLower());\n    }\n    return type;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemSql::exportItem(const QString &module, int major, int minor, const QString &component, bool store)\n{\n    QString result;\n    aseman_qt_tools_indexCache << component;\n\n    QMetaObject meta = T::staticMetaObject;\n    QString inherits = fixType(QString::fromUtf8(meta.superClass()? meta.superClass()->className() : \"\"));\n    bool isModel = component.toLower().contains(QStringLiteral(\"model\"));\n\n    result += QStringLiteral(\"# %1\\n\\n\").arg(component);\n\n    QString headers;\n    headers += QStringLiteral(\" * [Component details](#component-details)\\n\");\n\n    QString details = QStringLiteral(\"\\n### Component details:\\n\\n\");\n    details += QStringLiteral(\"|Detail|Value|\\n\"\n                       \"|------|-----|\\n\");\n    details += QStringLiteral(\"|%1|%2 %3.%4|\\n\").arg(QStringLiteral(\"Import\")).arg(module).arg(major).arg(minor);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Component\")).arg(component);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"C++ class\")).arg(QString::fromUtf8(meta.className()));\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Inherits\")).arg(inherits);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Model\")).arg(QString::fromUtf8(isModel?\"Yes\":\"No\"));\n\n    QString resultProperties;\n    QStringList propertiesSignals;\n    for(int i=0; i<meta.propertyCount(); i++)\n    {\n        QMetaProperty property = meta.property(i);\n        const QString &propertyName = QString::fromUtf8(property.name());\n        const QString &propertyType = fixType(QString::fromUtf8(property.typeName()));\n        propertiesSignals << QString::fromUtf8(property.notifySignal().name());\n\n        QString text = QStringLiteral(\"* <font color='#074885'><b>%1</b></font>: %2\").arg(propertyName).arg(propertyType);\n        if(!property.isWritable())\n            text += QStringLiteral(\" (readOnly)\");\n\n        text += QStringLiteral(\"\\n\");\n        if(meta.propertyOffset()<=i)\n            resultProperties += text;\n    }\n\n    QString enumResults;\n    for(int i=meta.enumeratorOffset(); i<meta.enumeratorCount(); i++)\n    {\n        QMetaEnum enumerator = meta.enumerator(i);\n        const QString &enumName = QString::fromUtf8(enumerator.name());\n\n        enumResults += QStringLiteral(\"\\n##### %1\\n\\n\").arg(enumName);\n        enumResults += QStringLiteral(\"|Key|Value|\\n\"\n                               \"|---|-----|\\n\");\n\n        for(int j=0; j<enumerator.keyCount(); j++)\n            enumResults += QStringLiteral(\"|%1|%2|\\n\").arg(QString::fromUtf8(enumerator.key(j))).arg(enumerator.value(j));\n    }\n\n    QString resultSlots;\n    QString resultSignals;\n    for(int i=meta.methodOffset(); i<meta.methodCount(); i++)\n    {\n        QMetaMethod method = meta.method(i);\n        if(method.access() != QMetaMethod::Public)\n            continue;\n\n        const QString &methodName = QString::fromUtf8(method.name());\n        if(propertiesSignals.contains(methodName))\n            continue;\n\n        const QString &methodType = fixType(QString::fromUtf8(method.typeName()));\n\n        QString args;\n        const QList<QByteArray> &paramNames = method.parameterNames();\n        const QList<QByteArray> &paramTypes = method.parameterTypes();\n        for(int j=0; j<paramNames.count(); j++)\n        {\n            if(j != 0)\n                args += QStringLiteral(\", \");\n\n            args += fixType(QString::fromUtf8(paramTypes[j])) + QStringLiteral(\" \") + paramNames[j];\n        }\n\n        QString text = QStringLiteral(\" * %1 <font color='#074885'><b>%2</b></font>(%3)\\n\").arg(methodType).arg(methodName).arg(args);\n        switch(static_cast<int>(method.methodType()))\n        {\n        case QMetaMethod::Slot:\n            resultSlots += text;\n            break;\n        case QMetaMethod::Signal:\n            resultSignals += text;\n            break;\n        }\n    }\n\n    if(!resultProperties.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Normal Properties](#normal-properties)\\n\");\n        resultProperties = QStringLiteral(\"\\n### Normal Properties\\n\\n\") + resultProperties;\n    }\n    if(!enumResults.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Enumerator](#enumerator)\\n\");\n        enumResults = QStringLiteral(\"\\n### Enumerator\\n\\n\") + enumResults;\n    }\n    if(!resultSlots.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Methods](#methods)\\n\");\n        resultSlots = QStringLiteral(\"\\n### Methods\\n\\n\") + resultSlots;\n    }\n    if(!resultSignals.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Signals](#Q_SIGNALS)\\n\");\n        resultSignals = QStringLiteral(\"\\n### Signals\\n\\n\") + resultSignals;\n    }\n    if(isModel)\n        headers += QStringLiteral(\" * [Roles](#roles)\\n\");\n\n    result += headers + QStringLiteral(\"\\n\");\n    result += details + QStringLiteral(\"\\n\");\n    result += resultProperties + QStringLiteral(\"\\n\");\n    result += resultSlots + QStringLiteral(\"\\n\");\n    result += resultSignals + QStringLiteral(\"\\n\");\n    result += enumResults + QStringLiteral(\"\\n\");\n\n    if(!store)\n        return result;\n\n    QString path = aseman_qt_tools_destination + QStringLiteral(\"/\") + component.toLower() + QStringLiteral(\".md\");\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemSql::exportModel(const QString &module, int major, int minor, const QString &component)\n{\n    QString result = exportItem<T>(module, major, minor, component, false);\n    T *model = new T();\n\n    QHash<qint32,QByteArray> roleNames = model->roleNames();\n    QMap<qint32,QByteArray> rolesMap;\n    QHashIterator<qint32,QByteArray> i(roleNames);\n    while(i.hasNext())\n    {\n        i.next();\n        rolesMap[i.key()] = i.value();\n    }\n\n    result += QStringLiteral(\"\\n### Roles\\n\\n\");\n    Q_FOREACH(const QByteArray &name, rolesMap)\n        result += QStringLiteral(\" * model.<font color='#074885'>%1</font>\\n\").arg(QString::fromUtf8(name));\n\n    delete model;\n\n    QString path = aseman_qt_tools_destination + \"/\" + component.toLower() + \".md\";\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n"
  },
  {
    "path": "src/asemanqml/sql/asemanqttoolsitemsql.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQTTOOLSITEMSQL_H\n#define ASEMANQTTOOLSITEMSQL_H\n\n#include <QtGlobal>\n#include <QString>\n\n#include <asemanqttools.h>\n\nclass QObject;\nclass QQmlEngine;\nclass QJSEngine;\nclass AsemanQtToolsItemSql: public AsemanQtTools\n{\npublic:\n    static void registerTypes(const char *uri, bool exportMode = false);\n    static void registerFiles(const QString &filesLocation, const char *uri);\n\n    template<typename T>\n    static int registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template<typename T>\n    static int registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template <typename T>\n    static int registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName,\n                                 QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode);\n\n    template<typename T>\n    static int registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason, bool exportMode);\n\n    static void exportDocuments(const QString &destination);\n\nprotected:\n    template<typename T>\n    static QString exportItem(const QString &module, int major, int minor, const QString &component, bool store = true);\n    template<typename T>\n    static QString exportModel(const QString &module, int major, int minor, const QString &component);\n\n    static QString fixType(const QString &type);\n};\n\n#endif // ASEMANQTTOOLSITEMSQL_H\n"
  },
  {
    "path": "src/asemanqml/sql/asemanquicksqlobject.cpp",
    "content": "#include \"asemanquicksqlobject.h\"\n\n#include <QtQml>\n\nAsemanQuickSqlObject::AsemanQuickSqlObject(QObject *parent) : AsemanSqlObject(parent)\n{\n\n}\n\nvoid AsemanQuickSqlObject::queryAsync(const QString &query, const QVariantMap &binds, const QJSValue &callback)\n{\n    AsemanSqlObject::queryAsync(query, binds, [this, callback](const QVariantList &result, const QString &error){\n        QQmlEngine *engine = qmlEngine(this);\n        if (!engine)\n            return;\n\n        QJSValue method = callback;\n\n        QJSValueList args = { engine->toScriptValue(result), error };\n        method.call(args);\n    });\n}\n\nAsemanQuickSqlObject::~AsemanQuickSqlObject()\n{\n\n}\n"
  },
  {
    "path": "src/asemanqml/sql/asemanquicksqlobject.h",
    "content": "#ifndef ASEMANQUICKSQLOBJECT_H\n#define ASEMANQUICKSQLOBJECT_H\n\n#include <asemansqlobject.h>\n\n#include <QJSValue>\n\nclass AsemanQuickSqlObject : public AsemanSqlObject\n{\n    Q_OBJECT\npublic:\n    AsemanQuickSqlObject(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanQuickSqlObject();\n\npublic Q_SLOTS:\n    void queryAsync(const QString &query, const QVariantMap &binds, const QJSValue &callback);\n};\n\n#endif // ASEMANQUICKSQLOBJECT_H\n"
  },
  {
    "path": "src/asemanqml/sql/asemansqlplugin.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemansqlplugin.h\"\n#include \"asemanqttoolsitemsql.h\"\n\n#include <QDebug>\n#include <QDir>\n#include <QStringList>\n#include <QtQml>\n\n#ifdef QT_ASEMAN_EMBEDDED\nbool asemanqml_sql_plugin_registered = AsemanSqlPlugin::registerStaticTypes(\"AsemanQml.Sql\");\n#endif\n\nbool AsemanSqlPlugin::registerStaticTypes(const char *uri)\n{\n    AsemanQtToolsItemSql::registerTypes(uri);\n    AsemanQtToolsItemSql::registerFiles(QStringLiteral(\":/AsemanQml/Sql\"), uri);\n    return true;\n}\n\nvoid AsemanSqlPlugin::registerTypes(const char *uri)\n{\n    AsemanSqlPlugin::registerStaticTypes(uri);\n}\n\nvoid AsemanSqlPlugin::initializeEngine(QQmlEngine *engine, const char *uri)\n{\n    QQmlExtensionPlugin::initializeEngine(engine, uri);\n    AsemanQtTools::initializeEngine(engine, uri);\n}\n"
  },
  {
    "path": "src/asemanqml/sql/asemansqlplugin.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANSQLPLUGIN_H\n#define ASEMANSQLPLUGIN_H\n\n#include <QQmlExtensionPlugin>\n\nclass AsemanSqlPlugin : public QQmlExtensionPlugin\n{\n    Q_OBJECT\n\n#ifndef QT_ASEMAN_EMBEDDED\n    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)\n#endif\n\npublic:\n    static bool registerStaticTypes(const char *uri);\n\n    void registerTypes(const char *uri);\n    void initializeEngine(QQmlEngine *engine, const char *uri);\n};\n\n#endif // ASEMANSQLPLUGIN_H\n"
  },
  {
    "path": "src/asemanqml/sql/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Sql 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.12\"]\n    Component {\n        name: \"AsemanQuickSqlObject\"\n        prototype: \"AsemanSqlObject\"\n        exports: [\"AsemanQml.Sql/SqlObject 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Method {\n            name: \"queryAsync\"\n            Parameter { name: \"query\"; type: \"string\" }\n            Parameter { name: \"binds\"; type: \"QVariantMap\" }\n            Parameter { name: \"callback\"; type: \"QJSValue\" }\n        }\n    }\n    Component {\n        name: \"AsemanSqlObject\"\n        prototype: \"QObject\"\n        Enum {\n            name: \"DriverTypes\"\n            values: {\n                \"NoneDriver\": 0,\n                \"SQLite\": 1,\n                \"MySQL\": 2,\n                \"PostgreSQL\": 3,\n                \"ODBC\": 4,\n                \"MSSQL\": 5\n            }\n        }\n        Property { name: \"table\"; type: \"string\" }\n        Property { name: \"driver\"; type: \"QVariant\" }\n        Property { name: \"databaseName\"; type: \"string\" }\n        Property { name: \"host\"; type: \"string\" }\n        Property { name: \"port\"; type: \"int\" }\n        Property { name: \"userName\"; type: \"string\" }\n        Property { name: \"password\"; type: \"string\" }\n        Property { name: \"createQuery\"; type: \"string\" }\n        Property { name: \"primaryKeys\"; type: \"QStringList\" }\n        Property { name: \"lastError\"; type: \"string\"; isReadonly: true }\n        Method {\n            name: \"insert\"\n            type: \"int\"\n            Parameter { name: \"extra\"; type: \"string\" }\n        }\n        Method { name: \"insert\"; type: \"int\" }\n        Method {\n            name: \"update\"\n            Parameter { name: \"where\"; type: \"string\" }\n            Parameter { name: \"binds\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"update\"\n            Parameter { name: \"where\"; type: \"string\" }\n        }\n        Method { name: \"update\" }\n        Method { name: \"select\"; type: \"QVariantList\" }\n        Method {\n            name: \"select\"\n            type: \"QVariantList\"\n            Parameter { name: \"where\"; type: \"string\" }\n            Parameter { name: \"binds\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"select\"\n            type: \"QVariantList\"\n            Parameter { name: \"join\"; type: \"string\" }\n            Parameter { name: \"where\"; type: \"string\" }\n            Parameter { name: \"binds\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"select\"\n            type: \"QVariantList\"\n            Parameter { name: \"join\"; type: \"string\" }\n            Parameter { name: \"where\"; type: \"string\" }\n            Parameter { name: \"extra\"; type: \"string\" }\n            Parameter { name: \"binds\"; type: \"QVariantMap\" }\n        }\n        Method { name: \"push\" }\n        Method { name: \"fetch\" }\n        Method {\n            name: \"deleteQuery\"\n            Parameter { name: \"where\"; type: \"string\" }\n            Parameter { name: \"binds\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"deleteQuery\"\n            Parameter { name: \"where\"; type: \"string\" }\n        }\n        Method {\n            name: \"query\"\n            type: \"QVariantList\"\n            Parameter { name: \"query\"; type: \"string\" }\n            Parameter { name: \"binds\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"query\"\n            type: \"QVariantList\"\n            Parameter { name: \"query\"; type: \"string\" }\n        }\n        Method { name: \"create\" }\n        Method { name: \"drop\" }\n        Method { name: \"getData\"; type: \"QVariantMap\" }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/sql/qmldir",
    "content": "module AsemanQml.Sql\nclassname AsemanSqlPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlsql\n"
  },
  {
    "path": "src/asemanqml/sql/sql.pri",
    "content": "INCLUDEPATH += $$PWD\nQT += core gui qml\n\nqtHaveModule(sql): SUBDIRS += sql\n\nHEADERS += \\\n    $$PWD/asemansqlplugin.h \\\n    $$PWD/asemanqttoolsitemsql.h \\\n    $$PWD/asemanquicksqlobject.h\n\nSOURCES += \\\n    $$PWD/asemansqlplugin.cpp \\\n    $$PWD/asemanqttoolsitemsql.cpp \\\n    $$PWD/asemanquicksqlobject.cpp\n\nstatic: !linux: !win32: DEFINES += ASEMAN_STATIC_BUILD\n\n"
  },
  {
    "path": "src/asemanqml/sql/sql.pro",
    "content": "TARGET  = asemanqmlsql\nTARGETPATH = AsemanQml/Sql\nIMPORT_VERSION = 2.0\n\nQT += asemanqml asemangui asemancore asemansql\n\ninclude(sql.pri)\n\nload(qml_plugin)\n\n"
  },
  {
    "path": "src/asemanqml/viewport/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanviewportplugin.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemviewport.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanviewport.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanviewportcontroller.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanviewportcontrollerroute.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanviewportitem.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanabstractviewporttype.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanviewportplugin.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemviewport.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanviewport.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanviewportcontroller.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanviewportcontrollerroute.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanviewportitem.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanabstractviewporttype.cpp\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/qmake_asemanviewport.qrc\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/AbstractViewportType.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Viewport 2.0\n\nAbstractViewportTypeCore {\n    id: item\n    anchors.fill: parent\n\n    property ListObject list\n\n    property bool fillForeground: false\n\n    property int index\n    property int count\n    property string openedType\n    property real ratio: open? 1 : 0\n\n    property alias background: background\n    property alias backgroundScene: backgroundScene\n    property alias foreground: foreground\n    property alias foregroundScene: foregroundScene\n\n    onOpenChanged: {\n        if (open)\n            BackHandler.pushHandler(this, back)\n        else\n            BackHandler.removeHandler(this)\n    }\n    onRatioChanged: if (ratio <= 0 && !open) { foregroundItem.destroy(); item.destroy();}\n\n    RoundedItem {\n        id: background\n        width: parent.width\n        height: parent.height\n\n        Rectangle {\n            id: backgroundScene\n            anchors.fill: parent\n        }\n    }\n\n    RoundedItem {\n        id: foreground\n        width: parent.width\n        height: parent.height\n\n        Rectangle {\n            id: foregroundScene\n            anchors.fill: parent\n        }\n    }\n\n    function back() {\n        if (!item.blockBackIsNull && item.blockBack)\n            return false;\n\n        open = false\n        return true;\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/AndroidActivityViewport.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\n\nAbstractViewportType {\n    id: item\n\n    fillForeground: true\n    ratio: openRatio * mouseRatio\n\n    background.scale: 1 - (realRatio * 0.05)\n    background.transformOrigin: Item.Bottom\n    background.clip: true\n\n    foreground.z: 10\n    foreground.y: height * (1-ratio)\n    foreground.height: item.height\n    foreground.parent: dragArea\n\n    property real openRatio: open? 1 : 0\n    property real mouseRatio: 1\n    readonly property real realRatio: 1 - foreground.y / dragArea.height\n\n    Behavior on openRatio {\n        NumberAnimation { easing.type: Easing.OutCubic; duration: 350 }\n    }\n\n    Rectangle {\n        anchors.fill: parent\n        z: -1\n        color: \"#000\"\n    }\n\n    Rectangle {\n        parent: item.backgroundScene\n        anchors.fill: parent\n        z: 100\n        color: \"#000\"\n        opacity: item.ratio * 0.3\n    }\n\n    NumberAnimation {\n        id: mouseRatioAnim\n        target: item\n        property: \"mouseRatio\"\n        easing.type: Easing.OutCubic\n        duration: 300\n    }\n\n    MouseArea {\n        id: dragArea\n        anchors.left: parent.left\n        anchors.right: parent.right\n        height: item.gestureWidthIsNull? item.height : item.gestureWidth\n        drag {\n            target: item.foreground\n            axis: Drag.YAxis\n            minimumY: 0\n            maximumY: item.height - 10\n            filterChildren: true\n            onActiveChanged: {\n                if (dragArea.drag.active)\n                    return;\n\n                mouseRatio = realRatio\n                foreground.y = Qt.binding( function() { return height * (1-ratio); } )\n                if (realRatio < 0.7) {\n                    open = false\n                } else {\n                    mouseRatioAnim.from = realRatio\n                    mouseRatioAnim.to = 1\n                    mouseRatioAnim.start()\n                }\n            }\n        }\n\n        MouseArea {\n            anchors.fill: parent\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/AndroidBottomDrawerViewport.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\n\nAbstractViewportType {\n    id: item\n\n    foreground.height: foregroundItem? foregroundItem.height : item.height\n    foreground.z: 10\n    foreground.parent: dragArea\n    foregroundScene.color: \"transparent\"\n\n    property real openRatio: open? 1 : 0\n\n    Behavior on ratio {\n        NumberAnimation { easing.type: Easing.OutCubic; duration: 350 }\n    }\n\n    Rectangle {\n        anchors.fill: item.background\n        color: \"#000\"\n        opacity: item.ratio * 0.3\n    }\n\n    NumberAnimation {\n        id: foregroundAnim\n        target: foreground\n        property: \"y\"\n        easing.type: Easing.OutCubic\n        duration: 300\n    }\n\n    MouseArea {\n        width: item.foreground.width\n        height: item.height - dragArea.y - item.foreground.y\n        anchors.bottom: parent.bottom\n        z: 5\n        clip: true\n    }\n\n    MouseArea {\n        anchors.fill: parent\n        hoverEnabled: true\n    }\n\n    MouseArea {\n        anchors.top: parent.top\n        anchors.bottom: dragArea.top\n        anchors.left: parent.left\n        anchors.right: parent.right\n        visible: item.touchToCloseIsNull || item.touchToClose\n        onClicked: open = false\n    }\n\n    MouseArea {\n        id: dragArea\n        anchors.left: parent.left\n        anchors.right: parent.right\n        height: item.gestureWidthIsNull? item.foreground.height : item.gestureWidth\n        y: parent.height - item.foreground.height * item.ratio\n        z: 10\n        drag {\n            target: item.foreground\n            axis: Drag.YAxis\n            minimumY: 0\n            maximumY: item.height - 10\n            filterChildren: true\n            onActiveChanged: {\n                if (dragArea.drag.active)\n                    return;\n\n                var ratio = 1 - foreground.y / dragArea.height\n                if (ratio < 0.7) {\n                    open = false\n                } else {\n                    foregroundAnim.from = foreground.y\n                    foregroundAnim.to = 0\n                    foregroundAnim.start()\n                }\n            }\n        }\n\n        MouseArea {\n            anchors.fill: parent\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/AndroidDefaultPagesViewport.qml",
    "content": "import QtQuick 2.0\n\nAbstractViewportType {\n    id: item\n\n    fillForeground: true\n\n    foreground.y: height * (1-ratio) * 0.2\n    foreground.opacity: ratio\n\n    Behavior on ratio {\n        NumberAnimation { easing.type: Easing.OutCubic; duration: 250 }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/AndroidDialogViewport.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.GraphicalEffects 2.0\nimport AsemanQml.Modern 2.0\n\nAbstractViewportType {\n    id: item\n\n    foreground.height: foregroundItem? foregroundItem.height : item.height\n    foreground.width: foregroundItem? foregroundItem.width : item.width\n    foreground.scale: 0.8 + ratio * 0.2\n    foreground.opacity: ratio\n    foreground.anchors.centerIn: foreground.parent\n    foreground.z: 10\n\n    Behavior on ratio {\n        NumberAnimation { easing.type: Easing.OutCubic; duration: 250 }\n    }\n\n    Rectangle {\n        anchors.fill: item.background\n        color: \"#000\"\n        opacity: item.ratio * 0.3\n        visible: item.ratio\n\n        MouseArea {\n            anchors.fill: parent\n            hoverEnabled: true\n            onClicked: if (item.touchToCloseIsNull || item.touchToClose) item.open = false\n        }\n    }\n\n    FastRectengleShadow {\n        scale: item.foreground.scale\n        anchors.fill: item.foreground\n        z: 5\n        radius: 32\n        opacity: 0.6 * item.ratio\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/IOSBottomDrawerViewport.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.GraphicalEffects 2.0\nimport AsemanQml.Base 2.0\n\nAbstractViewportType {\n    id: item\n\n    foreground.x: foregroundItem? -foregroundItem.x : 0\n    foreground.height: foregroundItem? foregroundItem.height : item.height\n    foreground.z: 10\n    foreground.parent: dragArea\n    foregroundScene.color: \"transparent\"\n\n    property real openRatio: open? 1 : 0\n\n    Behavior on ratio {\n        NumberAnimation { easing.type: Easing.OutCubic; duration: 350 }\n    }\n\n    Rectangle {\n        anchors.fill: item.background\n        color: \"#000\"\n        opacity: item.ratio * 0.3\n    }\n\n    NumberAnimation {\n        id: foregroundAnim\n        target: foreground\n        property: \"y\"\n        easing.type: Easing.OutCubic\n        duration: 300\n    }\n\n    Item {\n        width: foregroundItem? foregroundItem.width : item.width\n        x: foregroundItem? foregroundItem.x : 0\n        height: item.height - dragArea.y - item.foreground.y\n        anchors.bottom: parent.bottom\n        z: 5\n        clip: true\n\n        FastBlur {\n            x: foregroundItem? -foregroundItem.x : 0\n            anchors.bottom: parent.bottom\n            height: item.background.height\n            width: item.background.width\n            radius: 64\n            cached: true\n            source: item.background\n        }\n    }\n\n    MouseArea {\n        anchors.fill: parent\n        hoverEnabled: true\n    }\n\n    MouseArea {\n        anchors.fill: parent\n        visible: item.touchToCloseIsNull || item.touchToClose\n        onClicked: open = false\n    }\n\n    MouseArea {\n        id: dragArea\n        width: foregroundItem? foregroundItem.width : item.width\n        x: foregroundItem? foregroundItem.x : 0\n        height: item.gestureWidthIsNull? item.foreground.height : item.gestureWidth\n        y: parent.height - item.foreground.height * item.ratio\n        z: 10\n        drag {\n            target: item.foreground\n            axis: Drag.YAxis\n            minimumY: 0\n            maximumY: item.height - 10\n            filterChildren: true\n            onActiveChanged: {\n                if (dragArea.drag.active)\n                    return;\n\n                var ratio = 1 - foreground.y / dragArea.height\n                if (ratio < 0.7) {\n                    open = false\n                } else {\n                    foregroundAnim.from = foreground.y\n                    foregroundAnim.to = 0\n                    foregroundAnim.start()\n                }\n            }\n        }\n\n        MouseArea {\n            anchors.fill: parent\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/IOSContextMenuViewport.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.GraphicalEffects 2.0\nimport AsemanQml.Base 2.0\n\nAbstractViewportType {\n    id: item\n\n    background.transform: Scale {\n        origin.x: listener.result.x\n        origin.y: listener.result.y\n        xScale: 1 + ratio * 0.1\n        yScale: 1 + ratio * 0.1\n    }\n\n    foreground.transform: Scale {\n        origin.x: listener.result.x\n        origin.y: listener.result.y\n        xScale: 0.5 + ratio * 0.5\n        yScale: 0.5 + ratio * 0.5\n    }\n    foreground.opacity: ratio\n    foreground.z: 10\n    foregroundScene.color: \"transparent\"\n\n    PointMapListener {\n        id: listener\n        source: item.foregroundItem\n        dest: item\n        x: item.typeTransformOriginIsNull? 0 : item.typeTransformOrigin.x\n        y: item.typeTransformOriginIsNull? 0 : item.typeTransformOrigin.y\n    }\n\n    Behavior on ratio {\n        NumberAnimation { easing.type: Easing.OutCubic; duration: 250 }\n    }\n\n    FastBlur {\n        anchors.fill: parent\n        radius: 64\n        cached: true\n        source: item.background\n        scale: item.background.scale\n        opacity: ratio\n        transform: Scale {\n            origin.x: listener.result.x\n            origin.y: listener.result.y\n            xScale: 1 + ratio * 0.1\n            yScale: 1 + ratio * 0.1\n        }\n\n        Rectangle {\n            anchors.fill: parent\n            opacity: 0.3\n            color: \"#888\"\n        }\n\n        MouseArea {\n            anchors.fill: parent\n            hoverEnabled: true\n            onClicked: if (item.touchToCloseIsNull || item.touchToClose) item.open = false\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/IOSDialogViewport.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.GraphicalEffects 2.0\nimport AsemanQml.Base 2.0\n\nAbstractViewportType {\n    id: item\n\n    foreground.height: foregroundItem? foregroundItem.height : item.height\n    foreground.width: foregroundItem? foregroundItem.width : item.width\n    foreground.scale: item.open? 1.1 - ratio * 0.1 : 1\n    foreground.opacity: ratio\n    foreground.anchors.centerIn: foreground.parent\n    foreground.z: 10\n    foreground.radius: 10 * Devices.density\n    foregroundScene.color: \"transparent\"\n\n    Behavior on ratio {\n        NumberAnimation { easing.type: Easing.OutCubic; duration: 250 }\n    }\n\n    Rectangle {\n        anchors.fill: item.background\n        color: \"#000\"\n        opacity: item.ratio * 0.2\n        visible: item.ratio\n\n        MouseArea {\n            anchors.fill: parent\n            hoverEnabled: true\n            onClicked: if (item.touchToCloseIsNull || item.touchToClose) item.open = false\n        }\n    }\n\n    RoundedItem {\n        anchors.centerIn: item.foreground\n        width: item.foreground.width\n        height: item.foreground.height\n        scale: item.foreground.scale\n        z: 8\n        opacity: item.ratio\n        radius: item.foreground.radius\n        clip: true\n\n        FastBlur {\n            anchors.centerIn: parent\n            height: item.background.height\n            width: item.background.width\n            radius: 64\n            cached: true\n            source: item.background\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/IOSNormalViewport.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\n\nAbstractViewportType {\n    id: item\n\n    fillForeground: true\n    ratio: openRatio * mouseRatio\n\n    background.x: LayoutMirroring.enabled? (foreground.x + item.width)/2 : (foreground.x - item.width)/2\n\n    foreground.parent: dragScene\n    foreground.anchors.top: foreground.parent.top\n    foreground.anchors.bottom: foreground.parent.bottom\n    foreground.x: foregroundX\n\n    property real openRatio: open? 1 : 0\n    property real mouseRatio: 1\n    readonly property real foregroundX: (LayoutMirroring.enabled? -width : width) * (1-ratio)\n\n    Behavior on openRatio {\n        NumberAnimation { easing.type: Easing.OutCubic; duration: 250 }\n    }\n\n    Rectangle {\n        parent: item.backgroundScene\n        anchors.fill: parent\n        z: 100\n        color: \"#000\"\n        opacity: item.openRatio * 0.4\n    }\n\n    NumberAnimation {\n        id: mouseRatioAnim\n        target: item\n        property: \"mouseRatio\"\n        easing.type: Easing.OutCubic\n        duration: 300\n    }\n\n    MouseArea {\n        id: dragArea\n        anchors.top: parent.top\n        anchors.bottom: parent.bottom\n        anchors.left: parent.left\n        width: item.gestureWidthIsNull? parent.width : item.gestureWidth\n        drag {\n            target: item.foreground\n            axis: Drag.XAxis\n            minimumX: LayoutMirroring.enabled? -item.width + 10 : 0\n            maximumX: LayoutMirroring.enabled? 0 : item.width - 10\n            filterChildren: true\n            onActiveChanged: {\n                if (dragArea.drag.active)\n                    return;\n\n                mouseRatio = (LayoutMirroring.enabled? item.width + foreground.x : item.width - foreground.x) / item.width\n                foreground.x = Qt.binding( function(){ return foregroundX } )\n\n                if (mouseRatio < 0.7) {\n                    open = false\n                } else {\n                    mouseRatioAnim.from = mouseRatio\n                    mouseRatioAnim.to = 1\n                    mouseRatioAnim.start()\n                }\n            }\n        }\n\n        MouseArea {\n            anchors.fill: parent\n        }\n\n        Item {\n            id: dragScene\n            width: item.width\n            anchors.top: parent.top\n            anchors.bottom: parent.bottom\n            anchors.left: parent.left\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/IOSPopupViewport.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\n\nAbstractViewportType {\n    id: item\n\n    fillForeground: true\n    ratio: openRatio * mouseRatio\n\n    background.scale: Math.min(1, iosBelowIndex < 2 && !tabletMode? 1 - (realRatio * ((topPadSize -  background.radius) * 2) / height) : 1)\n    background.transformOrigin: Item.Center\n    background.radius: tabletMode? 0 : 10 * Devices.density\n\n    foreground.z: 10\n    foreground.y: height * (1-ratio)\n    foreground.parent: dragArea\n    foreground.height: foregroundHeight + foreground.radius\n    foreground.radius: 10 * Devices.density\n    foreground.transformOrigin: Item.Center\n    foreground.scale: 1 - foregroundScale * ((topPadSize -  background.radius) * 2) / height\n    foregroundScene.anchors.topMargin: -Devices.statusBarHeight\n    foregroundScene.anchors.bottomMargin: foreground.radius\n\n    readonly property real topPadSize: Math.max(20 * Devices.density, Devices.statusBarHeight + 20 * Devices.density)\n    property real openRatio: open? 1 : 0\n    property real mouseRatio: 1\n    readonly property real foregroundScale: nextItem? nextItem.realRatio : 0\n    readonly property real foregroundHeight: item.height - topPadSize\n    readonly property real realRatio: 1 - foreground.y / foreground.height\n    readonly property bool tabletMode: !item.maximumWidthIsNull && item.maximumWidth != 0\n\n    readonly property bool isIOSPopup: true\n    readonly property Item nextItem: {\n        if (index==0 || !list || list.count <= index)\n            return null;\n        if (list.at(index).isIOSPopup)\n            return list.at(index);\n        return null;\n    }\n    readonly property int iosBelowIndex: {\n        if (index==0 || !list || list.count === 0)\n            return 0;\n\n        var start = Math.min(index, list.count-1);\n        for (var i=start; i>=0; i--)\n            if (!list.at(i).isIOSPopup)\n                return start - i - 1;\n\n        return index;\n    }\n\n    Behavior on openRatio {\n        NumberAnimation { easing.type: Easing.OutCubic; duration: 350 }\n    }\n\n    Rectangle {\n        anchors.fill: parent\n        z: -1\n        color: \"#000\"\n    }\n\n    Rectangle {\n        parent: item.backgroundScene\n        anchors.fill: parent\n        z: 100\n        color: \"#000\"\n        opacity: item.ratio * 0.3\n    }\n\n    NumberAnimation {\n        id: mouseRatioAnim\n        target: item\n        property: \"mouseRatio\"\n        easing.type: Easing.OutCubic\n        duration: 300\n    }\n\n    MouseArea {\n        anchors.fill: parent\n        hoverEnabled: true\n    }\n\n    MouseArea {\n        anchors.fill: parent\n        visible: item.touchToCloseIsNull || item.touchToClose\n        onClicked: open = false\n    }\n\n    MouseArea {\n        id: dragArea\n        width: tabletMode? item.maximumWidth : item.width\n        x: Math.floor(item.width/2 - foreground.width/2)\n        y: Math.floor(topPadSize * (1 - foregroundScale))\n        height: item.gestureWidthIsNull? (item.height - topPadSize) : item.gestureWidth\n        drag {\n            target: item.foreground\n            axis: Drag.YAxis\n            minimumY: 0\n            maximumY: item.height - 10\n            filterChildren: true\n            onActiveChanged: {\n                if (dragArea.drag.active)\n                    return;\n\n                mouseRatio = realRatio\n                foreground.y = Qt.binding( function() { return foregroundHeight * (1-ratio); } )\n                if (realRatio < 0.7) {\n                    open = false\n                } else {\n                    mouseRatioAnim.from = realRatio\n                    mouseRatioAnim.to = 1\n                    mouseRatioAnim.start()\n                }\n            }\n        }\n\n        MouseArea {\n            anchors.fill: parent\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/NoneViewport.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\n\nAbstractViewportType {\n    id: item\n    backgroundScene.color: \"transparent\"\n    foregroundScene.color: \"transparent\"\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/SplitedViewport.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\n\nAbstractViewportType {\n    id: item\n\n    fillForeground: true\n    ratio: openRatio * mouseRatio\n\n    background.x: LayoutMirroring.enabled? (foreground.x + item.width)/2 : (foreground.x - item.width)/2\n\n    foreground.parent: dragScene\n    foreground.anchors.top: foreground.parent.top\n    foreground.anchors.bottom: foreground.parent.bottom\n    foreground.x: foregroundX\n\n    property real openRatio: open? 1 : 0\n    property real mouseRatio: 1\n    readonly property real foregroundX: (LayoutMirroring.enabled? -width : width) * (1-ratio)\n\n    Behavior on openRatio {\n        NumberAnimation { easing.type: Easing.OutCubic; duration: 250 }\n    }\n\n    Rectangle {\n        parent: item.backgroundScene\n        anchors.fill: parent\n        z: 100\n        color: \"#000\"\n        opacity: item.openRatio * 0.4\n    }\n\n    NumberAnimation {\n        id: mouseRatioAnim\n        target: item\n        property: \"mouseRatio\"\n        easing.type: Easing.OutCubic\n        duration: 300\n    }\n\n    MouseArea {\n        id: dragArea\n        anchors.top: parent.top\n        anchors.bottom: parent.bottom\n        anchors.left: parent.left\n        width: item.gestureWidthIsNull? parent.width : item.gestureWidth\n        drag {\n            target: item.foreground\n            axis: Drag.XAxis\n            minimumX: LayoutMirroring.enabled? -item.width + 10 : 0\n            maximumX: LayoutMirroring.enabled? 0 : item.width - 10\n            filterChildren: true\n            onActiveChanged: {\n                if (dragArea.drag.active)\n                    return;\n\n                mouseRatio = (LayoutMirroring.enabled? item.width + foreground.x : item.width - foreground.x) / item.width\n                foreground.x = Qt.binding( function(){ return foregroundX } )\n\n                if (mouseRatio < 0.7) {\n                    open = false\n                } else {\n                    mouseRatioAnim.from = mouseRatio\n                    mouseRatioAnim.to = 1\n                    mouseRatioAnim.start()\n                }\n            }\n        }\n\n        MouseArea {\n            anchors.fill: parent\n        }\n\n        Item {\n            id: dragScene\n            width: item.width\n            anchors.top: parent.top\n            anchors.bottom: parent.bottom\n            anchors.left: parent.left\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/Viewport.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Viewport 2.0\n\nViewportCore {\n    id: viewportCore\n\n    property bool androidStyle: Devices.isAndroid\n    property Item mainItem\n    property alias count: list.count\n    property alias list: list.list\n\n    readonly property Item currentItem: list.count? list.last().foregroundItem : mainItem\n    readonly property string currentType: list.count? list.last().openedType : \"\"\n\n    onMainItemChanged: {\n        if (!mainItem)\n            return;\n\n        mainItem.parent = scene;\n    }\n\n    ListObject { id: list }\n\n    Item {\n        id: scene\n        anchors.fill: parent\n        clip: true\n    }\n\n    function append(component, properties, type) {\n        var cmp = getComponent(type);\n        if (!cmp) {\n            var typeUrl = (type + \"\");\n            if (typeUrl.slice(typeUrl.length-4) == \".qml\")\n                cmp = Qt.createComponent(Qt.resolvedUrl(typeUrl));\n            if (!cmp) {\n                console.debug(\"There is no \\\"\" + type + \"\\\" viewportType. Available types are \", keys)\n                return null\n            }\n        }\n\n        var comObj;\n        if ((cmp + \"\").length && cmp.status === undefined) {\n            comObj = Qt.createComponent(Qt.resolvedUrl(cmp));\n        } else {\n            comObj = cmp\n        }\n        if (comObj.status === Component.Error) {\n            console.debug(comObj.errorString().trim())\n            return null\n        }\n\n        var lastItem = (list.count? list.last() : mainItem );\n        var typeObj = comObj.createObject(scene, {\"list\": list});\n        typeObj.open = true;\n        typeObj.index = Qt.binding( function() { return list.count? list.indexOf(typeObj) + 1 : 0 } )\n        typeObj.count = Qt.binding( function() { return list.count } )\n        typeObj.ratioChanged.connect( function(){\n            if (typeObj.open || typeObj.ratio > 0)\n                return;\n\n            var last = typeObj.backgroundItem\n            var idx = list.indexOf(typeObj)\n            if (idx >= 0 && idx < list.count-1) {\n                var nextItem = list.at(idx+1);\n\n                last.parent = nextItem.backgroundScene;\n                nextItem.backgroundItem = last\n            } else {\n                last.parent = scene;\n            }\n\n            list.removeAll(typeObj);\n        });\n\n        lastItem.parent = typeObj.backgroundScene;\n\n        if ((component + \"\").length && component.status === undefined) {\n            component = Qt.createComponent(Qt.resolvedUrl(component));\n        }\n        if (component.status === Component.Error) {\n            console.debug(component.errorString().trim())\n            return null\n        }\n\n        var obj = properties? component.createObject(typeObj.foregroundScene, properties) : component.createObject(typeObj.foregroundScene);\n        if (typeObj.fillForeground)\n            obj.anchors.fill = obj.parent\n\n        typeObj.foregroundItem = obj\n        typeObj.backgroundItem = lastItem\n        typeObj.openedType = type\n\n        list.append(typeObj);\n\n        typeObj.viewport = viewportCore\n        return obj\n    }\n\n    function closeLast() {\n        if (list.count === 0)\n            return;\n\n        list.last().open = false;\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/ViewportController.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Viewport 2.0\n\nViewportControllerCore {\n    function trigger(url, properties, viewport) {\n        if (properties === undefined)\n            properties = {};\n        if (viewport === undefined)\n            viewport = null;\n\n        var map = lookup(url, properties, viewport)\n        return map.viewport.append(map.component, map.properties, map.type)\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/ViewportPage.qml",
    "content": "import QtQuick 2.0\nimport QtQuick.Controls 2.3\n\nItem {\n    id: rootItem\n\n    property alias header: page.header\n    property alias title: page.title\n\n    default property alias pageData: page.data\n\n    Page {\n        id: page\n        anchors.fill: parent\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/Viewport/qmldir",
    "content": "module AsemanQml.Viewport\nAbstractViewportType 2.0 AbstractViewportType.qml\nAndroidActivityViewport 2.0 AndroidActivityViewport.qml\nAndroidBottomDrawerViewport 2.0 AndroidBottomDrawerViewport.qml\nAndroidDefaultPagesViewport 2.0 AndroidDefaultPagesViewport.qml\nAndroidDialogViewport 2.0 AndroidDialogViewport.qml\nIOSBottomDrawerViewport 2.0 IOSBottomDrawerViewport.qml\nIOSDialogViewport 2.0 IOSDialogViewport.qml\nIOSNormalViewport 2.0 IOSNormalViewport.qml\nSplitedViewport 2.0 SplitedViewport.qml\nIOSPopupViewport 2.0 IOSPopupViewport.qml\nIOSContextMenuViewport 2.0 IOSContextMenuViewport.qml\nNoneViewport 2.0 NoneViewport.qml\nViewport 2.0 Viewport.qml\nViewportPage 2.0 ViewportPage.qml\nViewportController 2.0 ViewportController.qml\n"
  },
  {
    "path": "src/asemanqml/viewport/asemanabstractviewporttype.cpp",
    "content": "#include \"asemanabstractviewporttype.h\"\n#include \"asemanviewport.h\"\n\n#include <QPointer>\n\nclass AsemanAbstractViewportType::Private\n{\npublic:\n    QPointer<QQuickItem> foregroundItem;\n    QPointer<QQuickItem> backgroundItem;\n    QPointer<AsemanViewport> viewport;\n    QPointer<AsemanViewportTypeAttechedProperty> foregroundAttachedType;\n    bool open;\n};\n\nAsemanAbstractViewportType::AsemanAbstractViewportType(QQuickItem *parent) :\n    QQuickItem(parent)\n{\n    p = new Private;\n    p->open = false;\n}\n\nQQuickItem *AsemanAbstractViewportType::foregroundItem() const\n{\n    return p->foregroundItem;\n}\n\nvoid AsemanAbstractViewportType::setForegroundItem(QQuickItem *foregroundItem)\n{\n    if (p->foregroundItem == foregroundItem)\n        return;\n\n    if (p->foregroundAttachedType)\n    {\n        disconnect(p->foregroundAttachedType, &AsemanViewportTypeAttechedProperty::gestureWidthChanged, this, &AsemanAbstractViewportType::gestureWidthChanged);\n        disconnect(p->foregroundAttachedType, &AsemanViewportTypeAttechedProperty::maximumWidthChanged, this, &AsemanAbstractViewportType::maximumWidthChanged);\n        disconnect(p->foregroundAttachedType, &AsemanViewportTypeAttechedProperty::touchToCloseChanged, this, &AsemanAbstractViewportType::touchToCloseChanged);\n        disconnect(p->foregroundAttachedType, &AsemanViewportTypeAttechedProperty::blockBackChanged, this, &AsemanAbstractViewportType::blockBackChanged);\n        disconnect(p->foregroundAttachedType, &AsemanViewportTypeAttechedProperty::typeTransformOriginChanged, this, &AsemanAbstractViewportType::typeTransformOriginChanged);\n        disconnect(p->foregroundAttachedType, &AsemanViewportTypeAttechedProperty::openChanged, this, &AsemanAbstractViewportType::openChanged);\n        disconnect(p->foregroundAttachedType, &AsemanViewportTypeAttechedProperty::sourceObjectChanged, this, &AsemanAbstractViewportType::sourceObjectChanged);\n    }\n\n    p->foregroundItem = foregroundItem;\n    p->foregroundAttachedType = qobject_cast<AsemanViewportTypeAttechedProperty*>(qmlAttachedPropertiesObject<AsemanViewportType>(foregroundItem));\n\n    if (p->foregroundAttachedType)\n    {\n        connect(p->foregroundAttachedType, &AsemanViewportTypeAttechedProperty::gestureWidthChanged, this, &AsemanAbstractViewportType::gestureWidthChanged);\n        connect(p->foregroundAttachedType, &AsemanViewportTypeAttechedProperty::maximumWidthChanged, this, &AsemanAbstractViewportType::maximumWidthChanged);\n        connect(p->foregroundAttachedType, &AsemanViewportTypeAttechedProperty::touchToCloseChanged, this, &AsemanAbstractViewportType::touchToCloseChanged);\n        connect(p->foregroundAttachedType, &AsemanViewportTypeAttechedProperty::blockBackChanged, this, &AsemanAbstractViewportType::blockBackChanged);\n        connect(p->foregroundAttachedType, &AsemanViewportTypeAttechedProperty::typeTransformOriginChanged, this, &AsemanAbstractViewportType::typeTransformOriginChanged);\n        connect(p->foregroundAttachedType, &AsemanViewportTypeAttechedProperty::openChanged, this, &AsemanAbstractViewportType::openChanged);\n        connect(p->foregroundAttachedType, &AsemanViewportTypeAttechedProperty::sourceObjectChanged, this, &AsemanAbstractViewportType::sourceObjectChanged);\n    }\n\n    Q_EMIT foregroundItemChanged();\n    Q_EMIT gestureWidthChanged();\n    Q_EMIT maximumWidthChanged();\n    Q_EMIT touchToCloseChanged();\n    Q_EMIT openChanged();\n    Q_EMIT blockBackChanged();\n    Q_EMIT typeTransformOriginChanged();\n    Q_EMIT sourceObjectChanged();\n}\n\nQQuickItem *AsemanAbstractViewportType::backgroundItem() const\n{\n    return p->backgroundItem;\n}\n\nvoid AsemanAbstractViewportType::setBackgroundItem(QQuickItem *backgroundItem)\n{\n    if (p->backgroundItem == backgroundItem)\n        return;\n\n    p->backgroundItem = backgroundItem;\n    Q_EMIT backgroundItemChanged();\n}\n\nAsemanViewport *AsemanAbstractViewportType::viewport() const\n{\n    return p->viewport;\n}\n\nvoid AsemanAbstractViewportType::setViewport(AsemanViewport *viewport)\n{\n    if (p->viewport == viewport)\n        return;\n\n    p->viewport = viewport;\n    Q_EMIT viewportChanged();\n}\n\nqreal AsemanAbstractViewportType::gestureWidth() const\n{\n    return p->foregroundAttachedType? p->foregroundAttachedType->gestureWidth() : 0;\n}\n\nbool AsemanAbstractViewportType::gestureWidthIsNull() const\n{\n    if (!p->foregroundAttachedType)\n        return false;\n\n    bool isNull;\n    p->foregroundAttachedType->gestureWidth(&isNull);\n    return isNull;\n}\n\nvoid AsemanAbstractViewportType::setGestureWidth(qreal gestureWidth)\n{\n    if (!p->foregroundAttachedType)\n        return;\n\n    p->foregroundAttachedType->setGestureWidth(gestureWidth);\n}\n\nqreal AsemanAbstractViewportType::maximumWidth() const\n{\n    return p->foregroundAttachedType? p->foregroundAttachedType->maximumWidth() : 0;\n}\n\nbool AsemanAbstractViewportType::maximumWidthIsNull() const\n{\n    if (!p->foregroundAttachedType)\n        return false;\n\n    bool isNull;\n    p->foregroundAttachedType->maximumWidth(&isNull);\n    return isNull;\n}\n\nvoid AsemanAbstractViewportType::setMaximumWidth(qreal maximumWidth)\n{\n    if (!p->foregroundAttachedType)\n        return;\n\n    p->foregroundAttachedType->setMaximumWidth(maximumWidth);\n}\n\nQPointF AsemanAbstractViewportType::typeTransformOrigin() const\n{\n    return p->foregroundAttachedType? p->foregroundAttachedType->typeTransformOrigin() : QPointF();\n}\n\nbool AsemanAbstractViewportType::typeTransformOriginIsNull() const\n{\n    if (!p->foregroundAttachedType)\n        return false;\n\n    bool isNull;\n    p->foregroundAttachedType->typeTransformOrigin(&isNull);\n    return isNull;\n}\n\nvoid AsemanAbstractViewportType::setTypeTransformOrigin(const QPointF &typeTransformOrigin)\n{\n    if (!p->foregroundAttachedType)\n        return;\n\n    p->foregroundAttachedType->setTypeTransformOrigin(typeTransformOrigin);\n}\n\nbool AsemanAbstractViewportType::touchToClose() const\n{\n    return p->foregroundAttachedType? p->foregroundAttachedType->touchToClose() : false;\n}\n\nbool AsemanAbstractViewportType::touchToCloseIsNull() const\n{\n    if (!p->foregroundAttachedType)\n        return false;\n\n    bool isNull;\n    p->foregroundAttachedType->touchToClose(&isNull);\n    return isNull;\n}\n\nvoid AsemanAbstractViewportType::setTouchToClose(bool touchToClose)\n{\n    if (!p->foregroundAttachedType)\n        return;\n\n    p->foregroundAttachedType->setTouchToClose(touchToClose);\n}\n\nbool AsemanAbstractViewportType::blockBack() const\n{\n    return p->foregroundAttachedType? p->foregroundAttachedType->blockBack() : false;\n}\n\nbool AsemanAbstractViewportType::blockBackIsNull() const\n{\n    if (!p->foregroundAttachedType)\n        return false;\n\n    bool isNull;\n    p->foregroundAttachedType->blockBack(&isNull);\n    return isNull;\n}\n\nvoid AsemanAbstractViewportType::setBlockBack(bool blockBack)\n{\n    if (!p->foregroundAttachedType)\n        return;\n\n    p->foregroundAttachedType->setBlockBack(blockBack);\n}\n\nQQuickItem *AsemanAbstractViewportType::sourceObject() const\n{\n    return p->foregroundAttachedType? p->foregroundAttachedType->sourceObject() : Q_NULLPTR;\n}\n\nbool AsemanAbstractViewportType::sourceObjectIsNull() const\n{\n    if (!p->foregroundAttachedType)\n        return false;\n\n    bool isNull;\n    p->foregroundAttachedType->sourceObject(&isNull);\n    return isNull;\n}\n\nvoid AsemanAbstractViewportType::setSourceObject(QQuickItem *item)\n{\n    if (!p->foregroundAttachedType)\n        return;\n\n    p->foregroundAttachedType->setSourceObject(item);\n}\n\nbool AsemanAbstractViewportType::open() const\n{\n    return p->foregroundAttachedType? p->foregroundAttachedType->open() : p->open;\n}\n\nvoid AsemanAbstractViewportType::setOpen(bool open)\n{\n    if (p->foregroundAttachedType)\n        p->foregroundAttachedType->setOpen(open);\n\n    if (p->open == open)\n        return;\n\n    p->open = open;\n    Q_EMIT openChanged();\n}\n\nAsemanAbstractViewportType::~AsemanAbstractViewportType()\n{\n    delete p;\n}\n\nAsemanViewportTypeAttechedProperty *AsemanViewportType::qmlAttachedProperties(QObject *object)\n{\n    return new AsemanViewportTypeAttechedProperty(object);\n}\n\nAsemanViewportTypeAttechedProperty::AsemanViewportTypeAttechedProperty(QObject *parent) :\n    QObject(parent),\n    mSourceObject(Q_NULLPTR),\n    mOpen(true)\n{\n}\n\nqreal AsemanViewportTypeAttechedProperty::gestureWidth(bool *isNull) const\n{\n    if (isNull) *isNull = mGestureWidth.isNull();\n    return mGestureWidth.toReal();\n}\n\nvoid AsemanViewportTypeAttechedProperty::setGestureWidth(qreal gestureWidth)\n{\n    if (mGestureWidth == gestureWidth)\n        return;\n\n    mGestureWidth = gestureWidth;\n    Q_EMIT gestureWidthChanged();\n}\n\nqreal AsemanViewportTypeAttechedProperty::maximumWidth(bool *isNull) const\n{\n    if (isNull) *isNull = mMaximumWidth.isNull();\n    return mMaximumWidth.toReal();\n\n}\n\nvoid AsemanViewportTypeAttechedProperty::setMaximumWidth(qreal maximumWidth)\n{\n    if (mMaximumWidth == maximumWidth)\n        return;\n\n    mMaximumWidth = maximumWidth;\n    Q_EMIT maximumWidthChanged();\n}\n\nQPointF AsemanViewportTypeAttechedProperty::typeTransformOrigin(bool *isNull) const\n{\n    if (isNull) *isNull = mTypeTransformOrigin.isNull();\n    return mTypeTransformOrigin;\n}\n\nvoid AsemanViewportTypeAttechedProperty::setTypeTransformOrigin(const QPointF &typeTransformOrigin)\n{\n    if (mTypeTransformOrigin == typeTransformOrigin)\n        return;\n\n    mTypeTransformOrigin = typeTransformOrigin;\n    Q_EMIT typeTransformOriginChanged();\n}\n\nbool AsemanViewportTypeAttechedProperty::touchToClose(bool *isNull) const\n{\n    if (isNull) *isNull = mTouchToClose.isNull();\n    return mTouchToClose.toBool();\n}\n\nvoid AsemanViewportTypeAttechedProperty::setTouchToClose(bool touchToClose)\n{\n    if (mTouchToClose == touchToClose)\n        return;\n\n    mTouchToClose = touchToClose;\n    Q_EMIT touchToCloseChanged();\n}\n\nbool AsemanViewportTypeAttechedProperty::blockBack(bool *isNull) const\n{\n    if (isNull) *isNull = mBlockBack.isNull();\n    return mBlockBack.toBool();\n}\n\nvoid AsemanViewportTypeAttechedProperty::setBlockBack(bool blockBack)\n{\n    if (mBlockBack == blockBack)\n        return;\n\n    mBlockBack = blockBack;\n    Q_EMIT blockBackChanged();\n}\n\nQQuickItem *AsemanViewportTypeAttechedProperty::sourceObject(bool *isNull) const\n{\n    if (isNull) *isNull = mSourceObject.isNull();\n    return mSourceObject;\n\n}\n\nvoid AsemanViewportTypeAttechedProperty::setSourceObject(QQuickItem *item)\n{\n    if (mSourceObject == item)\n        return;\n\n    mSourceObject = item;\n    Q_EMIT sourceObjectChanged();\n}\n\nbool AsemanViewportTypeAttechedProperty::open() const\n{\n    return mOpen;\n}\n\nvoid AsemanViewportTypeAttechedProperty::setOpen(bool open)\n{\n    if (mOpen == open)\n        return;\n\n    mOpen = open;\n    Q_EMIT openChanged();\n}\n\nAsemanViewportTypeAttechedProperty::~AsemanViewportTypeAttechedProperty()\n{\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/asemanabstractviewporttype.h",
    "content": "#ifndef ASEMANABSTRACTVIEWPORTTYPE_H\n#define ASEMANABSTRACTVIEWPORTTYPE_H\n\n#include <QPointer>\n#include <QQuickItem>\n\n#include \"asemanviewport.h\"\n\nclass AsemanAbstractViewportType : public QQuickItem\n{\n    Q_OBJECT\n    Q_PROPERTY(QQuickItem* backgroundItem READ backgroundItem WRITE setBackgroundItem NOTIFY backgroundItemChanged)\n    Q_PROPERTY(QQuickItem* foregroundItem READ foregroundItem WRITE setForegroundItem NOTIFY foregroundItemChanged)\n    Q_PROPERTY(AsemanViewport* viewport READ viewport WRITE setViewport NOTIFY viewportChanged)\n    Q_PROPERTY(bool open READ open WRITE setOpen NOTIFY openChanged)\n\n    Q_PROPERTY(qreal gestureWidth READ gestureWidth WRITE setGestureWidth NOTIFY gestureWidthChanged)\n    Q_PROPERTY(bool gestureWidthIsNull READ gestureWidthIsNull NOTIFY gestureWidthChanged)\n\n    Q_PROPERTY(qreal maximumWidth READ maximumWidth WRITE setMaximumWidth NOTIFY maximumWidthChanged)\n    Q_PROPERTY(bool maximumWidthIsNull READ maximumWidthIsNull NOTIFY maximumWidthChanged)\n\n    Q_PROPERTY(QPointF typeTransformOrigin READ typeTransformOrigin WRITE setTypeTransformOrigin NOTIFY typeTransformOriginChanged)\n    Q_PROPERTY(bool typeTransformOriginIsNull READ typeTransformOriginIsNull NOTIFY typeTransformOriginChanged)\n\n    Q_PROPERTY(bool touchToClose READ touchToClose WRITE setTouchToClose NOTIFY touchToCloseChanged)\n    Q_PROPERTY(bool touchToCloseIsNull READ touchToCloseIsNull NOTIFY touchToCloseChanged)\n\n    Q_PROPERTY(bool blockBack READ blockBack WRITE setBlockBack NOTIFY blockBackChanged)\n    Q_PROPERTY(bool blockBackIsNull READ blockBackIsNull NOTIFY blockBackChanged)\n\n    Q_PROPERTY(QQuickItem* sourceObject READ sourceObject WRITE setSourceObject NOTIFY sourceObjectChanged)\n    Q_PROPERTY(bool sourceObjectIsNull READ sourceObjectIsNull NOTIFY sourceObjectChanged)\n\n    class Private;\n\npublic:\n    AsemanAbstractViewportType(QQuickItem *parent = Q_NULLPTR);\n    virtual ~AsemanAbstractViewportType();\n\n    QQuickItem *foregroundItem() const;\n    void setForegroundItem(QQuickItem *foregroundItem);\n\n    QQuickItem *backgroundItem() const;\n    void setBackgroundItem(QQuickItem *backgroundItem);\n\n    AsemanViewport *viewport() const;\n    void setViewport(AsemanViewport *viewport);\n\n    qreal gestureWidth() const;\n    bool gestureWidthIsNull() const;\n    void setGestureWidth(qreal gestureWidth);\n\n    qreal maximumWidth() const;\n    bool maximumWidthIsNull() const;\n    void setMaximumWidth(qreal maximumWidth);\n\n    QPointF typeTransformOrigin() const;\n    bool typeTransformOriginIsNull() const;\n    void setTypeTransformOrigin(const QPointF &typeTransformOrigin);\n\n    bool touchToClose() const;\n    bool touchToCloseIsNull() const;\n    void setTouchToClose(bool touchToClose);\n\n    bool blockBack() const;\n    bool blockBackIsNull() const;\n    void setBlockBack(bool blockBack);\n\n    QQuickItem *sourceObject() const;\n    bool sourceObjectIsNull() const;\n    void setSourceObject(QQuickItem *item);\n\n    bool open() const;\n    void setOpen(bool open);\n\nQ_SIGNALS:\n    void gestureWidthChanged();\n    void maximumWidthChanged();\n    void typeTransformOriginChanged();\n    void touchToCloseChanged();\n    void blockBackChanged();\n    void foregroundItemChanged();\n    void backgroundItemChanged();\n    void viewportChanged();\n    void sourceObjectChanged();\n    void openChanged();\n\nprivate:\n    Private *p;\n};\n\nclass AsemanViewportTypeAttechedProperty;\nclass AsemanViewportType : public QObject\n{\n    Q_OBJECT\npublic:\n    static AsemanViewportTypeAttechedProperty *qmlAttachedProperties(QObject *object);\n};\n\nclass AsemanViewportTypeAttechedProperty : public QObject {\n    Q_OBJECT\n    Q_PROPERTY(qreal gestureWidth READ gestureWidth WRITE setGestureWidth NOTIFY gestureWidthChanged)\n    Q_PROPERTY(qreal maximumWidth READ maximumWidth WRITE setMaximumWidth NOTIFY maximumWidthChanged)\n    Q_PROPERTY(QPointF transformOrigin READ typeTransformOrigin WRITE setTypeTransformOrigin NOTIFY typeTransformOriginChanged)\n    Q_PROPERTY(bool touchToClose READ touchToClose WRITE setTouchToClose NOTIFY touchToCloseChanged)\n    Q_PROPERTY(bool blockBack READ blockBack WRITE setBlockBack NOTIFY blockBackChanged)\n    Q_PROPERTY(QQuickItem* sourceObject READ sourceObject WRITE setSourceObject NOTIFY sourceObjectChanged)\n    Q_PROPERTY(bool open READ open WRITE setOpen NOTIFY openChanged)\n\npublic:\n    AsemanViewportTypeAttechedProperty(QObject *parent);\n    virtual ~AsemanViewportTypeAttechedProperty();\n\n    qreal gestureWidth(bool *isNull = Q_NULLPTR) const;\n    void setGestureWidth(qreal gestureWidth);\n\n    qreal maximumWidth(bool *isNull = Q_NULLPTR) const;\n    void setMaximumWidth(qreal maximumWidth);\n\n    QPointF typeTransformOrigin(bool *isNull = Q_NULLPTR) const;\n    void setTypeTransformOrigin(const QPointF &point);\n\n    bool touchToClose(bool *isNull = Q_NULLPTR) const;\n    void setTouchToClose(bool touchToClose);\n\n    bool blockBack(bool *isNull = Q_NULLPTR) const;\n    void setBlockBack(bool blockBack);\n\n    QQuickItem *sourceObject(bool *isNull = Q_NULLPTR) const;\n    void setSourceObject(QQuickItem *item);\n\n    bool open() const;\n    void setOpen(bool open);\n\nQ_SIGNALS:\n    void gestureWidthChanged();\n    void maximumWidthChanged();\n    void typeTransformOriginChanged();\n    void touchToCloseChanged();\n    void blockBackChanged();\n    void sourceObjectChanged();\n    void openChanged();\n\nprivate:\n    QVariant mGestureWidth;\n    QVariant mMaximumWidth;\n    QVariant mTouchToClose;\n    QVariant mBlockBack;\n    QPointF mTypeTransformOrigin;\n    QPointer<QQuickItem> mSourceObject;\n    bool mOpen;\n};\n\nQML_DECLARE_TYPEINFO(AsemanViewportType, QML_HAS_ATTACHED_PROPERTIES)\n\n#endif // ASEMANABSTRACTVIEWPORTTYPE_H\n"
  },
  {
    "path": "src/asemanqml/viewport/asemanqttoolsitemviewport.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtToolsItemViewport is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtToolsItemViewport is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanabstractviewporttype.h\"\n#include \"asemanqttoolsitemviewport.h\"\n\n#include <asemanviewport.h>\n#include <asemanviewportcontroller.h>\n#include <asemanviewportcontrollerroute.h>\n#include <asemanviewportitem.h>\n\n#include <qqml.h>\n#include <QHash>\n#include <QSet>\n#include <QPointer>\n#include <QFile>\n#include <QDir>\n\nstatic QStringList aseman_qt_tools_indexCache;\nstatic QString aseman_qt_tools_destination;\n\nvoid AsemanQtToolsItemViewport::registerTypes(const char *uri, bool exportMode)\n{\n    static QSet<QByteArray> register_list;\n    if (register_list.contains(uri) && !exportMode)\n        return;\n\n    registerType<AsemanAbstractViewportType>(uri, 2, 0, \"AbstractViewportTypeCore\", exportMode);\n    registerType<AsemanViewport>(uri, 2, 0, \"ViewportCore\", exportMode);\n    registerType<AsemanViewportItem>(uri, 2, 0, \"ViewportItem\", exportMode);\n    registerType<AsemanViewportController>(uri, 2, 0, \"ViewportControllerCore\", exportMode);\n    registerType<AsemanViewportControllerRoute>(uri, 2, 0, \"ViewportControllerRoute\", exportMode);\n    qmlRegisterUncreatableType<AsemanViewportType>(uri, 2, 0, \"ViewportType\", \"\");\n\n    register_list.insert(uri);\n}\n\nvoid AsemanQtToolsItemViewport::registerFiles(const QString &filesLocation, const char *uri)\n{\n    QFile file(filesLocation + QStringLiteral(\"/qmldir\"));\n    if(file.open(QFile::ReadOnly))\n    {\n        QStringList lines = QString::fromUtf8(file.readAll()).split(QStringLiteral(\"\\n\"), Qt::SkipEmptyParts);\n        file.close();\n\n        for(const QString &l: lines)\n        {\n            QStringList parts = l.trimmed().split(QStringLiteral(\" \"), Qt::SkipEmptyParts);\n            bool singleton = false;\n            if(parts.count() && parts.first() == \"singleton\")\n                singleton = parts.takeFirst().count();\n            if(parts.length() != 3)\n                continue;\n\n            QStringList version = parts.at(1).split(QStringLiteral(\".\"), Qt::SkipEmptyParts);\n            if(version.count() != 2)\n                continue;\n\n            if(singleton)\n                qmlRegisterSingletonType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                         uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n            else\n                qmlRegisterType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n        }\n    }\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemViewport::registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemViewport::registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportModel<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemViewport::registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterSingletonType<T>(uri, versionMajor, versionMinor, typeName, callback);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemViewport::registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(qmlName));\n    else\n        return qmlRegisterUncreatableType<T>(uri, versionMajor, versionMinor, qmlName, reason);\n    return 0;\n}\n\n\nvoid AsemanQtToolsItemViewport::exportDocuments(const QString &destination)\n{\n    aseman_qt_tools_destination = destination;\n\n    QDir().mkpath(aseman_qt_tools_destination);\n    aseman_qt_tools_indexCache.clear();\n\n    AsemanQtToolsItemViewport::registerTypes(\"AsemanToolsItem\", true);\n\n    QString index = QStringLiteral(\"# AsemanToolsItem Documents\\n\\n\");\n    index += QStringLiteral(\"### [Getting Started](gettingstarted.md)\\n\\n\");\n    index += QStringLiteral(\"### How to import:\\n\\n\");\n    index += QStringLiteral(\"```c++\\nimport AsemanQml.Base 2.0\\n```\\n\\nor\\n\\n\"\n             \"```c++\\nimport AsemanQml.Base 2.0 as Aseman\\n```\\n\\n\");\n    index += QStringLiteral(\"### Types\\n\\nHere are all components of the AsemanToolsItem:\\n\\n\");\n    for(const QString cmpnt: aseman_qt_tools_indexCache)\n    {\n        if(cmpnt == QStringLiteral(\"MimeData\"))\n            index += QStringLiteral(\"\\n##### Normal types\\n\\n\");\n        if(cmpnt == QStringLiteral(\"MixedListModel\"))\n            index += QStringLiteral(\"\\n##### Models\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Devices\"))\n            index += QStringLiteral(\"\\n##### Singletons\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Screen\"))\n            index += QStringLiteral(\"\\n##### Uncreatable types\\n\\n\");\n        index += QStringLiteral(\" * [%1](%2.md)\\n\").arg(cmpnt).arg(cmpnt.toLower());\n    }\n\n    QString path = aseman_qt_tools_destination + \"/start.md\";\n    aseman_qt_tools_destination.clear();\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return;\n\n    file.write(index.toUtf8());\n    file.close();\n}\n\nQString AsemanQtToolsItemViewport::fixType(const QString &type)\n{\n    if(type == QStringLiteral(\"QSizeF\") || type == QStringLiteral(\"QSize\"))\n        return QStringLiteral(\"size\");\n    if(type == QStringLiteral(\"QPoint\") || type == QStringLiteral(\"QPointF\"))\n        return QStringLiteral(\"point\");\n    if(type == QStringLiteral(\"QUrl\"))\n        return QStringLiteral(\"url\");\n    if(type == QStringLiteral(\"QString\"))\n        return QStringLiteral(\"string\");\n    if(type == QStringLiteral(\"QByteArray\"))\n        return QStringLiteral(\"byte\");\n    if(type == QStringLiteral(\"bool\"))\n        return QStringLiteral(\"boolean\");\n    if(type == QStringLiteral(\"double\") || type == QStringLiteral(\"qreal\"))\n        return QStringLiteral(\"real\");\n    if(type == QStringLiteral(\"QVariant\"))\n        return QStringLiteral(\"variant\");\n    if(type == QStringLiteral(\"QJSValue\"))\n        return QStringLiteral(\"function(){[code]}\");\n    if(type == QStringLiteral(\"QVariantMap\"))\n        return QStringLiteral(\"map\");\n    if(type == QStringLiteral(\"QVariantList\"))\n        return QStringLiteral(\"list&lt;variant&gt;\");\n    if(type == QStringLiteral(\"QStringList\"))\n        return QStringLiteral(\"list&lt;string&gt;\");\n    if(type == QStringLiteral(\"QList<qint32>\"))\n        return QStringLiteral(\"list&lt;int&gt;\");\n    if(type.contains(QStringLiteral(\"*\")))\n    {\n        if(type == QStringLiteral(\"QObject*\"))\n            return QStringLiteral(\"object\");\n        if(type.contains(QStringLiteral(\"Telegram\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Telegram\"));\n            return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n        }\n        if(type.contains(QStringLiteral(\"Object\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Object\"));\n            return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                    .arg(name).arg(name.toLower());\n        }\n        if(type == QStringLiteral(\"QQmlComponent*\"))\n            return QStringLiteral(\"Component\");\n        if(type == QStringLiteral(\"QQuickItem\"))\n            return QStringLiteral(\"Item\");\n    }\n    if(type.contains(QStringLiteral(\"Telegram\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Telegram\"));\n        return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n    }\n    if(type == QStringLiteral(\"QQuickItem\"))\n        return QStringLiteral(\"Item\");\n    if(type == QStringLiteral(\"QObject\"))\n        return QStringLiteral(\"object\");\n    if(type.contains(QStringLiteral(\"Object\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Object\"));\n        return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                .arg(name).arg(name.toLower());\n    }\n    return type;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemViewport::exportItem(const QString &module, int major, int minor, const QString &component, bool store)\n{\n    QString result;\n    aseman_qt_tools_indexCache << component;\n\n    QMetaObject meta = T::staticMetaObject;\n    QString inherits = fixType(QString::fromUtf8(meta.superClass()? meta.superClass()->className() : \"\"));\n    bool isModel = component.toLower().contains(QStringLiteral(\"model\"));\n\n    result += QStringLiteral(\"# %1\\n\\n\").arg(component);\n\n    QString headers;\n    headers += QStringLiteral(\" * [Component details](#component-details)\\n\");\n\n    QString details = QStringLiteral(\"\\n### Component details:\\n\\n\");\n    details += QStringLiteral(\"|Detail|Value|\\n\"\n                       \"|------|-----|\\n\");\n    details += QStringLiteral(\"|%1|%2 %3.%4|\\n\").arg(QStringLiteral(\"Import\")).arg(module).arg(major).arg(minor);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Component\")).arg(component);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"C++ class\")).arg(QString::fromUtf8(meta.className()));\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Inherits\")).arg(inherits);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Model\")).arg(QString::fromUtf8(isModel?\"Yes\":\"No\"));\n\n    QString resultProperties;\n    QStringList propertiesSignals;\n    for(int i=0; i<meta.propertyCount(); i++)\n    {\n        QMetaProperty property = meta.property(i);\n        const QString &propertyName = QString::fromUtf8(property.name());\n        const QString &propertyType = fixType(QString::fromUtf8(property.typeName()));\n        propertiesSignals << QString::fromUtf8(property.notifySignal().name());\n\n        QString text = QStringLiteral(\"* <font color='#074885'><b>%1</b></font>: %2\").arg(propertyName).arg(propertyType);\n        if(!property.isWritable())\n            text += QStringLiteral(\" (readOnly)\");\n\n        text += QStringLiteral(\"\\n\");\n        if(meta.propertyOffset()<=i)\n            resultProperties += text;\n    }\n\n    QString enumResults;\n    for(int i=meta.enumeratorOffset(); i<meta.enumeratorCount(); i++)\n    {\n        QMetaEnum enumerator = meta.enumerator(i);\n        const QString &enumName = QString::fromUtf8(enumerator.name());\n\n        enumResults += QStringLiteral(\"\\n##### %1\\n\\n\").arg(enumName);\n        enumResults += QStringLiteral(\"|Key|Value|\\n\"\n                               \"|---|-----|\\n\");\n\n        for(int j=0; j<enumerator.keyCount(); j++)\n            enumResults += QStringLiteral(\"|%1|%2|\\n\").arg(QString::fromUtf8(enumerator.key(j))).arg(enumerator.value(j));\n    }\n\n    QString resultSlots;\n    QString resultSignals;\n    for(int i=meta.methodOffset(); i<meta.methodCount(); i++)\n    {\n        QMetaMethod method = meta.method(i);\n        if(method.access() != QMetaMethod::Public)\n            continue;\n\n        const QString &methodName = QString::fromUtf8(method.name());\n        if(propertiesSignals.contains(methodName))\n            continue;\n\n        const QString &methodType = fixType(QString::fromUtf8(method.typeName()));\n\n        QString args;\n        const QList<QByteArray> &paramNames = method.parameterNames();\n        const QList<QByteArray> &paramTypes = method.parameterTypes();\n        for(int j=0; j<paramNames.count(); j++)\n        {\n            if(j != 0)\n                args += QStringLiteral(\", \");\n\n            args += fixType(QString::fromUtf8(paramTypes[j])) + QStringLiteral(\" \") + paramNames[j];\n        }\n\n        QString text = QStringLiteral(\" * %1 <font color='#074885'><b>%2</b></font>(%3)\\n\").arg(methodType).arg(methodName).arg(args);\n        switch(static_cast<int>(method.methodType()))\n        {\n        case QMetaMethod::Slot:\n            resultSlots += text;\n            break;\n        case QMetaMethod::Signal:\n            resultSignals += text;\n            break;\n        }\n    }\n\n    if(!resultProperties.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Normal Properties](#normal-properties)\\n\");\n        resultProperties = QStringLiteral(\"\\n### Normal Properties\\n\\n\") + resultProperties;\n    }\n    if(!enumResults.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Enumerator](#enumerator)\\n\");\n        enumResults = QStringLiteral(\"\\n### Enumerator\\n\\n\") + enumResults;\n    }\n    if(!resultSlots.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Methods](#methods)\\n\");\n        resultSlots = QStringLiteral(\"\\n### Methods\\n\\n\") + resultSlots;\n    }\n    if(!resultSignals.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Signals](#Q_SIGNALS)\\n\");\n        resultSignals = QStringLiteral(\"\\n### Signals\\n\\n\") + resultSignals;\n    }\n    if(isModel)\n        headers += QStringLiteral(\" * [Roles](#roles)\\n\");\n\n    result += headers + QStringLiteral(\"\\n\");\n    result += details + QStringLiteral(\"\\n\");\n    result += resultProperties + QStringLiteral(\"\\n\");\n    result += resultSlots + QStringLiteral(\"\\n\");\n    result += resultSignals + QStringLiteral(\"\\n\");\n    result += enumResults + QStringLiteral(\"\\n\");\n\n    if(!store)\n        return result;\n\n    QString path = aseman_qt_tools_destination + QStringLiteral(\"/\") + component.toLower() + QStringLiteral(\".md\");\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemViewport::exportModel(const QString &module, int major, int minor, const QString &component)\n{\n    QString result = exportItem<T>(module, major, minor, component, false);\n    T *model = new T();\n\n    QHash<qint32,QByteArray> roleNames = model->roleNames();\n    QMap<qint32,QByteArray> rolesMap;\n    QHashIterator<qint32,QByteArray> i(roleNames);\n    while(i.hasNext())\n    {\n        i.next();\n        rolesMap[i.key()] = i.value();\n    }\n\n    result += QStringLiteral(\"\\n### Roles\\n\\n\");\n    Q_FOREACH(const QByteArray &name, rolesMap)\n        result += QStringLiteral(\" * model.<font color='#074885'>%1</font>\\n\").arg(QString::fromUtf8(name));\n\n    delete model;\n\n    QString path = aseman_qt_tools_destination + \"/\" + component.toLower() + \".md\";\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/asemanqttoolsitemviewport.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQTTOOLSITEMMULTIEMEDIA_H\n#define ASEMANQTTOOLSITEMMULTIEMEDIA_H\n\n#include <QtGlobal>\n#include <QString>\n\n#include <asemanqttools.h>\n\nclass QObject;\nclass QQmlEngine;\nclass QJSEngine;\nclass AsemanQtToolsItemViewport: public AsemanQtTools\n{\npublic:\n    static void registerTypes(const char *uri, bool exportMode = false);\n    static void registerFiles(const QString &filesLocation, const char *uri);\n\n    template<typename T>\n    static int registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template<typename T>\n    static int registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template <typename T>\n    static int registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName,\n                                 QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode);\n\n    template<typename T>\n    static int registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason, bool exportMode);\n\n    static void exportDocuments(const QString &destination);\n\nprotected:\n    template<typename T>\n    static QString exportItem(const QString &module, int major, int minor, const QString &component, bool store = true);\n    template<typename T>\n    static QString exportModel(const QString &module, int major, int minor, const QString &component);\n\n    static QString fixType(const QString &type);\n};\n\n#endif // ASEMANQTTOOLSITEMMULTIEMEDIA_H\n"
  },
  {
    "path": "src/asemanqml/viewport/asemanviewport.cpp",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanviewport.h\"\n#include \"asemanviewportcontroller.h\"\n\n#include <QtQml>\n\nclass AsemanViewport::Private\n{\npublic:\n    QList<AsemanViewportItem*> items;\n    QList<AsemanViewportItem*> defaultItems;\n    QHash<QUrl, QQmlComponent*> components;\n};\n\nAsemanViewport::AsemanViewport(QQuickItem *parent) :\n    QQuickItem(parent)\n{\n    p = new Private;\n\n    p->defaultItems << new AsemanViewportItem(\"android-page\", \"AndroidDefaultPagesViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"android-activity\", \"AndroidActivityViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"android-bottomdrawer\", \"AndroidBottomDrawerViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"android-dialog\", \"AndroidDialogViewport.qml\", this);\n\n    p->defaultItems << new AsemanViewportItem(\"ios-page\", \"IOSNormalViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"ios-popup\", \"IOSPopupViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"ios-bottomdrawer\", \"IOSBottomDrawerViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"ios-dialog\", \"IOSDialogViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"ios-menu\", \"IOSContextMenuViewport.qml\", this);\n\n#ifdef Q_OS_ANDROID\n    p->defaultItems << new AsemanViewportItem(\"page\", \"AndroidDefaultPagesViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"stack\", \"IOSNormalViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"popup\", \"IOSPopupViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"activity\", \"AndroidActivityViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"float\", \"AndroidActivityViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"bottomdrawer\", \"AndroidBottomDrawerViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"blurbottomdrawer\", \"IOSBottomDrawerViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"dialog\", \"AndroidDialogViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"blurdialog\", \"IOSDialogViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"menu\", \"IOSContextMenuViewport.qml\", this);\n#else\n    p->defaultItems << new AsemanViewportItem(\"page\", \"IOSNormalViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"stack\", \"IOSNormalViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"popup\", \"IOSPopupViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"activity\", \"AndroidActivityViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"float\", \"IOSPopupViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"bottomdrawer\", \"IOSBottomDrawerViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"blurbottomdrawer\", \"IOSBottomDrawerViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"dialog\", \"IOSDialogViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"blurdialog\", \"IOSDialogViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"menu\", \"IOSContextMenuViewport.qml\", this);\n#endif\n\n    p->defaultItems << new AsemanViewportItem(\"none\", \"NoneViewport.qml\", this);\n    p->defaultItems << new AsemanViewportItem(\"splitted\", \"SplitedViewport.qml\", this);\n}\n\nQQmlListProperty<AsemanViewportItem> AsemanViewport::items()\n{\n    return QQmlListProperty<AsemanViewportItem>(this, &p->items, QQmlListProperty<AsemanViewportItem>::AppendFunction(append),\n                                                QQmlListProperty<AsemanViewportItem>::CountFunction(count),\n                                                QQmlListProperty<AsemanViewportItem>::AtFunction(at),\n                                                QQmlListProperty<AsemanViewportItem>::ClearFunction(clear) );\n}\n\nQList<AsemanViewportItem *> AsemanViewport::itemsList() const\n{\n    return p->items;\n}\n\nQStringList AsemanViewport::keys() const\n{\n    QList<AsemanViewportItem*> list = p->defaultItems;\n    list << p->items;\n\n    QStringList result;\n    for (AsemanViewportItem *i: list)\n        result << i->name().toLower();\n\n    return result;\n}\n\nAsemanViewportAttechedProperty *AsemanViewport::qmlAttachedProperties(QObject *object)\n{\n    return new AsemanViewportAttechedProperty(object);\n}\n\nQVariant AsemanViewport::getComponent(const QString &name)\n{\n    QList<AsemanViewportItem*> list = p->defaultItems;\n    list << p->items;\n\n    for (AsemanViewportItem *i: list)\n        if (i->name().toLower() == name.toLower())\n            return i->component();\n\n    return QVariant();\n}\n\nQQmlComponent *AsemanViewport::createComponent(const QUrl &url, bool asyn)\n{\n    QQmlComponent *component = p->components.value(url);\n    if (component)\n        return component;\n\n    QQmlEngine *engine = qmlEngine(this);\n    if (!engine)\n    {\n        qmlWarning(this) << \"Could not find engine of the object\";\n        return Q_NULLPTR;\n    }\n\n    component = new QQmlComponent(engine, url, (asyn? QQmlComponent::Asynchronous : QQmlComponent::PreferSynchronous), this);\n    p->components[url] = component;\n\n    connect(component, &QObject::destroyed, this, [this, url](){\n        p->components.remove(url);\n    });\n\n    return component;\n}\n\nvoid AsemanViewport::append(QQmlListProperty<AsemanViewportItem> *p, AsemanViewportItem *v)\n{\n    AsemanViewport *aobj = static_cast<AsemanViewport*>(p->object);\n    aobj->p->items.append(v);\n    Q_EMIT aobj->itemsChanged();\n}\n\nint AsemanViewport::count(QQmlListProperty<AsemanViewportItem> *p)\n{\n    AsemanViewport *aobj = static_cast<AsemanViewport*>(p->object);\n    return aobj->p->items.count();\n}\n\nAsemanViewportItem *AsemanViewport::at(QQmlListProperty<AsemanViewportItem> *p, int idx)\n{\n    AsemanViewport *aobj = static_cast<AsemanViewport*>(p->object);\n    return aobj->p->items.at(idx);\n}\n\nvoid AsemanViewport::clear(QQmlListProperty<AsemanViewportItem> *p)\n{\n    AsemanViewport *aobj = static_cast<AsemanViewport*>(p->object);\n    aobj->p->items.clear();\n    Q_EMIT aobj->itemsChanged();\n}\n\nbool AsemanViewport::primaryViewport()\n{\n    if (mPrimaryViewport.has_value())\n        return mPrimaryViewport.value();\n\n    return AsemanViewportAttechedProperty::viewport(this, true) == this;\n}\n\nbool AsemanViewport::isPrimaryViewport() const\n{\n    return mPrimaryViewport.value_or(false);\n}\n\nvoid AsemanViewport::setPrimaryViewport(bool newPrimaryViewport)\n{\n    if (mPrimaryViewport == newPrimaryViewport)\n        return;\n    mPrimaryViewport = newPrimaryViewport;\n    Q_EMIT primaryViewportChanged();\n}\n\nAsemanViewport::~AsemanViewport()\n{\n    delete p;\n}\n\n\n\nAsemanViewportAttechedProperty::AsemanViewportAttechedProperty(QObject *parent) :\n    QObject(parent)\n{\n}\n\nQObject *AsemanViewportAttechedProperty::controller() const\n{\n    const auto controllers = allControllers();\n    if (controllers.isEmpty())\n    {\n        qmlWarning(this) << \"There is no controller attached to the viewport.\";\n        return Q_NULLPTR;\n    }\n    return controllers.first();\n}\n\nQList<QObject *> AsemanViewportAttechedProperty::allControllers() const\n{\n    QList<QObject*> list;\n    for (auto o: AsemanViewportController::controllers( AsemanViewportAttechedProperty::viewport() ))\n        list << o;\n    return list;\n}\n\nAsemanViewport *AsemanViewportAttechedProperty::viewport() const\n{\n    return AsemanViewportAttechedProperty::viewport(parent());\n}\n\nAsemanViewport *AsemanViewportAttechedProperty::primaryViewport() const\n{\n    return AsemanViewportAttechedProperty::viewport(parent(), true);\n}\n\nAsemanViewport *AsemanViewportAttechedProperty::viewport(QObject *obj, bool primary)\n{\n    AsemanViewport *last_viewport = Q_NULLPTR;\n    do\n    {\n        auto item = qobject_cast<QQuickItem*>(obj);\n        obj = item? item->parentItem() : obj->parent();\n\n        auto viewport = qobject_cast<AsemanViewport*>(obj);\n        if (viewport)\n        {\n            if (primary)\n            {\n                if (viewport->isPrimaryViewport())\n                    return viewport;\n                last_viewport = viewport;\n            }\n            else\n                return viewport;\n        }\n\n    } while(obj);\n\n    return last_viewport;\n}\n\nAsemanViewportAttechedProperty::~AsemanViewportAttechedProperty()\n{\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/asemanviewport.h",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANVIEWPORT_H\n#define ASEMANVIEWPORT_H\n\n#include <QObject>\n#include <QQuickItem>\n\n#include <optional>\n\n#include \"asemanviewportitem.h\"\n\nclass AsemanViewportAttechedProperty;\nclass AsemanViewport : public QQuickItem\n{\n    Q_OBJECT\n    class Private;\n    Q_PROPERTY(QQmlListProperty<AsemanViewportItem> items READ items NOTIFY itemsChanged)\n    Q_PROPERTY(QStringList keys READ keys NOTIFY itemsChanged)\n    Q_PROPERTY(bool primaryViewport READ primaryViewport WRITE setPrimaryViewport NOTIFY primaryViewportChanged)\n\npublic:\n    AsemanViewport(QQuickItem *parent = Q_NULLPTR);\n    virtual ~AsemanViewport();\n\n    QQmlListProperty<AsemanViewportItem> items();\n    QList<AsemanViewportItem*> itemsList() const;\n    QStringList keys() const;\n\n    static AsemanViewportAttechedProperty *qmlAttachedProperties(QObject *object);\n\n    bool primaryViewport();\n    bool isPrimaryViewport() const;\n    void setPrimaryViewport(bool newPrimaryViewport);\n\npublic Q_SLOTS:\n    QVariant getComponent(const QString &name);\n    QQmlComponent *createComponent(const QUrl &fileUrl, bool asyn = false);\n\nQ_SIGNALS:\n    void itemsChanged();\n    void viewportChanged();\n    void primaryViewportChanged();\n\nprivate:\n    static void append(QQmlListProperty<AsemanViewportItem> *p, AsemanViewportItem *v);\n    static int count(QQmlListProperty<AsemanViewportItem> *p);\n    static AsemanViewportItem *at(QQmlListProperty<AsemanViewportItem> *p, int idx);\n    static void clear(QQmlListProperty<AsemanViewportItem> *p);\n\nprivate:\n    Private *p;\n    std::optional<bool> mPrimaryViewport;\n};\n\nclass AsemanViewportController;\nclass AsemanViewportAttechedProperty : public QObject {\n    Q_OBJECT\n    Q_PROPERTY(QObject* controller READ controller NOTIFY controllersChanged)\n    Q_PROPERTY(QList<QObject *> allControllers READ allControllers NOTIFY controllersChanged)\n    Q_PROPERTY(AsemanViewport* viewport READ viewport NOTIFY controllersChanged)\n    Q_PROPERTY(AsemanViewport* primaryViewport READ primaryViewport NOTIFY controllersChanged)\n\npublic:\n    AsemanViewportAttechedProperty(QObject *parent);\n    virtual ~AsemanViewportAttechedProperty();\n\n    QObject *controller() const;\n    QList<QObject *> allControllers() const;\n    AsemanViewport *viewport() const;\n    AsemanViewport *primaryViewport() const;\n\n    static AsemanViewport *viewport(QObject *obj, bool primary = false);\n\nQ_SIGNALS:\n    void controllersChanged();\n};\n\nQML_DECLARE_TYPEINFO(AsemanViewport, QML_HAS_ATTACHED_PROPERTIES)\n\ntypedef AsemanViewport QAsemanViewport;\n\n#endif // ASEMANVIEWPORT_H\n"
  },
  {
    "path": "src/asemanqml/viewport/asemanviewportcontroller.cpp",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanviewportcontroller.h\"\n\n#include <QSet>\n#include <QPointer>\n#include <QQmlInfo>\n#include <QUrl>\n#include <QUrlQuery>\n\n\nclass AsemanViewportController::Private\n{\npublic:\n    QPointer<AsemanViewport> viewport;\n    QList<AsemanViewportControllerRoute*> routes;\n    bool allowRecursiveTrigger;\n\n    static QList<AsemanViewportController*> controllers;\n};\n\nQList<AsemanViewportController*> AsemanViewportController::Private::controllers;\n\nAsemanViewportController::AsemanViewportController(QObject *parent) :\n    QObject(parent)\n{\n    p = new Private;\n    p->allowRecursiveTrigger = false;\n\n    Private::controllers << this;\n}\n\nQQmlListProperty<AsemanViewportControllerRoute> AsemanViewportController::routes()\n{\n    return QQmlListProperty<AsemanViewportControllerRoute>(this, &p->routes, QQmlListProperty<AsemanViewportControllerRoute>::AppendFunction(append),\n                                                          QQmlListProperty<AsemanViewportControllerRoute>::CountFunction(count),\n                                                          QQmlListProperty<AsemanViewportControllerRoute>::AtFunction(at),\n                                                          QQmlListProperty<AsemanViewportControllerRoute>::ClearFunction(clear) );\n}\n\nvoid AsemanViewportController::setViewport(AsemanViewport *viewport)\n{\n    if (p->viewport == viewport)\n        return;\n\n    p->viewport = viewport;\n    Q_EMIT viewportChanged();\n}\n\nAsemanViewport *AsemanViewportController::viewport() const\n{\n    return p->viewport;\n}\n\nbool AsemanViewportController::allowRecursiveTrigger() const\n{\n    return p->allowRecursiveTrigger;\n}\n\nvoid AsemanViewportController::setAllowRecursiveTrigger(bool allowRecursiveTrigger)\n{\n    if (p->allowRecursiveTrigger == allowRecursiveTrigger)\n        return;\n\n    p->allowRecursiveTrigger = allowRecursiveTrigger;\n    Q_EMIT allowRecursiveTriggerChanged();\n}\n\nQVariantMap AsemanViewportController::lookup(const QString &url, QVariantMap properties, AsemanViewport *viewport)\n{\n    QVariantMap res;\n    if (!viewport)\n        viewport = p->viewport;\n\n    if (!viewport)\n    {\n        qmlWarning(this) << \"viewport property cannot be null.\";\n        return res;\n    }\n\n    for (AsemanViewportControllerRoute *r: p->routes)\n    {\n        auto rx = r->route();\n        rx.setPattern( \"^\" + rx.pattern() + \"$\" );\n        if (url.indexOf(rx) == 0)\n        {\n            properties[\"properties\"] = properties;\n            properties[\"url\"] = url;\n\n            QUrl urlObj(url);\n            QUrlQuery query(urlObj);\n            auto queryItems = query.queryItems();\n            for (auto qi: queryItems)\n                properties[qi.first] = qi.second;\n\n            QVariant item;\n            QVariant component = r->component();\n            QVariant type = r->viewportType().length()? r->viewportType() : urlObj.scheme();\n            QVariant props = properties;\n\n            res[\"component\"] = component;\n            res[\"type\"] = type;\n            res[\"properties\"] = props;\n            res[\"viewport\"] = QVariant::fromValue<QObject*>(viewport);\n\n            return res;\n        }\n    }\n\n    AsemanViewportAttechedProperty attachProperty(p->viewport);\n    AsemanViewportController *parentController = static_cast<AsemanViewportController*>(attachProperty.controller());\n    if (parentController && p->allowRecursiveTrigger)\n        return parentController->lookup(url, properties, viewport);\n    else\n        qmlWarning(this) << \"Cannot find any route to handle \" << url;\n\n    return res;\n}\n\nvoid AsemanViewportController::append(QQmlListProperty<AsemanViewportControllerRoute> *p, AsemanViewportControllerRoute *v)\n{\n    AsemanViewportController *aobj = static_cast<AsemanViewportController*>(p->object);\n    aobj->p->routes.append(v);\n    Q_EMIT aobj->routesChanged();\n}\n\nint AsemanViewportController::count(QQmlListProperty<AsemanViewportControllerRoute> *p)\n{\n    AsemanViewportController *aobj = static_cast<AsemanViewportController*>(p->object);\n    return aobj->p->routes.count();\n}\n\nAsemanViewportControllerRoute *AsemanViewportController::at(QQmlListProperty<AsemanViewportControllerRoute> *p, int idx)\n{\n    AsemanViewportController *aobj = static_cast<AsemanViewportController*>(p->object);\n    return aobj->p->routes.at(idx);\n}\n\nvoid AsemanViewportController::clear(QQmlListProperty<AsemanViewportControllerRoute> *p)\n{\n    AsemanViewportController *aobj = static_cast<AsemanViewportController*>(p->object);\n    aobj->p->routes.clear();\n    Q_EMIT aobj->routesChanged();\n}\n\nQList<AsemanViewportController *> AsemanViewportController::controllers(AsemanViewport *viewport)\n{\n    QList<AsemanViewportController *> res;\n    for (AsemanViewportController *controller: Private::controllers)\n        if (controller->p->viewport == viewport)\n            res << controller;\n    return res;\n}\n\nAsemanViewportController::~AsemanViewportController()\n{\n    Private::controllers.removeOne(this);\n    delete p;\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/asemanviewportcontroller.h",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANVIEWPORTCONTROLLER_H\n#define ASEMANVIEWPORTCONTROLLER_H\n\n#include <QObject>\n#include <QQmlListProperty>\n\n#include \"asemanviewport.h\"\n#include \"asemanviewportcontrollerroute.h\"\n\nclass AsemanViewportController : public QObject\n{\n    Q_OBJECT\n    class Private;\n    Q_PROPERTY(QQmlListProperty<AsemanViewportControllerRoute> routes READ routes NOTIFY routesChanged)\n    Q_PROPERTY(AsemanViewport* viewport READ viewport WRITE setViewport NOTIFY viewportChanged)\n    Q_PROPERTY(bool allowRecursiveTrigger READ allowRecursiveTrigger WRITE setAllowRecursiveTrigger NOTIFY allowRecursiveTriggerChanged)\n\n    Q_CLASSINFO(\"DefaultProperty\", \"routes\")\n\npublic:\n    AsemanViewportController(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanViewportController();\n\n    QQmlListProperty<AsemanViewportControllerRoute> routes();\n\n    void setViewport(AsemanViewport *viewport);\n    AsemanViewport *viewport() const;\n\n    bool allowRecursiveTrigger() const;\n    void setAllowRecursiveTrigger(bool allowRecursiveTrigger);\n\n    static QList<AsemanViewportController *> controllers(AsemanViewport *viewport = Q_NULLPTR);\n\npublic Q_SLOTS:\n    QVariantMap lookup(const QString &url, QVariantMap properties = QVariantMap(), AsemanViewport *viewport = Q_NULLPTR);\n\nQ_SIGNALS:\n    void routesChanged();\n    void viewportChanged();\n    void allowRecursiveTriggerChanged();\n\nprivate:\n    static void append(QQmlListProperty<AsemanViewportControllerRoute> *p, AsemanViewportControllerRoute *v);\n    static int count(QQmlListProperty<AsemanViewportControllerRoute> *p);\n    static AsemanViewportControllerRoute *at(QQmlListProperty<AsemanViewportControllerRoute> *p, int idx);\n    static void clear(QQmlListProperty<AsemanViewportControllerRoute> *p);\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanViewportController QAsemanViewportController;\n\n\n#endif // ASEMANVIEWPORTCONTROLLER_H\n"
  },
  {
    "path": "src/asemanqml/viewport/asemanviewportcontrollerroute.cpp",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanviewportcontrollerroute.h\"\n\n#include <QQmlContext>\n\nclass AsemanViewportControllerRoute::Private\n{\npublic:\n    QRegularExpression route;\n    QVariant component;\n    QString viewportType;\n};\n\nAsemanViewportControllerRoute::AsemanViewportControllerRoute(QObject *parent) :\n    QObject(parent)\n{\n    p = new Private;\n}\n\nQRegularExpression AsemanViewportControllerRoute::route() const\n{\n    return p->route;\n}\n\nvoid AsemanViewportControllerRoute::setRoute(const QRegularExpression &route)\n{\n    if (p->route == route)\n        return;\n\n    p->route = route;\n    Q_EMIT routeChanged();\n}\n\nQVariant AsemanViewportControllerRoute::component() const\n{\n    return p->component;\n}\n\nvoid AsemanViewportControllerRoute::setComponent(const QVariant &component)\n{\n    if (p->component == component)\n        return;\n\n    p->component = component;\n    Q_EMIT componentChanged();\n}\n\nQQmlComponent *AsemanViewportControllerRoute::sourceComponent() const\n{\n    return component().value<QQmlComponent*>();\n}\n\nvoid AsemanViewportControllerRoute::setSourceComponent(QQmlComponent *sourceComponent)\n{\n    setComponent( QVariant::fromValue(sourceComponent) );\n}\n\nQUrl AsemanViewportControllerRoute::source() const\n{\n    return component().toUrl();\n}\n\nvoid AsemanViewportControllerRoute::setSource(const QUrl &sourceComponent)\n{\n#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))\n    const QQmlContext *context = qmlContext(this);\n    auto loadUrl = sourceComponent;\n    if (context)\n        loadUrl = context->resolvedUrl(sourceComponent);\n\n    setComponent( QVariant::fromValue(loadUrl) );\n#else\n    setComponent( QVariant::fromValue(sourceComponent) );\n#endif\n}\n\nQString AsemanViewportControllerRoute::viewportType() const\n{\n    return p->viewportType;\n}\n\nvoid AsemanViewportControllerRoute::setViewportType(const QString &viewportType)\n{\n    if (p->viewportType == viewportType)\n        return;\n\n    p->viewportType = viewportType;\n    Q_EMIT viewportTypeChanged();\n}\n\nAsemanViewportControllerRoute::~AsemanViewportControllerRoute()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/asemanviewportcontrollerroute.h",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANVIEWPORTCONTROLLERROUTE_H\n#define ASEMANVIEWPORTCONTROLLERROUTE_H\n\n#include <QObject>\n#include <QVariant>\n#include <QUrl>\n#include <QQmlComponent>\n#include <QRegularExpression>\n\nclass AsemanViewportControllerRoute : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QRegularExpression route READ route WRITE setRoute NOTIFY routeChanged)\n    Q_PROPERTY(QQmlComponent* sourceComponent READ sourceComponent WRITE setSourceComponent NOTIFY componentChanged)\n    Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY componentChanged)\n    Q_PROPERTY(QString viewportType READ viewportType WRITE setViewportType NOTIFY viewportTypeChanged)\n    Q_CLASSINFO(\"DefaultProperty\", \"sourceComponent\")\n\n    class Private;\n\npublic:\n    AsemanViewportControllerRoute(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanViewportControllerRoute();\n\n    QRegularExpression route() const;\n    void setRoute(const QRegularExpression &route);\n\n    QVariant component() const;\n    void setComponent(const QVariant &component);\n\n    QQmlComponent *sourceComponent() const;\n    void setSourceComponent(QQmlComponent *sourceComponent);\n\n    QUrl source() const;\n    void setSource(const QUrl &sourceComponent);\n\n    QString viewportType() const;\n    void setViewportType(const QString &viewportType);\n\nQ_SIGNALS:\n    void routeChanged();\n    void componentChanged();\n    void viewportTypeChanged();\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanViewportControllerRoute QAsemanViewportControllerRoute;\n\n#endif // ASEMANVIEWPORTCONTROLLERROUTE_H\n"
  },
  {
    "path": "src/asemanqml/viewport/asemanviewportitem.cpp",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanviewportitem.h\"\n\nclass AsemanViewportItem::Private\n{\npublic:\n    QString name;\n    QVariant component;\n};\n\nAsemanViewportItem::AsemanViewportItem(QObject *parent) :\n    QObject(parent)\n{\n    p = new Private;\n}\n\nAsemanViewportItem::AsemanViewportItem(const QString &name, const QVariant &component, QObject *parent) :\n    AsemanViewportItem(parent)\n{\n    p->name = name;\n    p->component = component;\n}\n\nQString AsemanViewportItem::name() const\n{\n    return p->name;\n}\n\nvoid AsemanViewportItem::setName(const QString &name)\n{\n    if (p->name == name)\n        return;\n\n    p->name = name;\n    Q_EMIT nameChanged();\n}\n\nQVariant AsemanViewportItem::component() const\n{\n    return p->component;\n}\n\nvoid AsemanViewportItem::setComponent(const QVariant &component)\n{\n    if (p->component == component)\n        return;\n\n    p->component = component;\n    Q_EMIT componentChanged();\n}\n\nAsemanViewportItem::~AsemanViewportItem()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/asemanviewportitem.h",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANVIEWPORTITEM_H\n#define ASEMANVIEWPORTITEM_H\n\n#include <QObject>\n#include <QVariant>\n\nclass AsemanViewportItem : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)\n    Q_PROPERTY(QVariant component READ component WRITE setComponent NOTIFY componentChanged)\n\n    class Private;\n\npublic:\n    AsemanViewportItem(QObject *parent = Q_NULLPTR);\n    AsemanViewportItem(const QString &name, const QVariant &component, QObject *parent = Q_NULLPTR);\n    virtual ~AsemanViewportItem();\n\n    QString name() const;\n    void setName(const QString &name);\n\n    QVariant component() const;\n    void setComponent(const QVariant &component);\n\nQ_SIGNALS:\n    void nameChanged();\n    void componentChanged();\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanViewportItem QAsemanViewportItem;\n\n#endif // ASEMANVIEWPORTITEM_H\n"
  },
  {
    "path": "src/asemanqml/viewport/asemanviewportplugin.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanviewportplugin.h\"\n\n#include \"asemanqttoolsitemviewport.h\"\n\n#include <QDebug>\n#include <QDir>\n#include <QStringList>\n#include <QtQml>\n\n#ifdef QT_ASEMAN_EMBEDDED\nbool asemanqml_viewport_plugin_registered = AsemanViewportPlugin::registerStaticTypes(\"AsemanQml.Viewport\");\n#endif\n\nbool AsemanViewportPlugin::registerStaticTypes(const char *uri)\n{\n    Q_INIT_RESOURCE(qmake_asemanviewport);\n    AsemanQtToolsItemViewport::registerTypes(uri);\n    AsemanQtToolsItemViewport::registerFiles(QStringLiteral(\":/AsemanQml/Viewport\"), uri);\n    return true;\n}\n\nvoid AsemanViewportPlugin::registerTypes(const char *uri)\n{\n    AsemanViewportPlugin::registerStaticTypes(uri);\n}\n\nvoid AsemanViewportPlugin::initializeEngine(QQmlEngine *engine, const char *uri)\n{\n    QQmlExtensionPlugin::initializeEngine(engine, uri);\n    AsemanQtTools::initializeEngine(engine, uri);\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/asemanviewportplugin.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANVIEWPORTPLUGIN_H\n#define ASEMANVIEWPORTPLUGIN_H\n\n#include <QQmlExtensionPlugin>\n\nclass AsemanViewportPlugin : public QQmlExtensionPlugin\n{\n    Q_OBJECT\n\n#ifndef QT_ASEMAN_EMBEDDED\n    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)\n#endif\n\npublic:\n    static bool registerStaticTypes(const char *uri);\n\n    void registerTypes(const char *uri);\n    void initializeEngine(QQmlEngine *engine, const char *uri);\n};\n\n#endif // ASEMANVIEWPORTPLUGIN_H\n"
  },
  {
    "path": "src/asemanqml/viewport/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Viewport 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.0\"]\n    Component {\n        name: \"AsemanAbstractViewportType\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Viewport/AbstractViewportTypeCore 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"backgroundItem\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"foregroundItem\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"viewport\"; type: \"AsemanViewport\"; isPointer: true }\n        Property { name: \"open\"; type: \"bool\" }\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"gestureWidthIsNull\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"maximumWidthIsNull\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"typeTransformOrigin\"; type: \"QPointF\" }\n        Property { name: \"typeTransformOriginIsNull\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"touchToCloseIsNull\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"blockBackIsNull\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"sourceObject\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"sourceObjectIsNull\"; type: \"bool\"; isReadonly: true }\n    }\n    Component {\n        name: \"AsemanViewport\"\n        defaultProperty: \"data\"\n        prototype: \"QQuickItem\"\n        exports: [\"AsemanQml.Viewport/ViewportCore 2.0\"]\n        exportMetaObjectRevisions: [0]\n        attachedType: \"AsemanViewportAttechedProperty\"\n        Property { name: \"items\"; type: \"AsemanViewportItem\"; isList: true; isReadonly: true }\n        Property { name: \"keys\"; type: \"QStringList\"; isReadonly: true }\n        Property { name: \"primaryViewport\"; type: \"bool\" }\n        Signal { name: \"viewportChanged\" }\n        Method {\n            name: \"getComponent\"\n            type: \"QVariant\"\n            Parameter { name: \"name\"; type: \"string\" }\n        }\n        Method {\n            name: \"createComponent\"\n            type: \"QQmlComponent*\"\n            Parameter { name: \"fileUrl\"; type: \"QUrl\" }\n            Parameter { name: \"asyn\"; type: \"bool\" }\n        }\n        Method {\n            name: \"createComponent\"\n            type: \"QQmlComponent*\"\n            Parameter { name: \"fileUrl\"; type: \"QUrl\" }\n        }\n    }\n    Component {\n        name: \"AsemanViewportAttechedProperty\"\n        prototype: \"QObject\"\n        Property { name: \"controller\"; type: \"QObject\"; isReadonly: true; isPointer: true }\n        Property { name: \"allControllers\"; type: \"QList<QObject*>\"; isReadonly: true }\n        Property { name: \"viewport\"; type: \"AsemanViewport\"; isReadonly: true; isPointer: true }\n        Property { name: \"primaryViewport\"; type: \"AsemanViewport\"; isReadonly: true; isPointer: true }\n        Signal { name: \"controllersChanged\" }\n    }\n    Component {\n        name: \"AsemanViewportController\"\n        defaultProperty: \"routes\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Viewport/ViewportControllerCore 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"routes\"; type: \"AsemanViewportControllerRoute\"; isList: true; isReadonly: true }\n        Property { name: \"viewport\"; type: \"AsemanViewport\"; isPointer: true }\n        Property { name: \"allowRecursiveTrigger\"; type: \"bool\" }\n        Method {\n            name: \"lookup\"\n            type: \"QVariantMap\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"properties\"; type: \"QVariantMap\" }\n            Parameter { name: \"viewport\"; type: \"AsemanViewport\"; isPointer: true }\n        }\n        Method {\n            name: \"lookup\"\n            type: \"QVariantMap\"\n            Parameter { name: \"url\"; type: \"string\" }\n            Parameter { name: \"properties\"; type: \"QVariantMap\" }\n        }\n        Method {\n            name: \"lookup\"\n            type: \"QVariantMap\"\n            Parameter { name: \"url\"; type: \"string\" }\n        }\n    }\n    Component {\n        name: \"AsemanViewportControllerRoute\"\n        defaultProperty: \"sourceComponent\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Viewport/ViewportControllerRoute 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"route\"; type: \"QRegularExpression\" }\n        Property { name: \"sourceComponent\"; type: \"QQmlComponent\"; isPointer: true }\n        Property { name: \"source\"; type: \"QUrl\" }\n        Property { name: \"viewportType\"; type: \"string\" }\n        Signal { name: \"componentChanged\" }\n    }\n    Component {\n        name: \"AsemanViewportItem\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Viewport/ViewportItem 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"name\"; type: \"string\" }\n        Property { name: \"component\"; type: \"QVariant\" }\n    }\n    Component {\n        name: \"AsemanViewportType\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Viewport/ViewportType 2.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        attachedType: \"AsemanViewportTypeAttechedProperty\"\n    }\n    Component {\n        name: \"AsemanViewportTypeAttechedProperty\"\n        prototype: \"QObject\"\n        Property { name: \"gestureWidth\"; type: \"double\" }\n        Property { name: \"maximumWidth\"; type: \"double\" }\n        Property { name: \"transformOrigin\"; type: \"QPointF\" }\n        Property { name: \"touchToClose\"; type: \"bool\" }\n        Property { name: \"blockBack\"; type: \"bool\" }\n        Property { name: \"sourceObject\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"open\"; type: \"bool\" }\n        Signal { name: \"typeTransformOriginChanged\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/AbstractViewportType 2.0\"\n        exports: [\"AsemanQml.Viewport/AbstractViewportType 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/AndroidActivityViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/AndroidActivityViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"openRatio\"; type: \"double\" }\n        Property { name: \"mouseRatio\"; type: \"double\" }\n        Property { name: \"realRatio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/AndroidBottomDrawerViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/AndroidBottomDrawerViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"openRatio\"; type: \"double\" }\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/AndroidDefaultPagesViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/AndroidDefaultPagesViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/AndroidDialogViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/AndroidDialogViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/IOSBottomDrawerViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/IOSBottomDrawerViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"openRatio\"; type: \"double\" }\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/IOSContextMenuViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/IOSContextMenuViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/IOSDialogViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/IOSDialogViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/IOSNormalViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/IOSNormalViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"openRatio\"; type: \"double\" }\n        Property { name: \"mouseRatio\"; type: \"double\" }\n        Property { name: \"foregroundX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/IOSPopupViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/IOSPopupViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"topPadSize\"; type: \"double\"; isReadonly: true }\n        Property { name: \"openRatio\"; type: \"double\" }\n        Property { name: \"mouseRatio\"; type: \"double\" }\n        Property { name: \"foregroundScale\"; type: \"double\"; isReadonly: true }\n        Property { name: \"foregroundHeight\"; type: \"double\"; isReadonly: true }\n        Property { name: \"realRatio\"; type: \"double\"; isReadonly: true }\n        Property { name: \"tabletMode\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"isIOSPopup\"; type: \"bool\"; isReadonly: true }\n        Property { name: \"nextItem\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"iosBelowIndex\"; type: \"int\"; isReadonly: true }\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/NoneViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/NoneViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanAbstractViewportType\"\n        name: \"AsemanQml.Viewport/SplitedViewport 2.0\"\n        exports: [\"AsemanQml.Viewport/SplitedViewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"openRatio\"; type: \"double\" }\n        Property { name: \"mouseRatio\"; type: \"double\" }\n        Property { name: \"foregroundX\"; type: \"double\"; isReadonly: true }\n        Property { name: \"list\"; type: \"AsemanListObject\"; isPointer: true }\n        Property { name: \"fillForeground\"; type: \"bool\" }\n        Property { name: \"index\"; type: \"int\" }\n        Property { name: \"count\"; type: \"int\" }\n        Property { name: \"openedType\"; type: \"string\" }\n        Property { name: \"ratio\"; type: \"double\" }\n        Property { name: \"background\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"backgroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Property { name: \"foreground\"; type: \"RoundedItem_QMLTYPE_3\"; isReadonly: true; isPointer: true }\n        Property { name: \"foregroundScene\"; type: \"QQuickRectangle\"; isReadonly: true; isPointer: true }\n        Method { name: \"back\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanViewport\"\n        name: \"AsemanQml.Viewport/Viewport 2.0\"\n        exports: [\"AsemanQml.Viewport/Viewport 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"data\"\n        Property { name: \"androidStyle\"; type: \"bool\" }\n        Property { name: \"mainItem\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"currentItem\"; type: \"QQuickItem\"; isReadonly: true; isPointer: true }\n        Property { name: \"currentType\"; type: \"string\"; isReadonly: true }\n        Property { name: \"count\"; type: \"int\"; isReadonly: true }\n        Property { name: \"list\"; type: \"QVariantList\" }\n        Method {\n            name: \"append\"\n            type: \"QVariant\"\n            Parameter { name: \"component\"; type: \"QVariant\" }\n            Parameter { name: \"properties\"; type: \"QVariant\" }\n            Parameter { name: \"type\"; type: \"QVariant\" }\n        }\n        Method { name: \"closeLast\"; type: \"QVariant\" }\n    }\n    Component {\n        prototype: \"AsemanViewportController\"\n        name: \"AsemanQml.Viewport/ViewportController 2.0\"\n        exports: [\"AsemanQml.Viewport/ViewportController 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"routes\"\n        Method {\n            name: \"trigger\"\n            type: \"QVariant\"\n            Parameter { name: \"url\"; type: \"QVariant\" }\n            Parameter { name: \"properties\"; type: \"QVariant\" }\n            Parameter { name: \"viewport\"; type: \"QVariant\" }\n        }\n    }\n    Component {\n        prototype: \"QQuickItem\"\n        name: \"AsemanQml.Viewport/ViewportPage 2.0\"\n        exports: [\"AsemanQml.Viewport/ViewportPage 2.0\"]\n        exportMetaObjectRevisions: [0]\n        isComposite: true\n        defaultProperty: \"pageData\"\n        Property { name: \"header\"; type: \"QQuickItem\"; isPointer: true }\n        Property { name: \"title\"; type: \"string\" }\n        Property { name: \"pageData\"; type: \"QObject\"; isList: true; isReadonly: true }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/viewport/qmake_asemanviewport.qrc",
    "content": "<!DOCTYPE RCC><RCC version=\"1.0\">\n<qresource prefix=\"/AsemanQml/\">\n<file>Viewport/AbstractViewportType.qml</file>\n<file>Viewport/AndroidActivityViewport.qml</file>\n<file>Viewport/AndroidBottomDrawerViewport.qml</file>\n<file>Viewport/AndroidDefaultPagesViewport.qml</file>\n<file>Viewport/AndroidDialogViewport.qml</file>\n<file>Viewport/IOSBottomDrawerViewport.qml</file>\n<file>Viewport/IOSContextMenuViewport.qml</file>\n<file>Viewport/IOSDialogViewport.qml</file>\n<file>Viewport/IOSNormalViewport.qml</file>\n<file>Viewport/IOSPopupViewport.qml</file>\n<file>Viewport/NoneViewport.qml</file>\n<file>Viewport/SplitedViewport.qml</file>\n<file>Viewport/Viewport.qml</file>\n<file>Viewport/ViewportController.qml</file>\n<file>Viewport/ViewportPage.qml</file>\n<file>Viewport/qmldir</file>\n</qresource>\n</RCC>\n"
  },
  {
    "path": "src/asemanqml/viewport/qmldir",
    "content": "module AsemanQml.Viewport\nclassname AsemanViewportPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlviewport\ndepends AsemanQml.Base 2.0\n"
  },
  {
    "path": "src/asemanqml/viewport/viewport.pri",
    "content": "INCLUDEPATH += $$PWD\nQT += core gui network quick\n\nHEADERS += \\\n    $$PWD/asemanviewportplugin.h \\\n    $$PWD/asemanqttoolsitemviewport.h \\\n    $$PWD/asemanviewport.h \\\n    $$PWD/asemanviewportcontroller.h \\\n    $$PWD/asemanviewportcontrollerroute.h \\\n    $$PWD/asemanviewportitem.h \\\n    $$PWD/asemanabstractviewporttype.h\n\nSOURCES += \\\n    $$PWD/asemanviewportplugin.cpp \\\n    $$PWD/asemanqttoolsitemviewport.cpp \\\n    $$PWD/asemanviewport.cpp \\\n    $$PWD/asemanviewportcontroller.cpp \\\n    $$PWD/asemanviewportcontrollerroute.cpp \\\n    $$PWD/asemanviewportitem.cpp \\\n    $$PWD/asemanabstractviewporttype.cpp\n\nstatic: !linux: !win32: DEFINES += ASEMAN_STATIC_BUILD\n\nASEMAN_QML_FILES = $$files($$PWD/Viewport/*.*) $$PWD/Viewport/qmldir\n\nINCLUDED_RESOURCE_FILES = \\\n    $$ASEMAN_QML_FILES\n\nasemanviewport.files = $$INCLUDED_RESOURCE_FILES\nasemanviewport.prefix = /AsemanQml/\n\ncontains(DEFINES, QT_ASEMAN_EMBEDDED) {\n    RESOURCES += $$PWD/qmake_asemanviewport.qrc\n} else {\n    RESOURCES += asemanviewport\n}\n\nDISTFILES += \\\n    Viewport/ViewportController.qml\n\n"
  },
  {
    "path": "src/asemanqml/viewport/viewport.pro",
    "content": "TARGET  = asemanqmlviewport\nTARGETPATH = AsemanQml/Viewport\nIMPORT_VERSION = 2.0\n\nQT += asemanqml asemangui asemancore\n\ninclude(viewport.pri)\n\nload(qml_plugin)\n\n\n"
  },
  {
    "path": "src/asemanqml/widgets/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanwidgetsplugin.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemwidgets.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanwidgetsplugin.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttoolsitemwidgets.cpp\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/asemanqml/widgets/asemanqttoolsitemwidgets.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtToolsItemWidgets is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtToolsItemWidgets is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanqttoolsitemwidgets.h\"\n#include \"asemannotification.h\"\n#include \"asemanfonthandler.h\"\n#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS)\n#include \"asemansystemtray.h\"\n#endif\n\n#include <qqml.h>\n#include <QHash>\n#include <QPointer>\n#include <QFile>\n#include <QDir>\n#include <QSet>\n\nstatic QStringList aseman_qt_tools_indexCache;\nstatic QString aseman_qt_tools_destination;\n\nvoid AsemanQtToolsItemWidgets::registerTypes(const char *uri, bool exportMode)\n{\n    static QSet<QByteArray> register_list;\n    if(register_list.contains(uri) && !exportMode)\n        return;\n\n#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS)\n    registerType<AsemanSystemTray>(uri, 2, 0, \"SystemTray\", exportMode);\n#endif\n    registerType<AsemanNotification>(uri, 2, 0, \"Notification\", exportMode);\n    registerType<AsemanFontHandler>(uri, 2, 0, \"FontHandler\", exportMode);\n\n    register_list.insert(uri);\n}\n\nvoid AsemanQtToolsItemWidgets::registerFiles(const QString &filesLocation, const char *uri)\n{\n    QFile file(filesLocation + QStringLiteral(\"/qmldir\"));\n    if(file.open(QFile::ReadOnly))\n    {\n        QStringList lines = QString::fromUtf8(file.readAll()).split(QStringLiteral(\"\\n\"), Qt::SkipEmptyParts);\n        file.close();\n\n        for(const QString &l: lines)\n        {\n            QStringList parts = l.trimmed().split(QStringLiteral(\" \"), Qt::SkipEmptyParts);\n            bool singleton = false;\n            if(parts.count() && parts.first() == \"singleton\")\n                singleton = parts.takeFirst().count();\n            if(parts.length() != 3)\n                continue;\n\n            QStringList version = parts.at(1).split(QStringLiteral(\".\"), Qt::SkipEmptyParts);\n            if(version.count() != 2)\n                continue;\n\n            if(singleton)\n                qmlRegisterSingletonType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                         uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n            else\n                qmlRegisterType(QUrl(QStringLiteral(\"qrc\") + filesLocation + QStringLiteral(\"/\") + parts.at(2)),\n                                uri, version.at(0).toInt(), version.at(1).toInt(), parts.at(0).toUtf8());\n        }\n    }\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemWidgets::registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemWidgets::registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode)\n{\n    if(exportMode)\n        exportModel<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterType<T>(uri, versionMajor, versionMinor, typeName);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemWidgets::registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(typeName));\n    else\n        return qmlRegisterSingletonType<T>(uri, versionMajor, versionMinor, typeName, callback);\n    return 0;\n}\n\ntemplate<typename T>\nint AsemanQtToolsItemWidgets::registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason, bool exportMode)\n{\n    if(exportMode)\n        exportItem<T>(QString::fromUtf8(uri), versionMajor, versionMinor, QString::fromUtf8(qmlName));\n    else\n        return qmlRegisterUncreatableType<T>(uri, versionMajor, versionMinor, qmlName, reason);\n    return 0;\n}\n\n\nvoid AsemanQtToolsItemWidgets::exportDocuments(const QString &destination)\n{\n    aseman_qt_tools_destination = destination;\n\n    QDir().mkpath(aseman_qt_tools_destination);\n    aseman_qt_tools_indexCache.clear();\n\n    AsemanQtToolsItemWidgets::registerTypes(\"AsemanToolsItem\", true);\n\n    QString index = QStringLiteral(\"# AsemanToolsItem Documents\\n\\n\");\n    index += QStringLiteral(\"### [Getting Started](gettingstarted.md)\\n\\n\");\n    index += QStringLiteral(\"### How to import:\\n\\n\");\n    index += QStringLiteral(\"```c++\\nimport AsemanQml.Base 2.0\\n```\\n\\nor\\n\\n\"\n             \"```c++\\nimport AsemanQml.Base 2.0 as Aseman\\n```\\n\\n\");\n    index += QStringLiteral(\"### Types\\n\\nHere are all components of the AsemanToolsItem:\\n\\n\");\n    for(const QString cmpnt: aseman_qt_tools_indexCache)\n    {\n        if(cmpnt == QStringLiteral(\"MimeData\"))\n            index += QStringLiteral(\"\\n##### Normal types\\n\\n\");\n        if(cmpnt == QStringLiteral(\"MixedListModel\"))\n            index += QStringLiteral(\"\\n##### Models\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Devices\"))\n            index += QStringLiteral(\"\\n##### Singletons\\n\\n\");\n        if(cmpnt == QStringLiteral(\"Screen\"))\n            index += QStringLiteral(\"\\n##### Uncreatable types\\n\\n\");\n        index += QStringLiteral(\" * [%1](%2.md)\\n\").arg(cmpnt).arg(cmpnt.toLower());\n    }\n\n    QString path = aseman_qt_tools_destination + \"/start.md\";\n    aseman_qt_tools_destination.clear();\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return;\n\n    file.write(index.toUtf8());\n    file.close();\n}\n\nQString AsemanQtToolsItemWidgets::fixType(const QString &type)\n{\n    if(type == QStringLiteral(\"QSizeF\") || type == QStringLiteral(\"QSize\"))\n        return QStringLiteral(\"size\");\n    if(type == QStringLiteral(\"QPoint\") || type == QStringLiteral(\"QPointF\"))\n        return QStringLiteral(\"point\");\n    if(type == QStringLiteral(\"QUrl\"))\n        return QStringLiteral(\"url\");\n    if(type == QStringLiteral(\"QString\"))\n        return QStringLiteral(\"string\");\n    if(type == QStringLiteral(\"QByteArray\"))\n        return QStringLiteral(\"byte\");\n    if(type == QStringLiteral(\"bool\"))\n        return QStringLiteral(\"boolean\");\n    if(type == QStringLiteral(\"double\") || type == QStringLiteral(\"qreal\"))\n        return QStringLiteral(\"real\");\n    if(type == QStringLiteral(\"QVariant\"))\n        return QStringLiteral(\"variant\");\n    if(type == QStringLiteral(\"QJSValue\"))\n        return QStringLiteral(\"function(){[code]}\");\n    if(type == QStringLiteral(\"QVariantMap\"))\n        return QStringLiteral(\"map\");\n    if(type == QStringLiteral(\"QVariantList\"))\n        return QStringLiteral(\"list&lt;variant&gt;\");\n    if(type == QStringLiteral(\"QStringList\"))\n        return QStringLiteral(\"list&lt;string&gt;\");\n    if(type == QStringLiteral(\"QList<qint32>\"))\n        return QStringLiteral(\"list&lt;int&gt;\");\n    if(type.contains(QStringLiteral(\"*\")))\n    {\n        if(type == QStringLiteral(\"QObject*\"))\n            return QStringLiteral(\"object\");\n        if(type.contains(QStringLiteral(\"Telegram\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Telegram\"));\n            return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n        }\n        if(type.contains(QStringLiteral(\"Object\")))\n        {\n            QString name = QString(type).remove(QStringLiteral(\"*\")).remove(QStringLiteral(\"Object\"));\n            return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                    .arg(name).arg(name.toLower());\n        }\n        if(type == QStringLiteral(\"QQmlComponent*\"))\n            return QStringLiteral(\"Component\");\n        if(type == QStringLiteral(\"QQuickItem\"))\n            return QStringLiteral(\"Item\");\n    }\n    if(type.contains(QStringLiteral(\"Telegram\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Telegram\"));\n        return QStringLiteral(\"[%1](%2.md)\").arg(name).arg(name.toLower());\n    }\n    if(type == QStringLiteral(\"QQuickItem\"))\n        return QStringLiteral(\"Item\");\n    if(type == QStringLiteral(\"QObject\"))\n        return QStringLiteral(\"object\");\n    if(type.contains(QStringLiteral(\"Object\")))\n    {\n        QString name = QString(type).remove(QStringLiteral(\"Object\"));\n        return QStringLiteral(\"[%1](https://github.com/Aseman-Land/libqtelegram-aseman-edition/blob/API51/telegram/documents/types/%2.md)\")\n                .arg(name).arg(name.toLower());\n    }\n    return type;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemWidgets::exportItem(const QString &module, int major, int minor, const QString &component, bool store)\n{\n    QString result;\n    aseman_qt_tools_indexCache << component;\n\n    QMetaObject meta = T::staticMetaObject;\n    QString inherits = fixType(QString::fromUtf8(meta.superClass()? meta.superClass()->className() : \"\"));\n    bool isModel = component.toLower().contains(QStringLiteral(\"model\"));\n\n    result += QStringLiteral(\"# %1\\n\\n\").arg(component);\n\n    QString headers;\n    headers += QStringLiteral(\" * [Component details](#component-details)\\n\");\n\n    QString details = QStringLiteral(\"\\n### Component details:\\n\\n\");\n    details += QStringLiteral(\"|Detail|Value|\\n\"\n                       \"|------|-----|\\n\");\n    details += QStringLiteral(\"|%1|%2 %3.%4|\\n\").arg(QStringLiteral(\"Import\")).arg(module).arg(major).arg(minor);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Component\")).arg(component);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"C++ class\")).arg(QString::fromUtf8(meta.className()));\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Inherits\")).arg(inherits);\n    details += QStringLiteral(\"|%1|<font color='#074885'>%2</font>|\\n\").arg(QStringLiteral(\"Model\")).arg(QString::fromUtf8(isModel?\"Yes\":\"No\"));\n\n    QString resultProperties;\n    QStringList propertiesSignals;\n    for(int i=0; i<meta.propertyCount(); i++)\n    {\n        QMetaProperty property = meta.property(i);\n        const QString &propertyName = QString::fromUtf8(property.name());\n        const QString &propertyType = fixType(QString::fromUtf8(property.typeName()));\n        propertiesSignals << QString::fromUtf8(property.notifySignal().name());\n\n        QString text = QStringLiteral(\"* <font color='#074885'><b>%1</b></font>: %2\").arg(propertyName).arg(propertyType);\n        if(!property.isWritable())\n            text += QStringLiteral(\" (readOnly)\");\n\n        text += QStringLiteral(\"\\n\");\n        if(meta.propertyOffset()<=i)\n            resultProperties += text;\n    }\n\n    QString enumResults;\n    for(int i=meta.enumeratorOffset(); i<meta.enumeratorCount(); i++)\n    {\n        QMetaEnum enumerator = meta.enumerator(i);\n        const QString &enumName = QString::fromUtf8(enumerator.name());\n\n        enumResults += QStringLiteral(\"\\n##### %1\\n\\n\").arg(enumName);\n        enumResults += QStringLiteral(\"|Key|Value|\\n\"\n                               \"|---|-----|\\n\");\n\n        for(int j=0; j<enumerator.keyCount(); j++)\n            enumResults += QStringLiteral(\"|%1|%2|\\n\").arg(QString::fromUtf8(enumerator.key(j))).arg(enumerator.value(j));\n    }\n\n    QString resultSlots;\n    QString resultSignals;\n    for(int i=meta.methodOffset(); i<meta.methodCount(); i++)\n    {\n        QMetaMethod method = meta.method(i);\n        if(method.access() != QMetaMethod::Public)\n            continue;\n\n        const QString &methodName = QString::fromUtf8(method.name());\n        if(propertiesSignals.contains(methodName))\n            continue;\n\n        const QString &methodType = fixType(QString::fromUtf8(method.typeName()));\n\n        QString args;\n        const QList<QByteArray> &paramNames = method.parameterNames();\n        const QList<QByteArray> &paramTypes = method.parameterTypes();\n        for(int j=0; j<paramNames.count(); j++)\n        {\n            if(j != 0)\n                args += QStringLiteral(\", \");\n\n            args += fixType(QString::fromUtf8(paramTypes[j])) + QStringLiteral(\" \") + paramNames[j];\n        }\n\n        QString text = QStringLiteral(\" * %1 <font color='#074885'><b>%2</b></font>(%3)\\n\").arg(methodType).arg(methodName).arg(args);\n        switch(static_cast<int>(method.methodType()))\n        {\n        case QMetaMethod::Slot:\n            resultSlots += text;\n            break;\n        case QMetaMethod::Signal:\n            resultSignals += text;\n            break;\n        }\n    }\n\n    if(!resultProperties.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Normal Properties](#normal-properties)\\n\");\n        resultProperties = QStringLiteral(\"\\n### Normal Properties\\n\\n\") + resultProperties;\n    }\n    if(!enumResults.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Enumerator](#enumerator)\\n\");\n        enumResults = QStringLiteral(\"\\n### Enumerator\\n\\n\") + enumResults;\n    }\n    if(!resultSlots.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Methods](#methods)\\n\");\n        resultSlots = QStringLiteral(\"\\n### Methods\\n\\n\") + resultSlots;\n    }\n    if(!resultSignals.isEmpty())\n    {\n        headers += QStringLiteral(\" * [Signals](#Q_SIGNALS)\\n\");\n        resultSignals = QStringLiteral(\"\\n### Signals\\n\\n\") + resultSignals;\n    }\n    if(isModel)\n        headers += QStringLiteral(\" * [Roles](#roles)\\n\");\n\n    result += headers + QStringLiteral(\"\\n\");\n    result += details + QStringLiteral(\"\\n\");\n    result += resultProperties + QStringLiteral(\"\\n\");\n    result += resultSlots + QStringLiteral(\"\\n\");\n    result += resultSignals + QStringLiteral(\"\\n\");\n    result += enumResults + QStringLiteral(\"\\n\");\n\n    if(!store)\n        return result;\n\n    QString path = aseman_qt_tools_destination + QStringLiteral(\"/\") + component.toLower() + QStringLiteral(\".md\");\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n\ntemplate<typename T>\nQString AsemanQtToolsItemWidgets::exportModel(const QString &module, int major, int minor, const QString &component)\n{\n    QString result = exportItem<T>(module, major, minor, component, false);\n    T *model = new T();\n\n    QHash<qint32,QByteArray> roleNames = model->roleNames();\n    QMap<qint32,QByteArray> rolesMap;\n    QHashIterator<qint32,QByteArray> i(roleNames);\n    while(i.hasNext())\n    {\n        i.next();\n        rolesMap[i.key()] = i.value();\n    }\n\n    result += QStringLiteral(\"\\n### Roles\\n\\n\");\n    Q_FOREACH(const QByteArray &name, rolesMap)\n        result += QStringLiteral(\" * model.<font color='#074885'>%1</font>\\n\").arg(QString::fromUtf8(name));\n\n    delete model;\n\n    QString path = aseman_qt_tools_destination + \"/\" + component.toLower() + \".md\";\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return result;\n\n    file.write(result.toUtf8());\n    file.close();\n    return result;\n}\n"
  },
  {
    "path": "src/asemanqml/widgets/asemanqttoolsitemwidgets.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQTTOOLSITEMWIDGETS_H\n#define ASEMANQTTOOLSITEMWIDGETS_H\n\n#include <QtGlobal>\n#include <QString>\n\n#include <asemanqttools.h>\n\nclass QObject;\nclass QQmlEngine;\nclass QJSEngine;\nclass AsemanQtToolsItemWidgets: public AsemanQtTools\n{\npublic:\n    static void registerTypes(const char *uri, bool exportMode = false);\n    static void registerFiles(const QString &filesLocation, const char *uri);\n\n    template<typename T>\n    static int registerType(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template<typename T>\n    static int registerModel(const char *uri, int versionMajor, int versionMinor, const char *typeName, bool exportMode);\n\n    template <typename T>\n    static int registerSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName,\n                                 QObject *(*callback)(QQmlEngine *, QJSEngine *), bool exportMode);\n\n    template<typename T>\n    static int registerUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString& reason, bool exportMode);\n\n    static void exportDocuments(const QString &destination);\n\nprotected:\n    template<typename T>\n    static QString exportItem(const QString &module, int major, int minor, const QString &component, bool store = true);\n    template<typename T>\n    static QString exportModel(const QString &module, int major, int minor, const QString &component);\n\n    static QString fixType(const QString &type);\n};\n\n#endif // ASEMANQTTOOLSITEMWIDGETS_H\n"
  },
  {
    "path": "src/asemanqml/widgets/asemanwidgetsplugin.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanwidgetsplugin.h\"\n\n#include \"asemanqttoolsitemwidgets.h\"\n\n#include <QDebug>\n#include <QDir>\n#include <QStringList>\n#include <QtQml>\n\n#ifdef QT_ASEMAN_EMBEDDED\nbool asemanqml_widgets_plugin_registered = AsemanWidgetsPlugin::registerStaticTypes(\"AsemanQml.Widgets\");\n#endif\n\nbool AsemanWidgetsPlugin::registerStaticTypes(const char *uri)\n{\n    AsemanQtToolsItemWidgets::registerTypes(uri);\n    AsemanQtToolsItemWidgets::registerFiles(QStringLiteral(\":/AsemanQml/Widgets\"), uri);\n    return true;\n}\n\nvoid AsemanWidgetsPlugin::registerTypes(const char *uri)\n{\n    AsemanWidgetsPlugin::registerStaticTypes(uri);\n}\n\nvoid AsemanWidgetsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)\n{\n    QQmlExtensionPlugin::initializeEngine(engine, uri);\n    AsemanQtTools::initializeEngine(engine, uri);\n}\n"
  },
  {
    "path": "src/asemanqml/widgets/asemanwidgetsplugin.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANWIDGETSPLUGIN_H\n#define ASEMANWIDGETSPLUGIN_H\n\n#include <QQmlExtensionPlugin>\n\nclass AsemanWidgetsPlugin : public QQmlExtensionPlugin\n{\n    Q_OBJECT\n\n#ifndef QT_ASEMAN_EMBEDDED\n    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)\n#endif\n\npublic:\n    static bool registerStaticTypes(const char *uri);\n\n    void registerTypes(const char *uri);\n    void initializeEngine(QQmlEngine *engine, const char *uri);\n};\n\n#endif // ASEMANWIDGETSPLUGIN_H\n"
  },
  {
    "path": "src/asemanqml/widgets/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable AsemanQml.Widgets 2.0'\n\nModule {\n    dependencies: [\"QtQuick 2.8\"]\n    Component {\n        name: \"AsemanLinuxNativeNotification\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Widgets/Notification 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Property { name: \"color\"; type: \"QColor\" }\n        Signal {\n            name: \"notifyClosed\"\n            Parameter { name: \"id\"; type: \"uint\" }\n        }\n        Signal {\n            name: \"notifyTimedOut\"\n            Parameter { name: \"id\"; type: \"uint\" }\n        }\n        Signal {\n            name: \"notifyAction\"\n            Parameter { name: \"id\"; type: \"uint\" }\n            Parameter { name: \"action\"; type: \"string\" }\n        }\n        Method {\n            name: \"sendNotify\"\n            type: \"uint\"\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"body\"; type: \"string\" }\n            Parameter { name: \"icon\"; type: \"string\" }\n            Parameter { name: \"replace_id\"; type: \"uint\" }\n            Parameter { name: \"timeOut\"; type: \"int\" }\n            Parameter { name: \"actions\"; type: \"QStringList\" }\n        }\n        Method {\n            name: \"sendNotify\"\n            type: \"uint\"\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"body\"; type: \"string\" }\n            Parameter { name: \"icon\"; type: \"string\" }\n            Parameter { name: \"replace_id\"; type: \"uint\" }\n            Parameter { name: \"timeOut\"; type: \"int\" }\n        }\n        Method {\n            name: \"sendNotify\"\n            type: \"uint\"\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"body\"; type: \"string\" }\n            Parameter { name: \"icon\"; type: \"string\" }\n            Parameter { name: \"replace_id\"; type: \"uint\" }\n        }\n        Method {\n            name: \"sendNotify\"\n            type: \"uint\"\n            Parameter { name: \"title\"; type: \"string\" }\n            Parameter { name: \"body\"; type: \"string\" }\n            Parameter { name: \"icon\"; type: \"string\" }\n        }\n        Method {\n            name: \"closeNotification\"\n            Parameter { name: \"id\"; type: \"uint\" }\n        }\n    }\n    Component {\n        name: \"AsemanSystemTray\"\n        prototype: \"QObject\"\n        exports: [\"AsemanQml.Widgets/SystemTray 2.0\"]\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"ActivateReason\"\n            values: {\n                \"ActivateUnknown\": 0,\n                \"ActivateContext\": 1,\n                \"ActivateDoubleClick\": 2,\n                \"ActivateTrigger\": 3,\n                \"ActivateMiddleClick\": 4\n            }\n        }\n        Property { name: \"visible\"; type: \"bool\" }\n        Property { name: \"icon\"; type: \"QUrl\" }\n        Property { name: \"badgeCount\"; type: \"int\" }\n        Property { name: \"badgeFillColor\"; type: \"QColor\" }\n        Property { name: \"badgeStrokeColor\"; type: \"QColor\" }\n        Property { name: \"badgeTextColor\"; type: \"QColor\" }\n        Property { name: \"menu\"; type: \"QStringList\" }\n        Signal {\n            name: \"activated\"\n            Parameter { name: \"reason\"; type: \"int\" }\n        }\n        Signal {\n            name: \"menuTriggered\"\n            Parameter { name: \"index\"; type: \"int\" }\n        }\n    }\n}\n"
  },
  {
    "path": "src/asemanqml/widgets/qmldir",
    "content": "module AsemanQml.Widgets\nclassname AsemanWidgetsPlugin\ntypeinfo plugins.qmltypes\nplugin declarative_asemanqmlwidgets\n"
  },
  {
    "path": "src/asemanqml/widgets/widgets.pri",
    "content": "INCLUDEPATH += $$PWD\nQT += core gui network widgets qml\n\nHEADERS += \\\n    $$PWD/asemanwidgetsplugin.h \\\n    $$PWD/asemanqttoolsitemwidgets.h\n\nSOURCES += \\\n    $$PWD/asemanwidgetsplugin.cpp \\\n    $$PWD/asemanqttoolsitemwidgets.cpp\n\nstatic: !linux: !win32: DEFINES += ASEMAN_STATIC_BUILD\n"
  },
  {
    "path": "src/asemanqml/widgets/widgets.pro",
    "content": "TARGET  = asemanqmlwidgets\nTARGETPATH = AsemanQml/Widgets\nIMPORT_VERSION = 2.0\n\nQT += asemanqml asemangui asemancore asemanwidgets\ninclude(widgets.pri)\n\nload(qml_plugin)\n"
  },
  {
    "path": "src/core/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanabstractlistmodel.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanautostartmanager.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemancalendarconverter.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemancalendarconvertercore.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemancalendarmodel.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemancountriesmodel.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandebugobjectcounter.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanencrypter.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanfilesystemmodel.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanglobals.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanhashobject.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanlistobject.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanlistrecord.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmixedlistmodel.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqtlogger.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemansettings.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemansimpleqtcryptor.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemancore_global.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/aseman_macros.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/private/serpent_sbox.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmapobject.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanrefresherobject.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanlistmodel.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanabstractlistmodel.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanautostartmanager.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemancalendarconverter.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemancalendarconvertercore.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemancalendarmodel.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemancountriesmodel.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandebugobjectcounter.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanencrypter.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanfilesystemmodel.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanhashobject.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanlistobject.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanlistrecord.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmixedlistmodel.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqtlogger.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemansettings.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemansimpleqtcryptor.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmapobject.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanrefresherobject.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanlistmodel.cpp\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemancoreresource_lib.qrc\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/core/aseman_macros.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMAN_MACROS_H\n#define ASEMAN_MACROS_H\n\n#include <QtGlobal>\n\n#if defined(Q_OS_WASM)\n#define WEBASM_DEVICE\n#else\n#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) || defined(Q_OS_WINPHONE) || defined(Q_OS_UBUNTUTOUCH)\n#define TOUCH_DEVICE\n#else\n#define DESKTOP_DEVICE\n#if defined(Q_OS_LINUX) || defined(Q_OS_OPENBSD)\n#define DESKTOP_LINUX\n#endif\n#endif\n#endif\n\n#endif // ASEMAN_MACROS_H\n"
  },
  {
    "path": "src/core/asemanabstractlistmodel.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/*!\n    \\class AsemanAbstractListModel\n    \\brief Aseman's Abstract list model class provides some useful get methods\n    for QML.\n\n    AsemanAbstractListModel provide abstract ListModel class, has some get\n    functions that is useful on the QML.\n    Every model create based on AsemanAbstractListModel, could pass data\n    to the QML using this functions.\n\n    \\reentrant\n    \\ingroup AsemanCore\n*/\n\n#include \"asemanabstractlistmodel.h\"\n\n#include <QHash>\n\nAsemanAbstractListModel::AsemanAbstractListModel(QObject *parent) :\n    QAbstractListModel(parent)\n{\n}\n\n/*!\n    Returns all roles keys of the Model as a QStringList.\n    \\sa get\n */\nQStringList AsemanAbstractListModel::roles() const\n{\n    QStringList result;\n    const QHash<int,QByteArray> &roles = roleNames();\n    QHashIterator<int,QByteArray> i(roles);\n    while(i.hasNext())\n    {\n        i.next();\n        result << QString::fromUtf8(i.value());\n    }\n\n    std::sort(result.begin(), result.end());\n    return result;\n}\n\n\n/*!\n    Return value based on the \\a row number and \\a role id.\n    \\sa roles\n */\nQVariant AsemanAbstractListModel::get(int row, int role) const\n{\n    if(row >= rowCount() || row < 0)\n        return QVariant();\n\n    const QModelIndex &idx = index(row,0);\n    return data(idx , role);\n}\n\n\n/*!\n    Return value based on the \\a row number and \\a roleName.\n    \\sa roles\n */\nQVariant AsemanAbstractListModel::get(int index, const QString &roleName) const\n{\n    const int role = roleNames().key(roleName.toUtf8());\n    return get(index, role);\n}\n\n\n/*!\n    Return all values based on the \\a row number as a QVariantMap object.\n    \\sa roles\n */\nQVariantMap AsemanAbstractListModel::get(int index) const\n{\n    if(index >= rowCount())\n        return QVariantMap();\n\n    QVariantMap result;\n    const QHash<int,QByteArray> &roles = roleNames();\n    QHashIterator<int,QByteArray> i(roles);\n    while(i.hasNext())\n    {\n        i.next();\n        result[QString::fromUtf8(i.value())] = get(index, i.key());\n    }\n\n    return result;\n}\n\nAsemanAbstractListModel::~AsemanAbstractListModel()\n{\n}\n"
  },
  {
    "path": "src/core/asemanabstractlistmodel.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANABSTRACTLISTMODEL_H\n#define ASEMANABSTRACTLISTMODEL_H\n\n#include <QAbstractListModel>\n#include <QStringList>\n\n#include \"asemancore_global.h\"\n\nclass LIBQTASEMAN_CORE_EXPORT AsemanAbstractListModel : public QAbstractListModel\n{\n    Q_OBJECT\npublic:\n    AsemanAbstractListModel(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanAbstractListModel();\n\n    Q_INVOKABLE QStringList roles() const;\n\npublic Q_SLOTS:\n    QVariant get(int index, int role) const;\n    QVariant get(int index, const QString &roleName) const;\n    QVariantMap get(int index) const;\n};\n\ntypedef AsemanAbstractListModel QAsemanAbstractListModel;\n\n#endif // ASEMANABSTRACTLISTMODEL_H\n"
  },
  {
    "path": "src/core/asemanautostartmanager.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/*!\n    \\class AsemanAutoStartManager\n    \\brief Provides Startup manager methods to add auto start option\n    to your software.\n\n    \\reentrant\n    \\ingroup AsemanCore\n */\n\n#include \"asemanautostartmanager.h\"\n\n#if defined(Q_OS_MAC) && defined(OSX_CORE_SERVICES_AVAILABLE)\n#include <CoreServices/CoreServices.h>\n#endif\n\n#include <QFile>\n#include <QDir>\n#include <QSettings>\n\n/*!\n    \\private\n */\nclass AsemanAutoStartManagerPrivate\n{\npublic:\n    QString type;\n    bool active;\n    QString name;\n    QString command;\n    QString comment;\n\n    QString source;\n};\n\nAsemanAutoStartManager::AsemanAutoStartManager(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanAutoStartManagerPrivate;\n    p->type = QStringLiteral(\"Application\");\n    p->active = true;\n}\n\n\n/*!\n    Sets command to execute when OS booted successfully.\n    \\sa command()\n */\nvoid AsemanAutoStartManager::setCommand(const QString &cmd)\n{\n    if(p->command == cmd)\n        return;\n\n    p->command = cmd;\n    Q_EMIT commandChanged();\n\n    save();\n}\n\n\n/*!\n    Returns command to execute when OS booted successfully.\n    \\sa setCommand()\n */\nQString AsemanAutoStartManager::command() const\n{\n    return p->command;\n}\n\n\n/*!\n    Sets source file name to \\a fileName arguments.\n    \\note It supprted on the Unix/Linux operationg systems only.\n    \\sa source()\n */\nvoid AsemanAutoStartManager::setSource(const QString &fileName)\n{\n    if(p->source == fileName)\n        return;\n\n    p->source = fileName;\n    Q_EMIT sourceChanged();\n\n    refresh();\n}\n\n\n/*!\n    Returns source file name.\n    \\note It supprted on the Unix/Linux operationg systems only.\n    \\sa setSource()\n */\nQString AsemanAutoStartManager::source() const\n{\n    return p->source;\n}\n\nvoid AsemanAutoStartManager::setComment(const QString &txt)\n{\n    if(p->comment == txt)\n        return;\n\n    p->comment = txt;\n    Q_EMIT commentChanged();\n\n    save();\n}\n\nQString AsemanAutoStartManager::comment() const\n{\n    return p->comment;\n}\n\nvoid AsemanAutoStartManager::setName(const QString &name)\n{\n    if(p->name == name)\n        return;\n\n    p->name = name;\n    Q_EMIT nameChanged();\n\n    save();\n}\n\nQString AsemanAutoStartManager::name() const\n{\n    return p->name;\n}\n\nvoid AsemanAutoStartManager::setType(const QString &t)\n{\n    if(p->type == t)\n        return;\n\n    p->type = t;\n    Q_EMIT typeChanged();\n\n    save();\n}\n\nQString AsemanAutoStartManager::type() const\n{\n    return p->type;\n}\n\nvoid AsemanAutoStartManager::setActive(bool active)\n{\n    if(p->active == active)\n        return;\n\n    p->active = active;\n    Q_EMIT activeChanged();\n\n    save();\n}\n\nbool AsemanAutoStartManager::active() const\n{\n    return p->active;\n}\n\n#if defined(Q_OS_MAC) && defined(OSX_CORE_SERVICES_AVAILABLE)\nCFURLRef prepareURL(const QString& path)\n{\n    QByteArray app_path_byte_array = path.toLatin1();\n    // checking for .app\n    int appIdx = app_path_byte_array.indexOf(\".app\");\n\n    bool isDir = false;\n\n    if (appIdx > 0)\n    {\n        app_path_byte_array = app_path_byte_array.mid(0, appIdx + 4);\n        isDir = true;\n    }\n\n    CFURLRef url = CFURLCreateFromFileSystemRepresentation(\n        NULL, (const UInt8 *)app_path_byte_array.constData(), app_path_byte_array.size(), isDir);\n    if (!url)\n    {\n        qWarning(\"unable to create CFURLRef\");\n        return NULL;\n    }\n\n    return url;\n}\n\nbool hasLoginItem(const QString& name)\n{\n    LSSharedFileListRef login_items = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);\n    if (!login_items)\n    {\n        qWarning(\"unable to get login items\");\n        return false;\n    }\n\n    CFArrayRef login_items_array = LSSharedFileListCopySnapshot(login_items, NULL);\n    if (!login_items_array)\n    {\n        qWarning(\"unable to get login items array\");\n        CFRelease(login_items);\n        return false;\n    }\n    CFIndex count = CFArrayGetCount(login_items_array);\n    for (CFIndex i = 0; i < count; i += 1)\n    {\n        LSSharedFileListItemRef item = (LSSharedFileListItemRef) CFArrayGetValueAtIndex(login_items_array, i);\n        CFStringRef displayName = LSSharedFileListItemCopyDisplayName(item);\n        CFComparisonResult result = CFStringCompare(displayName, name.toCFString(), 0);\n        CFRelease(displayName);\n        if (result == kCFCompareEqualTo)\n        {\n            CFRelease(login_items_array);\n            CFRelease(login_items);\n            return true;\n        }\n    }\n\n    CFRelease(login_items_array);\n    CFRelease(login_items);\n    return false;\n}\n#endif\n\nvoid AsemanAutoStartManager::refresh()\n{\n#if defined(Q_OS_LINUX) || defined(Q_OS_OPENBSD)\n    const QString &pathDir = QDir::homePath() + QStringLiteral(\"/.config/autostart\");\n    const QString &path = pathDir + QStringLiteral(\"/\") + p->source + QStringLiteral(\".desktop\");\n\n    QDir().mkpath(pathDir);\n\n    QFile file(path);\n    if(!file.open(QFile::ReadOnly))\n        return;\n\n    const QString data = QString::fromUtf8(file.readAll());\n    p->active = !data.contains(QStringLiteral(\"Hidden=true\"));\n\n    Q_EMIT activeChanged();\n#elif defined(Q_OS_WIN)\n    QSettings autoStartSettings(\"HKEY_CURRENT_USER\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run\", QSettings::NativeFormat);\n\n    p->active = autoStartSettings.contains(p->source);\n\n    Q_EMIT activeChanged();\n#elif defined(Q_OS_MAC) && defined(OSX_CORE_SERVICES_AVAILABLE)\n    p->active = hasLoginItem(p->name);\n\n    Q_EMIT activeChanged();\n#endif\n}\n\nvoid AsemanAutoStartManager::save()\n{\n#if defined(Q_OS_LINUX) || defined(Q_OS_OPENBSD)\n    const QString &pathDir = QDir::homePath() + QStringLiteral(\"/.config/autostart\");\n    const QString &path = pathDir + QStringLiteral(\"/\") + p->source + QStringLiteral(\".desktop\");\n\n    QDir().mkpath(pathDir);\n\n    QString data = QStringLiteral(\"[Desktop Entry]\") +\n            \"\\nHidden=\" + (p->active?\"false\":\"true\") +\n            \"\\nX-GNOME-Autostart-enabled=\" + (p->active?\"true\":\"false\") +\n            \"\\nName=\" + p->name +\n            \"\\nName[en_US]=\" + p->name +\n            \"\\nComment=\" + p->comment +\n            \"\\nComment[en_US]=\" + p->comment +\n            \"\\nType=\" + p->type +\n            \"\\nExec=\" + p->command +\n            \"\\nNoDisplay=false\\n\";\n\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return;\n\n    file.write(data.toUtf8());\n    file.close();\n#elif defined(Q_OS_WIN)\n    QSettings autoStartSettings(\"HKEY_CURRENT_USER\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run\", QSettings::NativeFormat);\n\n    if(p->active)\n    {\n        autoStartSettings.setValue(p->source, QDir::toNativeSeparators(QDir::cleanPath(p->command)));\n    }\n    else\n    {\n        autoStartSettings.remove(p->source);\n    }\n#elif defined(Q_OS_MAC) && defined(OSX_CORE_SERVICES_AVAILABLE)\n    CFURLRef url = prepareURL(p->command);\n    if (!url)\n    {\n        qWarning(\"unable to create CFURLRef\");\n        return;\n    }\n\n    LSSharedFileListRef login_items = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);\n    if (!login_items)\n    {\n        qWarning(\"unable to get login items\");\n        return;\n    }\n\n    CFArrayRef login_items_array = LSSharedFileListCopySnapshot(login_items, NULL);\n    if (!login_items_array)\n    {\n        qWarning(\"unable to get login items array\");\n        CFRelease(login_items);\n        return;\n    }\n    CFIndex count = CFArrayGetCount(login_items_array);\n    CFStringRef url_string = CFURLGetString(url);\n    CFURLRef item_url = NULL;\n    for (CFIndex i = 0; i < count; i += 1)\n    {\n        LSSharedFileListItemRef item = (LSSharedFileListItemRef) CFArrayGetValueAtIndex(login_items_array, i);\n        if (LSSharedFileListItemResolve(item, 0, &item_url, NULL) != 0)\n        {\n            qWarning(\"unable to resolve login item\");\n            CFRelease(login_items_array);\n            CFRelease(login_items);\n            return;\n        }\n        CFStringRef item_url_string = CFURLGetString(item_url);\n\n        CFComparisonResult result = CFStringCompare(url_string, item_url_string, 0);\n        CFRelease(item_url);\n        if (result == kCFCompareEqualTo)\n        {\n            if (!p->active)\n            {\n                LSSharedFileListItemRemove(login_items, item);\n                CFRelease(login_items_array);\n                CFRelease(login_items);\n                return;\n            }\n\n            qWarning(\"found in login items already\");\n            CFRelease(login_items_array);\n            CFRelease(login_items);\n            return;\n        }\n    }\n\n    if (p->active)\n    {\n        LSSharedFileListItemRef item = LSSharedFileListInsertItemURL(\n            login_items, kLSSharedFileListItemLast, p->name.toCFString(), NULL, url, NULL, NULL);\n        if (!item)\n        {\n            qWarning(\"Unable to add to login items\");\n            CFRelease(login_items_array);\n            CFRelease(login_items);\n            return;\n        }\n        CFRelease(item);\n    }\n\n    CFRelease(login_items_array);\n    CFRelease(login_items);\n#endif\n}\n\nAsemanAutoStartManager::~AsemanAutoStartManager()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/core/asemanautostartmanager.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANAUTOSTARTMANAGER_H\n#define ASEMANAUTOSTARTMANAGER_H\n\n#include <QObject>\n#include <QUrl>\n\n#include \"asemancore_global.h\"\n\nclass AsemanAutoStartManagerPrivate;\nclass LIBQTASEMAN_CORE_EXPORT AsemanAutoStartManager : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QString command READ command WRITE setCommand NOTIFY commandChanged)\n    Q_PROPERTY(QString comment READ comment WRITE setComment NOTIFY commentChanged)\n    Q_PROPERTY(QString source  READ source  WRITE setSource  NOTIFY sourceChanged )\n    Q_PROPERTY(QString name    READ name    WRITE setName    NOTIFY nameChanged   )\n    Q_PROPERTY(QString type    READ type    WRITE setType    NOTIFY typeChanged   )\n    Q_PROPERTY(bool    active  READ active  WRITE setActive  NOTIFY activeChanged )\n\npublic:\n    AsemanAutoStartManager(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanAutoStartManager();\n\n    void setCommand(const QString &cmd);\n    QString command() const;\n\n    void setSource(const QString &fileName);\n    QString source() const;\n\n    void setComment(const QString &txt);\n    QString comment() const;\n\n    void setName(const QString &name);\n    QString name() const;\n\n    void setType(const QString &t);\n    QString type() const;\n\n    void setActive(bool active);\n    bool active() const;\n\npublic Q_SLOTS:\n    void refresh();\n    void save();\n\nQ_SIGNALS:\n    void commandChanged();\n    void sourceChanged();\n    void commentChanged();\n    void nameChanged();\n    void typeChanged();\n    void activeChanged();\n\nprivate:\n    AsemanAutoStartManagerPrivate *p;\n};\n\ntypedef AsemanAutoStartManager QAsemanAutoStartManager;\n\n#endif // ASEMANAUTOSTARTMANAGER_H\n"
  },
  {
    "path": "src/core/asemancalendarconverter.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/*!\n    \\class AsemanCalendarConverter\n    \\brief Provides Calendar manager and converter methods\n    It supports Gregorian, Jalali and Hijri calendars.\n\n    \\reentrant\n    \\ingroup AsemanCore\n */\n\n#include \"asemancalendarconverter.h\"\n#include \"asemancalendarconvertercore.h\"\n\n/*!\n    \\private\n */\nclass AsemanCalendarConverterPrivate\n{\npublic:\n    int calendar_type;\n    AsemanCalendarConverterCore *calendar;\n};\n\nAsemanCalendarConverter::AsemanCalendarConverter(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanCalendarConverterPrivate;\n    p->calendar_type = 0;\n    p->calendar = new AsemanCalendarConverterCore();\n}\n\n/*!\n    Sets current calendar type (Gregorian, Jalali, ...)\n\n    \\param t Calendar type\n    \\sa calendarIDs()\n    \\sa calendarName()\n */\nvoid AsemanCalendarConverter::setCalendar(int t)\n{\n    if( p->calendar->calendar() == t )\n        return;\n\n    p->calendar->setCalendar( static_cast<AsemanCalendarConverterCore::CalendarTypes>(t) );\n    Q_EMIT calendarChanged();\n}\n\n\n/*!\n    Returns all calendar ids as a string list to use in setCalendar()\n\n    \\return All integer ids as StringList\n    \\sa setCalendar()\n    \\sa calendarName()\n */\nQStringList AsemanCalendarConverter::calendarIDs() const\n{\n    QStringList res;\n    res << QString::number(AsemanCalendarConverterCore::Gregorian);\n    res << QString::number(AsemanCalendarConverterCore::Jalali);\n    res << QString::number(AsemanCalendarConverterCore::Hijri);\n    return res;\n}\n\n\n/*!\n    Returns calendar name assigned to the \\a t id.\n\n    \\param t Calendar type\n    \\sa setCalendar()\n    \\sa calendarIDs()\n */\nQString AsemanCalendarConverter::calendarName(int t)\n{\n    switch( t )\n    {\n    case AsemanCalendarConverterCore::Gregorian:\n        return QStringLiteral(\"Gregorian\");\n        break;\n    case AsemanCalendarConverterCore::Jalali:\n        return QStringLiteral(\"Jalali\");\n        break;\n    case AsemanCalendarConverterCore::Hijri:\n        return QStringLiteral(\"Hijri\");\n        break;\n    }\n\n    return QString();\n}\n\n\n/*!\n    Returns current calendar type id.\n\n    \\return Calendar id\n    \\sa setCalendar()\n    \\sa calendarIDs()\n */\nint AsemanCalendarConverter::calendar() const\n{\n    return p->calendar->calendar();\n}\n\n\n/*!\n    Returns days from zero date (0001/01/01) of the current calendar.\n\n    \\return Days\n    \\sa setCalendar()\n    \\sa calendarIDs()\n */\nint AsemanCalendarConverter::currentDays()\n{\n    return QDate(1,1,1).daysTo(QDate::currentDate());\n}\n\n\n/*!\n    Converts and returns \\a d parameter as day from zero date to the Date\n    String based on the current calendar type.\n    Convert format is \"ddd MMM dd yy\"\n\n    \\sa setCalendar()\n    \\sa currentDays()\n    \\sa convertIntToFullStringDate()\n */\nQString AsemanCalendarConverter::convertIntToStringDate(qint64 d)\n{\n    return convertIntToStringDate(d,QStringLiteral(\"ddd MMM dd yy\"));\n}\n\n\n/*!\n    Converts and returns \\a d parameter as day from zero date to the Date\n    and longer String based on the current calendar type.\n    Convert format is \"ddd MMM dd yyyy\"\n\n    \\sa setCalendar()\n    \\sa currentDays()\n    \\sa convertIntToStringDate()\n */\nQString AsemanCalendarConverter::convertIntToFullStringDate(qint64 d)\n{\n    return convertIntToStringDate(d,QStringLiteral(\"ddd MMM dd yyyy\"));\n}\n\n\n/*!\n    Converts and returns \\a d parameter as day from zero date to the Date\n    and longer String based on the current calendar type.\n    Convert format is \"dd MM yy, dayOfWeek\"\n\n    \\sa setCalendar()\n    \\sa currentDays()\n    \\sa convertIntToFullStringDate()\n */\nQString AsemanCalendarConverter::convertIntToNumStringDate(qint64 d)\n{\n    QDate date = QDate(1,1,1);\n    date = date.addDays(d);\n    return ( p->calendar->numberString(date) );\n}\n\n\n/*!\n    Translate int number to the local current calendar character.\n\n    \\sa setCalendar()\n */\nQString AsemanCalendarConverter::translateInt(qint64 d)\n{\n    return (QString::number(d));\n}\n\n\n/*!\n    Translate int number to the local current calendar character.\n\n    \\sa setCalendar()\n */\nQString AsemanCalendarConverter::convertIntToStringDate(qint64 d, const QString &format)\n{\n    Q_UNUSED(format)\n    QDate date = QDate(1,1,1);\n    date = date.addDays(d);\n    return ( p->calendar->historyString(date) );\n}\n\n\n/*!\n    Converts date from \\a y year, \\a m month, \\a d day to the\n    QDate and gregorian object.\n\n    \\sa setCalendar()\n */\nQDate AsemanCalendarConverter::convertDateToGragorian(qint64 y, int m, int d)\n{\n    return p->calendar->toDate(y,m,d);\n}\n\n\n/*!\n    Converts \\a t msec since epoch to the String date using convertDateTimeToString()\n    Method.\n\n    \\sa setCalendar()\n */\nQString AsemanCalendarConverter::fromMSecSinceEpoch(qint64 t)\n{\n    return convertDateTimeToString( QDateTime::fromMSecsSinceEpoch(t) );\n}\n\n\n/*!\n    Converts \\a dt QDateTime to the String date.\n\n    \\sa setCalendar()\n    \\sa fromMSecSinceEpoch()\n */\nQString AsemanCalendarConverter::convertDateTimeToString(const QDateTime &dt)\n{\n    return ( p->calendar->paperString(dt) );\n}\n\n\n/*!\n    Converts \\a dt QDateTime to the String date.\n\n    \\sa setCalendar()\n    \\sa fromMSecSinceEpoch()\n */\nQString AsemanCalendarConverter::convertDateTimeToString(const QDateTime &dt, const QString &format)\n{\n    return ( p->calendar->paperString(dt, format) );\n}\n\n\n/*!\n    Converts \\a dt QDate argument to the String date using convertDateTimeToLittleString()\n    Method.\n\n    \\sa setCalendar()\n    \\sa fromMSecSinceEpoch()\n */\nQString AsemanCalendarConverter::convertDateTimeToLittleString(const QDate &dt)\n{\n    return ( p->calendar->littleString(dt) );\n}\n\n\n/*!\n    Returns days count of the month assigned to \\a y year and \\m month.\n    Method.\n\n    \\sa setCalendar()\n    \\sa monthName()\n */\nint AsemanCalendarConverter::daysOfMonth(qint64 y, int m)\n{\n    return p->calendar->daysOfMonth(y,m);\n}\n\n\n/*!\n    Returns month name of \\m month as a string.\n\n    \\sa setCalendar()\n    \\sa daysOfMonth()\n */\nQString AsemanCalendarConverter::monthName(int m)\n{\n    return p->calendar->monthName(m);\n}\n\n\n/*!\n    Merge QDate and QTime and returns them as a QDateTime object.\n */\nQDateTime AsemanCalendarConverter::combineDateAndTime(const QDate &date, const QTime &time)\n{\n    return QDateTime(date, time);\n}\n\n\n/*!\n    Returns month of the \\a date object.\n */\nint AsemanCalendarConverter::dateMonth(const QDate &date)\n{\n    return convertDate(date).month;\n}\n\n\n/*!\n    Returns day of the \\a date object.\n */\nint AsemanCalendarConverter::dateDay(const QDate &date)\n{\n    return convertDate(date).day;\n}\n\n\n/*!\n    Returns year of the \\a date object.\n */\nqint64 AsemanCalendarConverter::dateYear(const QDate &date)\n{\n    return convertDate(date).year;\n}\n\n\n/*!\n    Returns year of the current date.\n */\nqint64 AsemanCalendarConverter::currentYear()\n{\n    return p->calendar->getDate(QDate::currentDate()).year;\n}\n\n\n/*!\n    Returns month of the current date.\n */\nint AsemanCalendarConverter::currentMonth()\n{\n    return p->calendar->getDate(QDate::currentDate()).month;\n}\n\n\n/*!\n    Returns day of the current date.\n */\nint AsemanCalendarConverter::currentDay()\n{\n    return p->calendar->getDate(QDate::currentDate()).day;\n}\n\n\n/*!\n    Converts date object to the DateProperty, contains all year,\n    month and date properties.\n */\nDateProperty AsemanCalendarConverter::convertDate(const QDate &date)\n{\n    return p->calendar->getDate(date);\n}\n\n\n/*!\n    Converts \\a days number to the current QDate object and Returns it.\n */\nQDate AsemanCalendarConverter::convertDaysToDate(int days)\n{\n    return QDate(1,1,1).addDays(days);\n}\n\n\n/*!\n    Converts \\a date object as QDate and return days from 0001/01/01;\n */\nint AsemanCalendarConverter::convertDateToDays(const QDate &date)\n{\n    return QDate(1,1,1).daysTo(date);\n}\n\n\n/*!\n    Converts \\a sec from unix zero time to the QDateTime object and Returns it.\n */\nQDateTime AsemanCalendarConverter::fromTime_t(uint sec)\n{\n    return QDateTime::fromSecsSinceEpoch(sec);\n}\n\nAsemanCalendarConverter::~AsemanCalendarConverter()\n{\n    delete p->calendar;\n    delete p;\n}\n"
  },
  {
    "path": "src/core/asemancalendarconverter.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANCALENDARCONVERTER_H\n#define ASEMANCALENDARCONVERTER_H\n\n#include <QObject>\n#include <QStringList>\n#include <QDateTime>\n\n#include \"asemancalendarconvertercore.h\"\n\n#include \"asemancore_global.h\"\n\nclass DateProperty;\nclass AsemanCalendarConverterPrivate;\nclass LIBQTASEMAN_CORE_EXPORT AsemanCalendarConverter : public QObject\n{\n    Q_OBJECT\n\n    Q_PROPERTY(int calendar READ calendar WRITE setCalendar NOTIFY calendarChanged)\n\n    Q_PROPERTY(QStringList calendarIDs  READ calendarIDs  NOTIFY fakeSignal)\n    Q_PROPERTY(int         currentDays  READ currentDays  NOTIFY fakeSignal)\n    Q_PROPERTY(int         currentYear  READ currentYear  NOTIFY fakeSignal)\n    Q_PROPERTY(int         currentMonth READ currentMonth NOTIFY fakeSignal)\n    Q_PROPERTY(int         currentDay   READ currentDay   NOTIFY fakeSignal)\n\npublic:\n    AsemanCalendarConverter(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanCalendarConverter();\n\n    void setCalendar( int t );\n    int calendar() const;\n\n    QStringList calendarIDs() const;\n\n    static int currentDays();\n    qint64 currentYear();\n    int currentMonth();\n    int currentDay();\n    DateProperty convertDate( const QDate & date );\n\npublic Q_SLOTS:\n    QString calendarName( int t );\n\n    QString convertIntToStringDate(qint64 d );\n    QString convertIntToFullStringDate(qint64 d );\n    QString convertIntToNumStringDate(qint64 d );\n    QString translateInt(qint64 d);\n    QString convertIntToStringDate(qint64 d, const QString & format );\n    QDate convertDateToGragorian( qint64 year, int month, int day );\n\n    QString fromMSecSinceEpoch( qint64 t );\n    QString convertDateTimeToString( const QDateTime & dt );\n    QString convertDateTimeToString( const QDateTime & dt, const QString & format );\n    QString convertDateTimeToLittleString( const QDate & dt );\n    int daysOfMonth( qint64 year, int month );\n    QString monthName( int month );\n\n    QDateTime combineDateAndTime( const QDate & date, const QTime & time );\n\n    int dateMonth( const QDate & date );\n    int dateDay( const QDate & date );\n    qint64 dateYear( const QDate & date );\n\n    static QDate convertDaysToDate( int days );\n    static int convertDateToDays( const QDate & date );\n\n    QDateTime fromTime_t( uint sec );\n\nQ_SIGNALS:\n    void calendarChanged();\n    void fakeSignal();\n\nprivate:\n    AsemanCalendarConverterPrivate *p;\n};\n\ntypedef AsemanCalendarConverter QAsemanCalendarConverter;\n\n#endif // ASEMANCALENDARCONVERTER_H\n"
  },
  {
    "path": "src/core/asemancalendarconvertercore.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemancalendarconvertercore.h\"\n\n#include <QObject>\n#include <QDebug>\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))\n#include <QCalendar>\n#endif\n\nint aseman_gregorian_months_start[13]      = {0,31,59,90,120,151,181,212,243,273,304,334,365};\nint aseman_gregorian_leap_months_start[13] = {0,31,60,91,121,152,182,213,244,274,305,335,366};\n\nint aseman_jalali_months_start[13]      = {0,31,62,93,124,155,186,216,246,276,306,336,365};\nint aseman_jalali_leap_months_start[13] = {0,31,62,93,124,155,186,216,246,276,306,336,366};\n\nint aseman_hijri_months_start[13]      = {0,30,59,89,118,148,177,207,236,266,295,325,354};\nint aseman_hijri_leap_months_start[13] = {0,30,59,89,118,148,177,207,236,266,295,325,355};\nint aseman_hijri_leap_years[11]        = {2,5,7,10,13,16,18,21,24,26,29};\n\n/*!\n    \\private\n */\nclass AsemanCalendarConverterCorePrivate\n{\npublic:\n    AsemanCalendarConverterCore::CalendarTypes calendar;\n};\n\n/*!\n    \\private\n */\nAsemanCalendarConverterCore::AsemanCalendarConverterCore()\n{\n    p = new AsemanCalendarConverterCorePrivate;\n    p->calendar = AsemanCalendarConverterCore::Gregorian;\n}\n\nvoid AsemanCalendarConverterCore::setCalendar(AsemanCalendarConverterCore::CalendarTypes t)\n{\n    p->calendar = t;\n}\n\nAsemanCalendarConverterCore::CalendarTypes AsemanCalendarConverterCore::calendar() const\n{\n    return p->calendar;\n}\n\nQString AsemanCalendarConverterCore::paperString(const QDateTime &dt)\n{\n    const DateProperty & dp = getDate(dt.date());\n    QString res = QStringLiteral(\"%1, %2 %3 %4, %5\").arg(dayName(dp.day_of_week)).arg(dp.day).arg(monthName(dp.month)).arg(dp.year).arg(dt.time().toString(QStringLiteral(\"hh:mm\")));\n    return res;\n}\n\nQString AsemanCalendarConverterCore::paperString(const QDateTime &d, const QString &format)\n{\n    const DateProperty & dp = getDate(d.date());\n    QString res = format;\n    res.replace( QStringLiteral(\"HH\"), QString::number(d.time().hour()).rightJustified(2,'0'));\n    res.replace( QStringLiteral(\"hh\"), QString::number(d.time().hour()%12).rightJustified(2,'0'));\n    res.replace( QStringLiteral(\"H\"), QString::number(d.time().hour()));\n    res.replace( QStringLiteral(\"h\"), QString::number(d.time().hour()%12));\n    res.replace( QStringLiteral(\"mm\"), QString::number(d.time().minute()).rightJustified(2,'0'));\n    res.replace( QStringLiteral(\"m\"), QString::number(d.time().minute()));\n    res.replace( QStringLiteral(\"ss\"), QString::number(d.time().second()).rightJustified(2,'0'));\n    res.replace( QStringLiteral(\"s\"), QString::number(d.time().second()));\n    res.replace( QStringLiteral(\"yyyy\"), QString::number(dp.year));\n    res.replace( QStringLiteral(\"yy\"), QString::number(dp.year).right(2));\n    res.replace( QStringLiteral(\"dddd\"), dayName(dp.day_of_week));\n    res.replace( QStringLiteral(\"MMMM\"), monthName(dp.month));\n    res.replace( QStringLiteral(\"dd\"), QString::number(dp.day).rightJustified(2,'0'));\n    res.replace( QStringLiteral(\"MM\"), QString::number(dp.month).rightJustified(2,'0'));\n\n    return res;\n}\n\nQString AsemanCalendarConverterCore::littleString(const QDate &d)\n{\n    const DateProperty & dp = getDate(d);\n    QString res = QStringLiteral(\"%1 %2 %3\").arg(dp.day).arg(monthName(dp.month)).arg(dp.year);\n    return res;\n}\n\nQString AsemanCalendarConverterCore::historyString(const QDate &d)\n{\n    const DateProperty & dp = getDate(d);\n    QString res = QStringLiteral(\"%1 %2 %3 - %4\").arg(dp.year).arg(monthName(dp.month)).arg(dp.day).arg(dayName(dp.day_of_week));\n    return res;\n}\n\nQString AsemanCalendarConverterCore::numberString(const QDate &d)\n{\n    const DateProperty & dp = getDate(d);\n    QString res = QStringLiteral(\"%1 %2 %3 - %4\").arg(dp.year).arg(dp.month).arg(dp.day).arg(dayName(dp.day_of_week));\n    return res;\n}\n\nDateProperty AsemanCalendarConverterCore::getDate(const QDate &d)\n{\n    DateProperty res;\n    switch( static_cast<int>(p->calendar) )\n    {\n    case AsemanCalendarConverterCore::Gregorian:\n        res = toDateGregorian( fromDateGregorian(d.year(),d.month(),d.day()) );\n        break;\n    case AsemanCalendarConverterCore::Jalali:\n        res = toDateJalali( fromDateGregorian(d.year(),d.month(),d.day()) );\n        break;\n    case AsemanCalendarConverterCore::Hijri:\n        res = toDateHijri( fromDateGregorian(d.year(),d.month(),d.day()) );\n        break;\n    }\n\n    return res;\n}\n\nQDate AsemanCalendarConverterCore::toDate(qint64 y, int m, int d)\n{\n    qint64 julian_zero = 0;\n    switch( static_cast<int>(p->calendar) )\n    {\n    case AsemanCalendarConverterCore::Gregorian:\n        julian_zero = fromDateGregorian(y,m,d);\n        break;\n    case AsemanCalendarConverterCore::Jalali:\n        julian_zero = fromDateJalali(y,m,d);\n        break;\n    case AsemanCalendarConverterCore::Hijri:\n        julian_zero = fromDateHijri(y,m,d);\n        break;\n    }\n\n    const DateProperty & pr = toDateGregorian(julian_zero);\n    return QDate(pr.year,pr.month,pr.day);\n}\n\nQString AsemanCalendarConverterCore::dayName(int d)\n{\n    QString res;\n    switch( static_cast<int>(p->calendar) )\n    {\n    case AsemanCalendarConverterCore::Gregorian:\n        res = dayNameGregorian(d);\n        break;\n    case AsemanCalendarConverterCore::Jalali:\n        res = dayNameJalali(d);\n        break;\n    case AsemanCalendarConverterCore::Hijri:\n        res = dayNameHijri(d);\n        break;\n    }\n\n    return res;\n}\n\nQString AsemanCalendarConverterCore::monthName(int m)\n{\n    QString res;\n    switch( static_cast<int>(p->calendar) )\n    {\n    case AsemanCalendarConverterCore::Gregorian:\n        res = monthNamesGregorian(m);\n        break;\n    case AsemanCalendarConverterCore::Jalali:\n        res = monthNamesJalali(m);\n        break;\n    case AsemanCalendarConverterCore::Hijri:\n        res = monthNamesHijri(m);\n        break;\n    }\n\n    return res;\n}\n\nbool AsemanCalendarConverterCore::yearIsLeap(qint64 year)\n{\n    bool res = false;\n    switch( static_cast<int>(p->calendar) )\n    {\n    case AsemanCalendarConverterCore::Gregorian:\n        res = isLeapGregorian(year);\n        break;\n    case AsemanCalendarConverterCore::Jalali:\n        res = isLeapJalali(year);\n        break;\n    case AsemanCalendarConverterCore::Hijri:\n        res = leapIndexHijri(year) != -1;\n        break;\n    }\n\n    return res;\n}\n\nint AsemanCalendarConverterCore::daysOfMonth(qint64 y, int m)\n{\n    if( m<1 || m>12 )\n        return 0;\n\n    int res = 0;\n    bool leap = yearIsLeap(y);\n    switch( static_cast<int>(p->calendar) )\n    {\n    case AsemanCalendarConverterCore::Gregorian:\n        res = leap? aseman_gregorian_leap_months_start[m]-aseman_gregorian_leap_months_start[m-1] :\n                aseman_gregorian_months_start[m]-aseman_gregorian_months_start[m-1];\n        break;\n    case AsemanCalendarConverterCore::Jalali:\n        res = leap? aseman_jalali_leap_months_start[m]-aseman_jalali_leap_months_start[m-1] :\n                aseman_jalali_months_start[m]-aseman_jalali_months_start[m-1];\n        break;\n    case AsemanCalendarConverterCore::Hijri:\n        res = leap? aseman_hijri_leap_months_start[m]-aseman_hijri_leap_months_start[m-1] :\n                aseman_hijri_months_start[m]-aseman_hijri_months_start[m-1];\n        break;\n    }\n\n    return res;\n}\n\nQString AsemanCalendarConverterCore::monthNamesGregorian(int m)\n{\n    switch( m )\n    {\n    case 1:\n        return QStringLiteral(\"January\");\n        break;\n    case 2:\n        return QStringLiteral(\"February\");\n        break;\n    case 3:\n        return QStringLiteral(\"March\");\n        break;\n    case 4:\n        return QStringLiteral(\"April\");\n        break;\n    case 5:\n        return QStringLiteral(\"May\");\n        break;\n    case 6:\n        return QStringLiteral(\"June\");\n        break;\n    case 7:\n        return QStringLiteral(\"July\");\n        break;\n    case 8:\n        return QStringLiteral(\"August\");\n        break;\n    case 9:\n        return QStringLiteral(\"September\");\n        break;\n    case 10:\n        return QStringLiteral(\"October\");\n        break;\n    case 11:\n        return QStringLiteral(\"November\");\n        break;\n    case 12:\n        return QStringLiteral(\"December\");\n        break;\n    }\n\n    return QString();\n}\n\nQString AsemanCalendarConverterCore::dayNameGregorian(int d)\n{\n    switch( d )\n    {\n    case 1:\n        return QStringLiteral(\"Monday\");\n        break;\n    case 2:\n        return QStringLiteral(\"Tuesday\");\n        break;\n    case 3:\n        return QStringLiteral(\"Wednesday\");\n        break;\n    case 4:\n        return QStringLiteral(\"Thuresday\");\n        break;\n    case 5:\n        return QStringLiteral(\"Friday\");\n        break;\n    case 6:\n        return QStringLiteral(\"Saturday\");\n        break;\n    case 7:\n        return QStringLiteral(\"Sunday\");\n        break;\n    }\n\n    return QString();\n}\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))\nbool AsemanCalendarConverterCore::isLeapGregorian( qint64 year )\n{\n    QCalendar cal(QCalendar::System::Jalali);\n    return cal.isLeapYear(year);\n}\n\nqint64 AsemanCalendarConverterCore::fromDateGregorian( qint64 year , int month , int day )\n{\n    return QDate(year, month, day).toJulianDay();\n}\n\nDateProperty AsemanCalendarConverterCore::toDateGregorian( qint64 days_from_gregorian_zero )\n{\n    const auto date = QDate::fromJulianDay(days_from_gregorian_zero);\n\n    DateProperty property;\n    property.day = date.day();\n    property.month = date.month();\n    property.year = date.year();\n    property.day_of_week = date.dayOfWeek();\n    property.leap = date.isLeapYear(date.year());\n\n    return property;\n}\n\n#else\n\nbool AsemanCalendarConverterCore::isLeapGregorian( qint64 year )\n{\n    return (year%4==0 && year%100!=0) || year%400==0;\n}\n\nqint64 AsemanCalendarConverterCore::fromDateGregorian( qint64 year , int month , int day )\n{\n    bool leap = isLeapGregorian( year );\n\n    month--;\n    day--;\n    year--;\n\n    qint64 leap_pad = (year/4) - (year/100) + (year/400);\n    qint64 year_days = year*365 + leap_pad;\n\n    qint16 month_days = (leap)? aseman_gregorian_leap_months_start[month] : aseman_gregorian_months_start[month];\n    qint64 abs_days   = year_days + month_days + day;\n    if( year < 0 && !leap )\n        abs_days--;\n\n    return abs_days + 0;\n}\n\nDateProperty AsemanCalendarConverterCore::toDateGregorian( qint64 days_from_gregorian_zero )\n{\n    days_from_gregorian_zero -= 0;\n\n    qint64 day     = days_from_gregorian_zero;\n    qint64 year    = 0;\n    qint16 month   = 0;\n\n    static const qint32 oneYear = 365;\n    static const qint32 fourYear = oneYear*4 + 1; // 1461 days\n    static const qint32 oneHundredYear = fourYear*25 - 1; // 36524 days\n    static const qint32 fourHundredYear = oneHundredYear*4 + 1; // 146097 days\n\n    year += (day/fourHundredYear) * 400;\n    day   = day%fourHundredYear;\n\n    if( days_from_gregorian_zero < 0 && day != 0 )\n    {\n        year -= 400;\n        day   = fourHundredYear + day;\n    }\n\n    if( day < oneHundredYear*3 ) // Three Hundred years\n    {\n        year += day/oneHundredYear * 100;\n        day   = day%oneHundredYear;\n    }\n    else\n    {\n        year += 300;\n        day   = day - oneHundredYear*3;\n    }\n\n    if( day < fourYear*24 )\n    {\n        year += day/fourYear * 4;\n        day   = day%fourYear;\n    }\n    else\n    {\n        year += 100-4;\n        day   = day - fourYear*24;\n    }\n\n    if( day < oneYear*3 )\n    {\n        year += day/oneYear * 1;\n        day   = day%oneYear;\n    }\n    else\n    {\n        year += 4-1;\n        day   = day - oneYear*3;\n    }\n\n    day++;\n    year++;\n\n    bool leap = isLeapGregorian(year);\n\n    for( int i=11 ; i>=0 ; i-- )\n    {\n        qint16 month_day = (leap)? aseman_gregorian_leap_months_start[i] : aseman_gregorian_months_start[i] ;\n        if( day > month_day )\n        {\n            month = i;\n            day  -= month_day;\n            break;\n        }\n    }\n\n    month++;\n\n    DateProperty property;\n    property.day = day;\n    property.month = month;\n    property.year = year;\n    property.day_of_week = (days_from_gregorian_zero) % 7;\n    property.leap = leap;\n\n    if( property.day_of_week < 0 )\n        property.day_of_week = 6 + property.day_of_week;\n    property.day_of_week++;\n\n    return property;\n}\n#endif\n\nQString AsemanCalendarConverterCore::monthNamesJalali(int m)\n{\n    switch( m )\n    {\n    case 1:\n        return JalaliCalendarObject::tr(\"Farvardin\");\n        break;\n    case 2:\n        return JalaliCalendarObject::tr(\"Ordibehesht\");\n        break;\n    case 3:\n        return JalaliCalendarObject::tr(\"Khordad\");\n        break;\n    case 4:\n        return JalaliCalendarObject::tr(\"Tir\");\n        break;\n    case 5:\n        return JalaliCalendarObject::tr(\"Mordad\");\n        break;\n    case 6:\n        return JalaliCalendarObject::tr(\"Shahrivar\");\n        break;\n    case 7:\n        return JalaliCalendarObject::tr(\"Mehr\");\n        break;\n    case 8:\n        return JalaliCalendarObject::tr(\"Abaan\");\n        break;\n    case 9:\n        return JalaliCalendarObject::tr(\"Aazar\");\n        break;\n    case 10:\n        return JalaliCalendarObject::tr(\"Dey\");\n        break;\n    case 11:\n        return JalaliCalendarObject::tr(\"Bahman\");\n        break;\n    case 12:\n        return JalaliCalendarObject::tr(\"Esfand\");\n        break;\n    }\n\n    return QString();\n}\n\nQString AsemanCalendarConverterCore::dayNameJalali(int d)\n{\n    switch( d )\n    {\n    case 1:\n        return JalaliCalendarObject::tr(\"Shanbe\");\n        break;\n    case 2:\n        return JalaliCalendarObject::tr(\"1Shanbe\");\n        break;\n    case 3:\n        return JalaliCalendarObject::tr(\"2Shanbe\");\n        break;\n    case 4:\n        return JalaliCalendarObject::tr(\"3Shanbe\");\n        break;\n    case 5:\n        return JalaliCalendarObject::tr(\"4Shanbe\");\n        break;\n    case 6:\n        return JalaliCalendarObject::tr(\"5Shanbe\");\n        break;\n    case 7:\n        return JalaliCalendarObject::tr(\"Jome\");\n        break;\n    }\n\n    return QString();\n}\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))\n\nbool AsemanCalendarConverterCore::isLeapJalali( qint64 year )\n{\n    QCalendar cal(QCalendar::System::Jalali);\n    return cal.isLeapYear(year);\n}\n\nqint64 AsemanCalendarConverterCore::fromDateJalali( qint64 year , int month , int day )\n{\n    QCalendar cal(QCalendar::System::Jalali);\n    return cal.dateFromParts(year, month, day).toJulianDay();\n}\n\nDateProperty AsemanCalendarConverterCore::toDateJalali( qint64 days_from_jalali_zero )\n{\n    const auto date = QDate::fromJulianDay(days_from_jalali_zero);\n    QCalendar cal(QCalendar::System::Jalali);\n    auto parts = cal.partsFromDate(date);\n\n    DateProperty property;\n    property.day = parts.day;\n    property.month = parts.month;\n    property.year = parts.year;\n    property.day_of_week = ((date.dayOfWeek()+1) % 7)+1;\n    property.leap = cal.isLeapYear(parts.year);\n\n    return property;\n}\n\n#else\n\nbool AsemanCalendarConverterCore::isLeapJalali( qint64 year )\n{\n    return (year%4==0 && year%100!=0) || year%400==0;\n}\n\nqint64 AsemanCalendarConverterCore::fromDateJalali( qint64 year , int month , int day )\n{\n    bool leap = isLeapJalali( year );\n\n    month--;\n    day--;\n    year--;\n\n    qint64 leap_pad = (year/4) - (year/100) + (year/400);\n    qint64 year_days = year*365 + leap_pad;\n\n    qint16 month_days = (leap)? aseman_jalali_leap_months_start[month] : aseman_jalali_months_start[month];\n    qint64 abs_days   = year_days + month_days + day;\n    if( year < 0 && !leap )\n        abs_days--;\n\n    return abs_days + 226894;\n}\n\nDateProperty AsemanCalendarConverterCore::toDateJalali( qint64 days_from_jalali_zero )\n{\n    days_from_jalali_zero -= 226894;\n\n    qint64 day     = days_from_jalali_zero;\n    qint64 year    = 0;\n    qint16 month   = 0;\n\n    year += day/146097 * 400;\n    day   = day%146097;\n\n    if( days_from_jalali_zero < 0 && day != 0 )\n    {\n        year -= 400;\n        day   = 146097 + day;\n    }\n\n    if( day < 36524*3 )\n    {\n        year += day/36524 * 100;\n        day   = day%36524;\n    }\n    else\n    {\n        year += 400-100;\n        day   = day - 36524*3;\n    }\n\n    if( day < 1461*24 )\n    {\n        year += day/1461 * 4;\n        day   = day%1461;\n    }\n    else\n    {\n        year += 100-4;\n        day   = day - 1461*24;\n    }\n\n    if( day < 365*3 )\n    {\n        year += day/365 * 1;\n        day   = day%365;\n    }\n    else\n    {\n        year += 4-1;\n        day   = day - 365*3;\n    }\n\n    day++;\n    year++;\n\n    bool leap = isLeapJalali(year);\n    for( int i=11 ; i>=0 ; i-- )\n    {\n        qint16 month_day = (leap)? aseman_jalali_leap_months_start[i] : aseman_jalali_months_start[i] ;\n        if( day > month_day )\n        {\n            month = i;\n            day  -= month_day;\n            break;\n        }\n    }\n\n    month++;\n\n    DateProperty property;\n    property.day = day-1;\n    property.month = month;\n    property.year = year;\n    property.day_of_week = (days_from_jalali_zero-2) % 7;\n    property.leap = leap;\n\n    if( property.day_of_week < 0 )\n        property.day_of_week = 6 + property.day_of_week;\n    property.day_of_week++;\n\n    return property;\n}\n#endif\n\nint AsemanCalendarConverterCore::leapIndexHijri( qint64 year )\n{\n    qint8 r = year%30;\n    for( int i=0 ; i<11 ; i++ )\n        if( r == aseman_hijri_leap_years[i] )\n            return i;\n\n    return -1;\n}\n\nQString AsemanCalendarConverterCore::monthNamesHijri( int m )\n{\n    switch( m )\n    {\n    case 1:\n        return QStringLiteral(\"Moharram\");\n        break;\n    case 2:\n        return QStringLiteral(\"Safar\");\n        break;\n    case 3:\n        return QStringLiteral(\"Rabiol Avval\");\n        break;\n    case 4:\n        return QStringLiteral(\"Rabio Sani\");\n        break;\n    case 5:\n        return QStringLiteral(\"Jamadiol Aval\");\n        break;\n    case 6:\n        return QStringLiteral(\"Jamadio Sani\");\n        break;\n    case 7:\n        return QStringLiteral(\"Rajab\");\n        break;\n    case 8:\n        return QStringLiteral(\"Shaban\");\n        break;\n    case 9:\n        return QStringLiteral(\"Ramadan\");\n        break;\n    case 10:\n        return QStringLiteral(\"Shaval\");\n        break;\n    case 11:\n        return QStringLiteral(\"Zighade\");\n        break;\n    case 12:\n        return QStringLiteral(\"Zihaje\");\n        break;\n    }\n\n    return QString();\n}\n\nQString AsemanCalendarConverterCore::dayNameHijri(int d)\n{\n    switch( d )\n    {\n    case 1:\n        return QStringLiteral(\"Saturday\");\n        break;\n    case 2:\n        return QStringLiteral(\"Sunday\");\n        break;\n    case 3:\n        return QStringLiteral(\"Monday\");\n        break;\n    case 4:\n        return QStringLiteral(\"Tuesday\");\n        break;\n    case 5:\n        return QStringLiteral(\"Wednesday\");\n        break;\n    case 6:\n        return QStringLiteral(\"Thuresday\");\n        break;\n    case 7:\n        return QStringLiteral(\"Friday\");\n        break;\n    }\n\n    return QString();\n}\n\nqint64 AsemanCalendarConverterCore::leapsNumberHijri( qint64 year )\n{\n    qint8 r = year%30;\n    for( int i=0 ; i<11 ; i++ )\n        if( r <= aseman_hijri_leap_years[i] )\n            return 11 * (year/30) + i + (r==aseman_hijri_leap_years[i]);\n\n    return 0;\n}\n\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))\n\nqint64 AsemanCalendarConverterCore::fromDateHijri( qint64 year , int month , int day )\n{\n    QCalendar cal(QCalendar::System::IslamicCivil);\n    return cal.dateFromParts(year, month, day).toJulianDay();\n}\n\nDateProperty AsemanCalendarConverterCore::toDateHijri( qint64 days_from_hijri_zero )\n{\n    const auto date = QDate::fromJulianDay(days_from_hijri_zero);\n    QCalendar cal(QCalendar::System::IslamicCivil);\n    auto parts = cal.partsFromDate(date);\n\n    DateProperty property;\n    property.day = parts.day;\n    property.month = parts.month;\n    property.year = parts.year;\n    property.day_of_week = ((date.dayOfWeek()+1) % 7)+1;\n    property.leap = cal.isLeapYear(parts.year);\n\n    return property;\n}\n\n#else\n\nqint64 AsemanCalendarConverterCore::fromDateHijri( qint64 year , int month , int day )\n{\n    int leap_index = leapIndexHijri( year );\n    bool leap = leap_index != -1;\n\n    month--;\n    day--;\n    year--;\n\n    qint64 leap_pad = leapsNumberHijri(year);\n\n    qint64 year_days = year*354 + leap_pad;\n\n    qint16 month_days = (leap)? aseman_hijri_leap_months_start[month] : aseman_hijri_months_start[month];\n    qint64 abs_days   = year_days + month_days + day;\n    if( year < 0 && !leap )\n        abs_days-=11;\n    if( year >= 0 && leap )\n        abs_days--;\n\n    return abs_days+227026;\n}\n\nDateProperty AsemanCalendarConverterCore::toDateHijri( qint64 days_from_hijri_zero )\n{\n    days_from_hijri_zero -= 227026;\n\n    qint64 day     = days_from_hijri_zero;\n    qint64 year    = 0;\n    qint16 month   = 0;\n\n    year += day/10631 * 30;\n    day   = day%10631;\n\n    if( days_from_hijri_zero < 0 && day != 0 )\n    {\n        year -= 30;\n        day   = 10631 + day;\n    }\n\n    for( int i=0 ; i<30 ; i++ )\n    {\n        int leap = leapIndexHijri( year );\n        int year_days = (leap==-1)?354:355;\n        if( day < year_days )\n            break;\n\n        year += 1;\n        day  -= year_days;\n    }\n\n    day++;\n    year++;\n\n    int leap_number = leapIndexHijri( year );\n    bool leap = (leap_number!=-1);\n    for( int i=11 ; i>=0 ; i-- )\n    {\n        qint16 month_day = (leap)? aseman_hijri_leap_months_start[i] : aseman_hijri_months_start[i] ;\n        if( day > month_day )\n        {\n            month = i;\n            day  -= month_day;\n            break;\n        }\n    }\n\n    month++;\n\n    DateProperty property;\n        property.day = day;\n        property.month = month;\n        property.year = year;\n        property.day_of_week = (days_from_hijri_zero-4) % 7;\n        property.leap = leap;\n\n    if( property.day_of_week < 0 )\n        property.day_of_week = 6 + property.day_of_week;\n    property.day_of_week++;\n\n    return property;\n}\n#endif\n\nAsemanCalendarConverterCore::~AsemanCalendarConverterCore()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/core/asemancalendarconvertercore.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANCALENDARCONVERTERCORE_H\n#define ASEMANCALENDARCONVERTERCORE_H\n\n#include <QString>\n#include <QDate>\n#include <QDateTime>\n#include <QObject>\n\n#include \"asemancore_global.h\"\n\nclass DateProperty\n{\npublic:\n    int day;\n    int month;\n    qint64 year;\n    int day_of_week;\n    bool leap;\n\n    bool operator ==(const DateProperty &b) const {\n        return b.day == day &&\n               b.month == month &&\n               b.year == year &&\n               b.day_of_week == day_of_week;\n    }\n};\n\nclass AsemanCalendarConverterCorePrivate;\n\n/*!\n    \\private\n */\nclass AsemanCalendarConverterCore\n{\npublic:\n    AsemanCalendarConverterCore();\n    virtual ~AsemanCalendarConverterCore();\n\n    enum CalendarTypes{\n        Gregorian,\n        Jalali,\n        Hijri\n    };\n\n    void setCalendar( CalendarTypes t );\n    CalendarTypes calendar() const;\n\n    QString paperString(const QDateTime &d );\n    QString paperString(const QDateTime &d, const QString & format );\n    QString littleString(const QDate &d );\n    QString historyString( const QDate & d );\n    QString numberString( const QDate & d );\n\n    DateProperty getDate( const QDate & d );\n    QDate toDate( qint64 year, int month, int day );\n\n    QString dayName( int d );\n    QString monthName( int m );\n\n    bool yearIsLeap( qint64 year );\n    int daysOfMonth( qint64 year, int month );\n\nprivate:\n    qint64 fromDateGregorian( qint64 year , int month , int day );\n    DateProperty toDateGregorian( qint64 days_from_julian_zero );\n    bool isLeapGregorian( qint64 year );\n    QString monthNamesGregorian(int m);\n    QString dayNameGregorian( int d );\n\n    qint64 fromDateJalali( qint64 year , int month , int day );\n    DateProperty toDateJalali( qint64 days_from_julian_zero );\n    bool isLeapJalali( qint64 year );\n    QString monthNamesJalali(int m);\n    QString dayNameJalali( int d );\n\n    qint64 fromDateHijri( qint64 year , int month , int day );\n    DateProperty toDateHijri( qint64 days_from_hijri_zero );\n    qint64 leapsNumberHijri( qint64 year );\n    int leapIndexHijri( qint64 year );\n    QString monthNamesHijri(int m);\n    QString dayNameHijri( int d );\n\nprivate:\n    AsemanCalendarConverterCorePrivate *p;\n};\n\nclass LIBQTASEMAN_CORE_EXPORT JalaliCalendarObject : public QObject\n{\n    Q_OBJECT\npublic:\n    JalaliCalendarObject(QObject *parent = Q_NULLPTR): QObject(parent){}\n};\n\n#endif // ASEMANCALENDARCONVERTERCORE_H\n"
  },
  {
    "path": "src/core/asemancalendarmodel.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemancalendarmodel.h\"\n\n#include <QTimer>\n#include <QDebug>\n\nclass AsemanCalendarModelPrivate\n{\npublic:\n    AsemanCalendarConverter *conv;\n    QDateTime dateTime;\n    QDateTime minimum;\n    QDateTime maximum;\n    int calendar;\n\n    QList<int> years;\n    QList<int> months;\n    QList<int> days;\n    QList<int> hours;\n    QList<int> minutes;\n\n    int currentYearIndex;\n    int currentMonthIndex;\n    int currentDaysIndex;\n    int currentHoursIndex;\n    int currentMinutesIndex;\n\n    QTimer *refreshTimer;\n};\n\nAsemanCalendarModel::AsemanCalendarModel(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanCalendarModelPrivate;\n    p->calendar = CalendarGregorian;\n    p->currentYearIndex = 0;\n    p->currentMonthIndex = 0;\n    p->currentDaysIndex = 0;\n    p->currentHoursIndex = 0;\n    p->currentMinutesIndex = 0;\n\n    p->dateTime = QDateTime::currentDateTime();\n    p->minimum = p->dateTime.addYears(-100);\n    p->maximum = p->dateTime.addYears(100);\n\n    p->conv = new AsemanCalendarConverter(this);\n    p->conv->setCalendar(p->calendar);\n\n    p->refreshTimer = new QTimer(this);\n    p->refreshTimer->setSingleShot(true);\n    p->refreshTimer->setInterval(100);\n\n    connect(p->refreshTimer, &QTimer::timeout, this, &AsemanCalendarModel::refreshLists_prv);\n\n    refreshLists_prv();\n}\n\nQList<int> AsemanCalendarModel::years() const\n{\n    return p->years;\n}\n\nQList<int> AsemanCalendarModel::months() const\n{\n    return p->months;\n}\n\nQList<int> AsemanCalendarModel::days() const\n{\n    return p->days;\n}\n\nQList<int> AsemanCalendarModel::hours() const\n{\n    return p->hours;\n}\n\nQList<int> AsemanCalendarModel::minutes() const\n{\n    return p->minutes;\n}\n\nint AsemanCalendarModel::currentYearIndex() const\n{\n    return p->currentYearIndex;\n}\n\nint AsemanCalendarModel::currentMonthIndex() const\n{\n    return p->currentMonthIndex;\n}\n\nint AsemanCalendarModel::currentDaysIndex() const\n{\n    return p->currentDaysIndex;\n}\n\nint AsemanCalendarModel::currentHoursIndex() const\n{\n    return p->currentHoursIndex;\n}\n\nint AsemanCalendarModel::currentMinutesIndex() const\n{\n    return p->currentMinutesIndex;\n}\n\nvoid AsemanCalendarModel::setDateTime(const QDateTime &dt)\n{\n    if(p->dateTime == dt)\n        return;\n\n    p->dateTime = dt;\n    if(p->dateTime < p->minimum)\n        p->dateTime = p->minimum;\n    else\n    if(p->dateTime > p->maximum)\n        p->dateTime = p->maximum;\n\n    refreshLists();\n    Q_EMIT dateTimeChanged();\n}\n\nQDateTime AsemanCalendarModel::dateTime() const\n{\n    return p->dateTime;\n}\n\nvoid AsemanCalendarModel::setCalendar(int t)\n{\n    if(p->calendar == t)\n        return;\n\n    p->calendar = t;\n    p->conv->setCalendar(t);\n\n    refreshLists_prv();\n    Q_EMIT calendarChanged();\n}\n\nint AsemanCalendarModel::calendar() const\n{\n    return p->calendar;\n}\n\nvoid AsemanCalendarModel::setMinimum(const QDateTime &dt)\n{\n    if(p->minimum == dt)\n        return;\n\n    p->minimum = dt;\n    if(p->minimum > p->maximum)\n        p->minimum = p->maximum;\n\n    refreshLists();\n    Q_EMIT minimumChanged();\n\n    if(p->dateTime < p->minimum)\n    {\n        p->dateTime = p->minimum;\n        Q_EMIT dateTimeChanged();\n    }\n}\n\nQDateTime AsemanCalendarModel::minimum() const\n{\n    return p->minimum;\n}\n\nvoid AsemanCalendarModel::setMaximum(const QDateTime &dt)\n{\n    if(p->maximum == dt)\n        return;\n\n    p->maximum = dt;\n    if(p->minimum > p->maximum)\n        p->maximum = p->minimum;\n\n    refreshLists();\n    Q_EMIT maximumChanged();\n\n    if(p->dateTime > p->maximum)\n    {\n        p->dateTime = p->maximum;\n        refreshLists();\n        Q_EMIT dateTimeChanged();\n    }\n}\n\nQDateTime AsemanCalendarModel::maximum() const\n{\n    return p->maximum;\n}\n\nvoid AsemanCalendarModel::setConvertDate(int yearIdx, int monthIdx, int dayIdx, int hourIdx, int minuteIdx)\n{\n    if(yearIdx < 0 || yearIdx > p->years.length())\n        return;\n    if(monthIdx < 0 || monthIdx > p->months.length())\n        return;\n    if(dayIdx < 0 || dayIdx > p->days.length())\n        return;\n    if(hourIdx < 0 || hourIdx > p->hours.length())\n        return;\n    if(minuteIdx < 0 || minuteIdx > p->minutes.length())\n        return;\n\n    int year = p->years.at(yearIdx);\n    int month = p->months.at(monthIdx);\n    int day = p->days.at(dayIdx);\n    int hour = p->hours.at(hourIdx);\n    int minute = p->minutes.at(minuteIdx);\n\n    const QDate &date = p->conv->convertDateToGragorian(year, month, day);\n    setDateTime( QDateTime(date, QTime(hour, minute)) );\n}\n\nQString AsemanCalendarModel::monthName(int month)\n{\n    return p->conv->monthName(month);\n}\n\nvoid AsemanCalendarModel::refreshLists()\n{\n    p->refreshTimer->stop();\n    p->refreshTimer->start();\n}\n\nvoid AsemanCalendarModel::refreshLists_prv()\n{\n    const DateProperty &min = p->conv->convertDate(p->minimum.date());\n    const DateProperty &max = p->conv->convertDate(p->maximum.date());\n    const DateProperty &dt = p->conv->convertDate(p->dateTime.date());\n\n\n    QList<int> years;\n    qint64 yearStart = min.year;\n    qint64 yearEnd = max.year;\n    for(qint64 i=yearStart; i<=yearEnd; i++)\n        years << i;\n\n    QList<int> months;\n    int monthStart = (min.year == dt.year? min.month : 1);\n    int monthEnd = (max.year == dt.year? max.month : 12);\n    for(int i=monthStart; i<=monthEnd; i++)\n        months << i;\n\n    QList<int> days;\n    int dayStart = (min.year == dt.year && min.month == dt.month? min.day : 1);\n    int dayEnd = (max.year == dt.year && max.month == dt.month? max.day : p->conv->daysOfMonth(dt.year, dt.month));\n    for(int i=dayStart; i<=dayEnd; i++)\n        days << i;\n\n    QList<int> hours;\n    int hourStart = (min==dt? p->minimum.time().hour() : 0);\n    int hourEnd = (max==dt? p->maximum.time().hour() : 23);\n    for(int i=hourStart; i<=hourEnd; i++)\n        hours << i;\n\n    QList<int> minutes;\n    int minuteStart = (min==dt && p->minimum.time().hour() == p->dateTime.time().hour()? p->minimum.time().minute() : 0);\n    int minuteEnd = (max==dt && p->minimum.time().hour() == p->dateTime.time().hour()? p->maximum.time().minute() : 59);\n    for(int i=minuteStart; i<=minuteEnd; i++)\n        minutes << i;\n\n    int currentYearIndex = dt.year - yearStart;\n    int currentMonthIndex = dt.month - monthStart;\n    int currentDaysIndex = dt.day - dayStart;\n    int currentHoursIndex = p->dateTime.time().hour() - hourStart;\n    int currentMinutesIndex = p->dateTime.time().minute() - minuteStart;\n\n    bool years_changed = (p->years != years);\n    bool months_changed = (p->months != months);\n    bool days_changed = (p->days != days);\n    bool hours_changed = (p->hours != hours);\n    bool minutes_changed = (p->minutes != minutes);\n    bool currentYearIndex_changed = (p->currentYearIndex != currentYearIndex);\n    bool currentMonthIndex_changed = (p->currentMonthIndex != currentMonthIndex);\n    bool currentDaysIndex_changed = (p->currentDaysIndex != currentDaysIndex);\n    bool currentHoursIndex_changed = (p->currentHoursIndex != currentHoursIndex);\n    bool currentMinutesIndex_changed = (p->currentMinutesIndex != currentMinutesIndex);\n\n    p->years = years;\n    p->months = months;\n    p->days = days;\n    p->hours = hours;\n    p->minutes = minutes;\n    p->currentYearIndex = currentYearIndex;\n    p->currentMonthIndex = currentMonthIndex;\n    p->currentDaysIndex = currentDaysIndex;\n    p->currentHoursIndex = currentHoursIndex;\n    p->currentMinutesIndex = currentMinutesIndex;\n\n    if(years_changed) Q_EMIT yearsChanged();\n    if(months_changed) Q_EMIT monthsChanged();\n    if(days_changed) Q_EMIT daysChanged();\n    if(hours_changed) Q_EMIT hoursChanged();\n    if(minutes_changed) Q_EMIT minutesChanged();\n    if(currentYearIndex_changed || years_changed) Q_EMIT currentYearIndexChanged();\n    if(currentMonthIndex_changed || months_changed) Q_EMIT currentMonthIndexChanged();\n    if(currentDaysIndex_changed || days_changed) Q_EMIT currentDaysIndexChanged();\n    if(currentHoursIndex_changed || hours_changed) Q_EMIT currentHoursIndexChanged();\n    if(currentMinutesIndex_changed || minutes_changed) Q_EMIT currentMinutesIndexChanged();\n}\n\nAsemanCalendarModel::~AsemanCalendarModel()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/core/asemancalendarmodel.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANCALENDARMODEL_H\n#define ASEMANCALENDARMODEL_H\n\n#include <QObject>\n#include <QStringList>\n#include <QDateTime>\n\n#include \"asemancalendarconverter.h\"\n\n#include \"asemancore_global.h\"\n\nclass AsemanCalendarModelPrivate;\n/*!\n    \\private\n */\nclass LIBQTASEMAN_CORE_EXPORT AsemanCalendarModel : public QObject\n{\n    Q_OBJECT\n    Q_ENUMS(CalendarTypes)\n\n    Q_PROPERTY(QList<int> years   READ years   NOTIFY yearsChanged)\n    Q_PROPERTY(QList<int> months  READ months  NOTIFY monthsChanged)\n    Q_PROPERTY(QList<int> days    READ days    NOTIFY daysChanged)\n    Q_PROPERTY(QList<int> hours   READ hours   NOTIFY hoursChanged)\n    Q_PROPERTY(QList<int> minutes READ minutes NOTIFY minutesChanged)\n\n    Q_PROPERTY(int currentYearIndex    READ currentYearIndex    NOTIFY currentYearIndexChanged   )\n    Q_PROPERTY(int currentMonthIndex   READ currentMonthIndex   NOTIFY currentMonthIndexChanged  )\n    Q_PROPERTY(int currentDaysIndex    READ currentDaysIndex    NOTIFY currentDaysIndexChanged   )\n    Q_PROPERTY(int currentHoursIndex   READ currentHoursIndex   NOTIFY currentHoursIndexChanged  )\n    Q_PROPERTY(int currentMinutesIndex READ currentMinutesIndex NOTIFY currentMinutesIndexChanged)\n\n    Q_PROPERTY(QDateTime dateTime READ dateTime WRITE setDateTime NOTIFY dateTimeChanged)\n    Q_PROPERTY(int calendar READ calendar WRITE setCalendar NOTIFY calendarChanged)\n\n    Q_PROPERTY(QDateTime minimum READ minimum WRITE setMinimum NOTIFY minimumChanged)\n    Q_PROPERTY(QDateTime maximum READ maximum WRITE setMaximum NOTIFY maximumChanged)\n\npublic:\n\n    enum CalendarTypes{\n        CalendarGregorian = AsemanCalendarConverterCore::Gregorian,\n        CalendarJalali = AsemanCalendarConverterCore::Jalali,\n        CalendarHijri = AsemanCalendarConverterCore::Hijri\n    };\n\n    AsemanCalendarModel(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanCalendarModel();\n\n    QList<int> years() const;\n    QList<int> months() const;\n    QList<int> days() const;\n    QList<int> hours() const;\n    QList<int> minutes() const;\n\n    int currentYearIndex() const;\n    int currentMonthIndex() const;\n    int currentDaysIndex() const;\n    int currentHoursIndex() const;\n    int currentMinutesIndex() const;\n\n    void setDateTime(const QDateTime &dt);\n    QDateTime dateTime() const;\n\n    void setCalendar(int t);\n    int calendar() const;\n\n    void setMinimum(const QDateTime &dt);\n    QDateTime minimum() const;\n\n    void setMaximum(const QDateTime &dt);\n    QDateTime maximum() const;\n\npublic Q_SLOTS:\n    void setConvertDate(int yearIdx, int monthIdx, int dayIdx, int hourIdx, int minuteIdx);\n    QString monthName(int month);\n\nQ_SIGNALS:\n    void yearsChanged();\n    void monthsChanged();\n    void daysChanged();\n    void hoursChanged();\n    void minutesChanged();\n    void secondsChanged();\n    void dateTimeChanged();\n    void calendarChanged();\n    void minimumChanged();\n    void maximumChanged();\n\n    void currentYearIndexChanged();\n    void currentMonthIndexChanged();\n    void currentDaysIndexChanged();\n    void currentHoursIndexChanged();\n    void currentMinutesIndexChanged();\n\nprivate Q_SLOTS:\n    void refreshLists();\n    void refreshLists_prv();\n\nprivate:\n    AsemanCalendarModelPrivate *p;\n};\n\ntypedef AsemanCalendarModel QAsemanCalendarModel;\n\n#endif // ASEMANCALENDARMODEL_H\n"
  },
  {
    "path": "src/core/asemancore_global.h",
    "content": "#ifndef ASEMAN_CORE_GLOBAL_H\n#define ASEMAN_CORE_GLOBAL_H\n\n#include <QtCore/qglobal.h>\n\n#if !defined(QT_STATIC) && !defined(QASEMAN_STATIC)\n#if defined(LIBQTASEMAN_CORE_LIBRARY)\n#  define LIBQTASEMAN_CORE_EXPORT Q_DECL_EXPORT\n#else\n#  define LIBQTASEMAN_CORE_EXPORT Q_DECL_IMPORT\n#endif\n#else\n#define LIBQTASEMAN_CORE_EXPORT\n#endif\n\n#endif // ASEMAN_CORE_GLOBAL_H\n"
  },
  {
    "path": "src/core/asemancoreresource_lib.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/asemantools\">\n        <file>files/countries.csv</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "src/core/asemancountriesmodel.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/*!\n    \\class AsemanCountriesModel\n    \\brief The AsemanCountriesModel class provides a data model for the world countries\n    and their details like phone-codes, languages and ...\n\n    \\reentrant\n    \\ingroup AsemanCore\n */\n\n/*!\n    \\fn AsemanCountriesModel::countChanged\n    This signal emits when count of the model changed.\n    \\sa count\n */\n\n/*!\n    \\fn AsemanCountriesModel::filterChanged\n    This signal emits when current filter changed.\n    \\sa setFilter\n    \\sa filter\n */\n\n/*!\n    \\fn AsemanCountriesModel::systemCountryChanged\n    This signal emits when systemCountry changed.\n    \\sa systemCountry\n */\n\n#include \"asemancountriesmodel.h\"\n\n#include <QFile>\n#include <QStringList>\n#include <QHash>\n#include <QLocale>\n#ifndef Q_OS_WASM\n#include <QTimeZone>\n#endif\n#include <QDebug>\n\n/*!\n    \\private\n */\nclass AsemanCountriesModelPrivate\n{\npublic:\n    QMap<QString, QHash<QString,QString> > data;\n    QStringList fullList;\n    QList<QString> list;\n    QString filter;\n    QString systemCountry;\n};\n\nAsemanCountriesModel::AsemanCountriesModel(QObject *parent) :\n    AsemanAbstractListModel(parent)\n{\n    p = new AsemanCountriesModelPrivate;\n    Q_INIT_RESOURCE(asemancoreresource_lib);\n    init_buff();\n}\n\nQString AsemanCountriesModel::id(const QModelIndex &index) const\n{\n    int row = index.row();\n    return p->list.at(row);\n}\n\nint AsemanCountriesModel::rowCount(const QModelIndex &parent) const\n{\n    Q_UNUSED(parent)\n    return p->list.count();\n}\n\nQVariant AsemanCountriesModel::data(const QModelIndex &index, int role) const\n{\n    QVariant res;\n    const QString & key = id(index);\n    switch( role )\n    {\n    case Qt::DisplayRole:\n    case NameRole:\n        res = p->data[key][QStringLiteral(\"name\")];\n        break;\n\n    case NativeNameRole:\n        res = p->data[key][QStringLiteral(\"nativeName\")];\n        break;\n\n    case TldRole:\n        res = p->data[key][QStringLiteral(\"tld\")];\n        break;\n\n    case Cca2Role:\n        res = p->data[key][QStringLiteral(\"cca2\")];\n        break;\n\n    case Ccn3Role:\n        res = p->data[key][QStringLiteral(\"ccn3\")];\n        break;\n\n    case Cca3Role:\n        res = p->data[key][QStringLiteral(\"cca3\")];\n        break;\n\n    case CurrencyRole:\n        res = p->data[key][QStringLiteral(\"currency\")];\n        break;\n\n    case CallingCodeRole:\n        res = p->data[key][QStringLiteral(\"callingCode\")];\n        break;\n\n    case CapitalRole:\n        res = p->data[key][QStringLiteral(\"capital\")];\n        break;\n\n    case AltSpellingsRole:\n        res = p->data[key][QStringLiteral(\"altSpellings\")];\n        break;\n\n    case RelevanceRole:\n        res = p->data[key][QStringLiteral(\"relevance\")];\n        break;\n\n    case RegionRole:\n        res = p->data[key][QStringLiteral(\"region\")];\n        break;\n\n    case SubregionRole:\n        res = p->data[key][QStringLiteral(\"subregion\")];\n        break;\n\n    case LanguageRole:\n        res = p->data[key][QStringLiteral(\"language\")];\n        break;\n\n    case LanguageCodesRole:\n        res = p->data[key][QStringLiteral(\"languageCodes\")];\n        break;\n\n    case TranslationsRole:\n        res = p->data[key][QStringLiteral(\"translations\")];\n        break;\n\n    case LatlngRole:\n        res = p->data[key][QStringLiteral(\"latlng\")];\n        break;\n\n    case DemonymRole:\n        res = p->data[key][QStringLiteral(\"demonym\")];\n        break;\n\n    case BordersRole:\n        res = p->data[key][QStringLiteral(\"borders\")];\n        break;\n\n    case AreaRole:\n        res = p->data[key][QStringLiteral(\"area\")];\n        break;\n\n    case KeyRole:\n        res = key;\n        break;\n    }\n\n    return res;\n}\n\nQHash<qint32, QByteArray> AsemanCountriesModel::roleNames() const\n{\n    static QHash<qint32, QByteArray> *res = 0;\n    if( res )\n        return *res;\n\n    res = new QHash<qint32, QByteArray>();\n    res->insert( NameRole, \"name\");\n    res->insert( NativeNameRole, \"nativeName\");\n    res->insert( TldRole, \"tld\");\n    res->insert( Cca2Role, \"cca2\");\n    res->insert( Ccn3Role, \"ccn3\");\n    res->insert( Cca3Role, \"cca3\");\n    res->insert( CurrencyRole, \"currency\");\n    res->insert( CallingCodeRole, \"callingCode\");\n    res->insert( CapitalRole, \"capital\");\n    res->insert( AltSpellingsRole, \"altSpellings\");\n    res->insert( RelevanceRole, \"relevance\");\n    res->insert( RegionRole, \"region\");\n    res->insert( SubregionRole, \"subregion\");\n    res->insert( LanguageRole, \"language\");\n    res->insert( LanguageCodesRole, \"languageCodes\");\n    res->insert( TranslationsRole, \"translations\");\n    res->insert( LatlngRole, \"latlng\");\n    res->insert( DemonymRole, \"demonym\");\n    res->insert( BordersRole, \"borders\");\n    res->insert( AreaRole, \"area\");\n    res->insert( KeyRole, \"key\");\n\n    return *res;\n}\n\n\n/*!\n    Returns count of items exists in the model.\n    \\returns count of items exists in the model.\n    \\sa indexOf\n */\nint AsemanCountriesModel::count() const\n{\n    return p->list.count();\n}\n\n\n/*!\n    Returns index number assigned to the \\a name country.\n    \\return index number assigned to the \\a name country.\n    \\param name Country name\n    \\sa count\n */\nint AsemanCountriesModel::indexOf(const QString &name)\n{\n    return p->list.indexOf(name.toLower());\n}\n\n\n/*!\n    Sets filter to the model. It acted like search that filters all\n    countries that hasn't \\a filter in their names.\n    \\param filter Set it as current filter.\n    \\sa filter\n */\nvoid AsemanCountriesModel::setFilter(const QString &filter)\n{\n    if(p->filter == filter)\n        return;\n\n    p->filter = filter;\n\n    QStringList list = p->fullList;\n    for(int i=0; i<list.count(); i++)\n        if(!list.at(i).contains(filter.toLower()))\n        {\n            list.removeAt(i);\n            i--;\n        }\n\n    changed(list);\n\n    Q_EMIT filterChanged();\n}\n\n\n/*!\n    Returns current filter.\n    \\return current filter.\n    \\sa setFilter\n */\nQString AsemanCountriesModel::filter() const\n{\n    return p->filter;\n}\n\n\n/*!\n    Returns country of the current machine based on the\n    operating system locale settings.\n    \\return Country name\n    \\sa setFilter\n */\nQString AsemanCountriesModel::systemCountry() const\n{\n    return p->systemCountry;\n}\n\nvoid AsemanCountriesModel::init_buff()\n{\n    QFile file(QStringLiteral(\":/asemantools/files/countries.csv\"));\n    if( !file.open(QFile::ReadOnly) )\n    {\n        qDebug() << __FUNCTION__ << \"Can't load countries.csv file\";\n        return;\n    }\n\n    QString data = QString::fromUtf8(file.readAll());\n    QStringList splits = data.split(QStringLiteral(\"\\n\"),Qt::SkipEmptyParts);\n    if( splits.isEmpty() )\n        return;\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)) && !defined(Q_OS_WASM)\n    QString country = QLocale::countryToString(QTimeZone::systemTimeZone().country()).toLower().trimmed().remove(QStringLiteral(\" \"));\n#else\n    QString country;\n#endif\n    QStringList heads = splits.takeFirst().split(QStringLiteral(\";\"));\n\n    for( const QString & s: splits )\n    {\n        const QStringList & parts = s.split(QStringLiteral(\";\"));\n        for( int i=0; i<parts.count(); i++ )\n        {\n            const QString & prt = parts.at(i);\n            const QString & countryName = parts.first().toLower();\n            if(countryName.toLower().trimmed().remove(QStringLiteral(\" \")) == country)\n                p->systemCountry = countryName;\n\n            p->data[countryName][heads.at(i)] = prt.split(QStringLiteral(\",\")).first();\n        }\n    }\n\n    p->fullList = p->data.keys();\n    changed(p->fullList);\n    Q_EMIT systemCountryChanged();\n}\n\nvoid AsemanCountriesModel::changed(const QStringList &list)\n{\n    bool count_changed = (list.count()!=p->list.count());\n\n    for( int i=0 ; i<p->list.count() ; i++ )\n    {\n        const QString &item = p->list.at(i);\n        if( list.contains(item) )\n            continue;\n\n        beginRemoveRows(QModelIndex(), i, i);\n        p->list.removeAt(i);\n        i--;\n        endRemoveRows();\n    }\n\n    QList<QString> temp_list = list;\n    for( int i=0 ; i<temp_list.count() ; i++ )\n    {\n        const QString &item = temp_list.at(i);\n        if( p->list.contains(item) )\n            continue;\n\n        temp_list.removeAt(i);\n        i--;\n    }\n    while( p->list != temp_list )\n        for( int i=0 ; i<p->list.count() ; i++ )\n        {\n            const QString &item = p->list.at(i);\n            int nw = temp_list.indexOf(item);\n            if( i == nw )\n                continue;\n\n            beginMoveRows( QModelIndex(), i, i, QModelIndex(), nw>i?nw+1:nw );\n            p->list.move( i, nw );\n            endMoveRows();\n        }\n\n    for( int i=0 ; i<list.count() ; i++ )\n    {\n        const QString &item = list.at(i);\n        if( p->list.contains(item) )\n            continue;\n\n        beginInsertRows(QModelIndex(), i, i );\n        p->list.insert( i, item );\n        endInsertRows();\n    }\n\n    if(count_changed)\n        Q_EMIT countChanged();\n}\n\nAsemanCountriesModel::~AsemanCountriesModel()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/core/asemancountriesmodel.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANCOUNTRIESMODEL_H\n#define ASEMANCOUNTRIESMODEL_H\n\n#include <QObject>\n#include <QStringList>\n#include \"asemanabstractlistmodel.h\"\n\n#include \"asemancore_global.h\"\n\nclass AsemanCountriesModelPrivate;\nclass LIBQTASEMAN_CORE_EXPORT AsemanCountriesModel : public AsemanAbstractListModel\n{\n    Q_OBJECT\n    Q_ENUMS(ColorfullListModelRoles)\n    Q_PROPERTY(int count READ count NOTIFY countChanged)\n    Q_PROPERTY(QString filter READ filter WRITE setFilter NOTIFY filterChanged)\n    Q_PROPERTY(QString systemCountry READ systemCountry NOTIFY systemCountryChanged)\n\npublic:\n    enum ColorfullListModelRoles {\n        NameRole = Qt::UserRole,\n        NativeNameRole,\n        TldRole,\n        Cca2Role,\n        Ccn3Role,\n        Cca3Role,\n        CurrencyRole,\n        CallingCodeRole,\n        CapitalRole,\n        AltSpellingsRole,\n        RelevanceRole,\n        RegionRole,\n        SubregionRole,\n        LanguageRole,\n        LanguageCodesRole,\n        TranslationsRole,\n        LatlngRole,\n        DemonymRole,\n        BordersRole,\n        AreaRole,\n        KeyRole\n    };\n\n    AsemanCountriesModel(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanCountriesModel();\n\n#ifndef ASEMAN_OXYGEN_SKIP\n    QString id( const QModelIndex &index ) const;\n\n    int rowCount(const QModelIndex & parent = QModelIndex()) const Q_DECL_OVERRIDE;\n    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;\n\n    QHash<qint32,QByteArray> roleNames() const Q_DECL_OVERRIDE;\n\n    int count() const;\n#endif\n\n    Q_INVOKABLE int indexOf(const QString &name);\n\n    void setFilter(const QString &filter);\n#ifndef ASEMAN_OXYGEN_SKIP\n    QString filter() const;\n\n    QString systemCountry() const;\n#endif\n\nQ_SIGNALS:\n    void countChanged();\n    void filterChanged();\n    void systemCountryChanged();\n\nprivate:\n    void init_buff();\n    void changed(const QStringList &list);\n\nprivate:\n    AsemanCountriesModelPrivate *p;\n};\n\ntypedef AsemanCountriesModel QAsemanCountriesModel;\n\n#endif // ASEMANCOUNTRIESMODEL_H\n"
  },
  {
    "path": "src/core/asemandebugobjectcounter.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemandebugobjectcounter.h\"\n\n#include <QTimer>\n#include <QPointer>\n#include <QMap>\n#include <QDebug>\n\nclass AsemanDebugObjectCounterPrivate\n{\npublic:\n    QTimer *timer;\n    QPointer<QObject> object;\n};\n\nAsemanDebugObjectCounter::AsemanDebugObjectCounter(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanDebugObjectCounterPrivate;\n    p->timer = new QTimer(this);\n\n    connect(p->timer, &QTimer::timeout, this, &AsemanDebugObjectCounter::timeout);\n}\n\nvoid AsemanDebugObjectCounter::start(QObject *object, int interval)\n{\n    p->timer->stop();\n\n    p->object = object;\n    p->timer->setInterval(interval);\n    p->timer->start();\n}\n\nvoid AsemanDebugObjectCounter::timeout()\n{\n    if(!p->object)\n    {\n        p->timer->stop();\n        return;\n    }\n\n    QMap<QString,int> counts;\n    calculate(p->object, counts);\n\n    qDebug() << \"\\n\\n\";\n    int total = 0;\n    QMapIterator<QString,int> i(counts);\n    while(i.hasNext())\n    {\n        i.next();\n        qDebug() << i.key() + \" = \" << i.value();\n        total += i.value();\n    }\n\n    qDebug() << \"total\" << total;\n}\n\nvoid AsemanDebugObjectCounter::calculate(QObject *obj, QMap<QString, int> &count)\n{\n    count[QString::fromUtf8(obj->metaObject()->className())] = count[QString::fromUtf8(obj->metaObject()->className())]+1;\n\n    QObjectList childs = obj->children();\n    for(QObject *child: childs)\n        calculate(child, count);\n}\n\nAsemanDebugObjectCounter::~AsemanDebugObjectCounter()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/core/asemandebugobjectcounter.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANDEBUGOBJECTCOUNTER_H\n#define ASEMANDEBUGOBJECTCOUNTER_H\n\n#include <QObject>\n\n#include \"asemancore_global.h\"\n\nclass AsemanDebugObjectCounterPrivate;\n/*!\n    \\private\n */\nclass LIBQTASEMAN_CORE_EXPORT AsemanDebugObjectCounter : public QObject\n{\n    Q_OBJECT\npublic:\n    AsemanDebugObjectCounter(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanDebugObjectCounter();\n\npublic Q_SLOTS:\n    void start(QObject *object, int interval);\n\nprivate Q_SLOTS:\n    void timeout();\n\nprivate:\n    void calculate(QObject *obj, QMap<QString, int> &count);\n\nprivate:\n    AsemanDebugObjectCounterPrivate *p;\n};\n\ntypedef AsemanDebugObjectCounter QAsemanDebugObjectCounter;\n\n#endif // ASEMANDEBUGOBJECTCOUNTER_H\n"
  },
  {
    "path": "src/core/asemanencrypter.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/*!\n    \\class AsemanEncrypter\n    \\brief Provides encrypt and decrypt API based on the Serpent32 and CFB encrypt method.\n    It's based on the SimpleQtCryptor library.\n\n    \\reentrant\n    \\ingroup AsemanCore\n */\n\n/*!\n    \\fn AsemanEncrypter::keyChanged\n    This signal emits when key value changed.\n    \\sa count\n */\n\n#include \"asemanencrypter.h\"\n\n\n/*!\n    Encrypt \\a data using serpent32 algorithm and return encrypted data.\n    \\param data data to encrypt\n    \\return encrypted data\n    \\sa setKey\n */\nQByteArray AsemanEncrypter::encrypt(const QByteArray &data)\n{\n    QByteArray result;\n    AsemanSimpleQtCryptor::Encryptor enc( _key, AsemanSimpleQtCryptor::SERPENT_32, AsemanSimpleQtCryptor::ModeCFB, AsemanSimpleQtCryptor::NoChecksum );\n    if(enc.encrypt( data, result, true ) == AsemanSimpleQtCryptor::NoError)\n        return result;\n    else\n        return data;\n}\n\n\n/*!\n    Decrypt \\a data using serpent32 algorithm and return decrypted data.\n    \\param data data to decrypt\n    \\return Decrypted data\n    \\sa setKey\n */\nQByteArray AsemanEncrypter::decrypt(const QByteArray &data)\n{\n    QByteArray result;\n    AsemanSimpleQtCryptor::Decryptor dec( _key, AsemanSimpleQtCryptor::SERPENT_32, AsemanSimpleQtCryptor::ModeCFB );\n    if(dec.decrypt( data, result, true ) == AsemanSimpleQtCryptor::NoError)\n        return result;\n    else\n        return QByteArray();\n}\n\n\n/*!\n    Sets key parametrs to \\a key argument that using for password of the\n    encryption or decryption operation.\n    \\param key key of the encrypt/decrypt\n    \\sa key\n    \\sa encrypt\n */\nvoid AsemanEncrypter::setKey(const QString &key)\n{\n    if(_keyStr == key)\n        return;\n\n    _keyStr = key;\n    _key = QSharedPointer<AsemanSimpleQtCryptor::Key>(new AsemanSimpleQtCryptor::Key(_keyStr));\n    Q_EMIT keyChanged();\n}\n\n/*!\n    Return the key value, used for the encrypt/descrupt password.\n    \\return key value\n    \\sa setKey\n */\nQString AsemanEncrypter::key() const\n{\n    return _keyStr;\n}\n"
  },
  {
    "path": "src/core/asemanencrypter.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANENCRYPTER_H\n#define ASEMANENCRYPTER_H\n\n#include \"asemansimpleqtcryptor.h\"\n\n#include \"asemancore_global.h\"\n\nclass LIBQTASEMAN_CORE_EXPORT AsemanEncrypter : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QString key READ key WRITE setKey NOTIFY keyChanged)\n\npublic:\n    AsemanEncrypter(QObject *parent = Q_NULLPTR): QObject(parent){}\n    virtual ~AsemanEncrypter(){}\n\n    void setKey(const QString &key);\n#ifndef ASEMAN_OXYGEN_SKIP\n    QString key() const;\n#endif\n\npublic Q_SLOTS:\n    QByteArray encrypt(const QByteArray &data);\n    QByteArray decrypt(const QByteArray &data);\n\nQ_SIGNALS:\n    void keyChanged();\n\nprivate:\n    QString _keyStr;\n    QSharedPointer<AsemanSimpleQtCryptor::Key> _key;\n};\n\ntypedef AsemanEncrypter QAsemanEncrypter;\n\n#endif // ASEMANENCRYPTER_H\n"
  },
  {
    "path": "src/core/asemanfilesystemmodel.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/*!\n    \\class AsemanFileSystemModel\n    \\brief The AsemanFileSystemModel class provides a data model system to\n    fetch and push file system data to the view.\n\n    \\reentrant\n    \\ingroup AsemanCore\n */\n\n/*!\n    \\fn AsemanFileSystemModel::countChanged\n    This signal emits when count of the model changed.\n    \\sa setCount\n */\n\n/*!\n    \\fn AsemanFileSystemModel::showDirsChanged\n    This signal emits when showDirs flag changed.\n    \\sa setShowDirs\n */\n\n/*!\n    \\fn AsemanFileSystemModel::showDotAndDotDotChanged\n    This signal emits when showDotAndDotDot flag changed.\n    \\sa setShowDotAndDotDot\n */\n\n/*!\n    \\fn AsemanFileSystemModel::showDirsFirstChanged\n    This signal emits when showDirsFirst flag changed.\n    \\sa setShowDirsFirst\n */\n\n/*!\n    \\fn AsemanFileSystemModel::showFilesChanged\n    This signal emits when showFiles flag changed.\n    \\sa setShowFiles\n */\n\n/*!\n    \\fn AsemanFileSystemModel::showHiddenChanged\n    This signal emits when showHidden flag changed.\n    \\sa setShowHidden\n */\n\n/*!\n    \\fn AsemanFileSystemModel::nameFiltersChanged\n    This signal emits when nameFilters changed.\n    \\sa setNameFilters\n */\n\n/*!\n    \\fn AsemanFileSystemModel::folderChanged\n    This signal emits when current folder changed.\n    \\sa setFolder\n */\n\n/*!\n    \\fn AsemanFileSystemModel::parentFolderChanged\n    This signal emits when parentFolder changed.\n    \\sa parentFolder\n */\n\n/*!\n    \\fn AsemanFileSystemModel::sortFieldChanged\n    This signal emits when sortField changed.\n    \\sa setSortField\n */\n\n/*!\n    \\fn AsemanFileSystemModel::recursiveChanged\n    This signal emits when recursive flag changed.\n    \\sa setRecursive\n */\n\n/*!\n    \\fn AsemanFileSystemModel::limitChanged\n    This signal emits when limit value changed.\n    \\sa setLimit\n */\n\n#include \"asemanfilesystemmodel.h\"\n\n#include <QFileSystemWatcher>\n#include <QDir>\n#include <QMimeData>\n#include <QMimeDatabase>\n#include <QMimeType>\n#include <QDateTime>\n#include <QFileInfo>\n#include <QTimerEvent>\n#include <QTimer>\n#include <QDebug>\n#include <QUrl>\n\n\nclass AsemanFileSystemModelPrivate\n{\npublic:\n    bool showDirs;\n    bool showDotAndDotDot;\n    bool showDirsFirst;\n    bool showFiles;\n    bool showHidden;\n    bool recursive;\n    QStringList nameFilters;\n    QString folder;\n    int sortField;\n    qint32 limit;\n\n    QList<QFileInfo> list;\n    QMimeDatabase mdb;\n\n    QFileSystemWatcher *watcher;\n    QTimer *refresh_timer;\n};\n\nclass SortUnitType\n{\npublic:\n    SortUnitType(): num(0){}\n    QChar ch;\n    quint64 num;\n};\n\nQList<SortUnitType> aseman_analize_file_name(const QString &fileName)\n{\n    QList<SortUnitType> res;\n    for(int i=0; i<fileName.length(); i++)\n    {\n        const QChar &ch = fileName[i];\n        if(ch.isNumber())\n        {\n            int num = QString(ch).toInt();\n            if(res.isEmpty() || !res.last().ch.isNull() )\n                res << SortUnitType();\n\n            SortUnitType & resUnit = res[res.length()-1];\n            resUnit.num = resUnit.num*10 + num;\n        }\n        else\n        {\n            SortUnitType unit;\n            unit.ch = ch;\n            res << unit;\n        }\n    }\n\n    return res;\n}\n\nAsemanFileSystemModelPrivate *fileListSort_private_data = Q_NULLPTR;\nbool aseman_fileListSort(const QFileInfo &f1, const QFileInfo &f2)\n{\n    if(fileListSort_private_data->sortField == AsemanFileSystemModel::Size)\n        return f1.size() < f2.size();\n    if(fileListSort_private_data->sortField == AsemanFileSystemModel::Date)\n        return f1.lastModified() > f2.lastModified();\n\n    if(fileListSort_private_data->showDirsFirst)\n    {\n        if(f1.isDir() && !f2.isDir())\n            return true;\n        if(!f1.isDir() && f2.isDir())\n            return false;\n    }\n\n    const QString & s1 = f1.fileName();\n    const QString & s2 = f2.fileName();\n\n    const QList<SortUnitType> &ul1 = aseman_analize_file_name(s1);\n    const QList<SortUnitType> &ul2 = aseman_analize_file_name(s2);\n\n    for(int i=0; i<ul1.length() && i<ul2.length(); i++)\n    {\n        const SortUnitType &u1 = ul1.at(i);\n        const SortUnitType &u2 = ul2.at(i);\n\n        if(u1.ch.isNull() && !u2.ch.isNull())\n            return true;\n        if(!u1.ch.isNull() && u2.ch.isNull())\n            return false;\n        if(!u1.ch.isNull() && !u2.ch.isNull())\n        {\n            if(u1.ch < u2.ch)\n                return true;\n            if(u1.ch > u2.ch)\n                return false;\n        }\n        if(u1.ch.isNull() && u2.ch.isNull())\n        {\n            if(u1.num < u2.num)\n                return true;\n            if(u1.num > u2.num)\n                return false;\n        }\n    }\n\n    return ul1.length() < ul2.length();\n}\n\n\n\nAsemanFileSystemModel::AsemanFileSystemModel(QObject *parent) :\n    AsemanAbstractListModel(parent)\n{\n    p = new AsemanFileSystemModelPrivate;\n    p->showDirs = true;\n    p->showDotAndDotDot = false;\n    p->showDirsFirst = true;\n    p->showFiles = true;\n    p->showHidden = false;\n    p->sortField = AsemanFileSystemModel::Name;\n    p->refresh_timer = Q_NULLPTR;\n    p->recursive = false;\n    p->limit = 0;\n\n    p->watcher = new QFileSystemWatcher(this);\n\n    p->refresh_timer = new QTimer(this);\n    p->refresh_timer->setInterval(10);\n\n    connect(p->watcher, &QFileSystemWatcher::directoryChanged, this, &AsemanFileSystemModel::refresh);\n    connect(p->watcher, &QFileSystemWatcher::fileChanged, this, &AsemanFileSystemModel::refresh);\n\n    connect(p->refresh_timer, &QTimer::timeout, this, &AsemanFileSystemModel::reinit_buffer);\n}\n\n\n/*!\n    Sets model showDirs flag to show directories or not.\n    \\param stt showDirs state\n    \\sa showDirs\n */\nvoid AsemanFileSystemModel::setShowDirs(bool stt)\n{\n    if(p->showDirs == stt)\n        return;\n\n    p->showDirs = stt;\n    Q_EMIT showDirsChanged();\n\n    refresh();\n}\n\n/*!\n    Returns showDirs flag state\n    \\sa setShowDirs\n */\nbool AsemanFileSystemModel::showDirs() const\n{\n    return p->showDirs;\n}\n\n\n/*!\n    Sets model showDotAndDotDot flag to show \".\" and \"..\" folders or not.\n    \\param stt \".\" and \"..\" state\n    \\sa showDotAndDotDot\n */\nvoid AsemanFileSystemModel::setShowDotAndDotDot(bool stt)\n{\n    if(p->showDotAndDotDot == stt)\n        return;\n\n    p->showDotAndDotDot = stt;\n    Q_EMIT showDotAndDotDotChanged();\n\n    refresh();\n}\n\n/*!\n    Returns showDotAndDotDot flag state\n    \\sa setShowDotAndDotDot\n */\nbool AsemanFileSystemModel::showDotAndDotDot() const\n{\n    return p->showDotAndDotDot;\n}\n\n\n/*!\n    Sets model showDirsFirst flag to show directories on the top of the list or not\n    \\param stt showDirsFirst state\n    \\sa showDirsFirst\n */\nvoid AsemanFileSystemModel::setShowDirsFirst(bool stt)\n{\n    if(p->showDirsFirst == stt)\n        return;\n\n    p->showDirsFirst = stt;\n    Q_EMIT showDirsFirstChanged();\n\n    refresh();\n}\n\n/*!\n    Returns showDirsFirst flag state\n    \\sa setShowDirsFirst\n */\nbool AsemanFileSystemModel::showDirsFirst() const\n{\n    return p->showDirsFirst;\n}\n\n\n/*!\n    Sets model showFiles flag to show files or not.\n    \\param stt showFiles state\n    \\sa showFiles\n */\nvoid AsemanFileSystemModel::setShowFiles(bool stt)\n{\n    if(p->showFiles == stt)\n        return;\n\n    p->showFiles = stt;\n    Q_EMIT showFilesChanged();\n\n    refresh();\n}\n\n/*!\n    Returns showFiles flag state\n    \\sa setShowFiles\n */\nbool AsemanFileSystemModel::showFiles() const\n{\n    return p->showFiles;\n}\n\n\n/*!\n    Sets model showHidden flag to show hidden or not.\n    \\param stt showHidden state\n    \\sa showHidden\n */\nvoid AsemanFileSystemModel::setShowHidden(bool stt)\n{\n    if(p->showHidden == stt)\n        return;\n\n    p->showHidden = stt;\n    Q_EMIT showHiddenChanged();\n\n    refresh();\n}\n\n/*!\n    Returns showHidden flag state\n    \\sa setShowHidden\n */\nbool AsemanFileSystemModel::showHidden() const\n{\n    return p->showHidden;\n}\n\n\n/*!\n    Sets nameFilters list to filter items in the model.\n    \\param list nameFilters state\n    \\sa nameFilters\n */\nvoid AsemanFileSystemModel::setNameFilters(const QStringList &list)\n{\n    if(p->nameFilters == list)\n        return;\n\n    p->nameFilters = list;\n    Q_EMIT nameFiltersChanged();\n\n    refresh();\n}\n\n/*!\n    Returns all nameFilters values\n    \\sa setNameFilters\n */\nQStringList AsemanFileSystemModel::nameFilters() const\n{\n    return p->nameFilters;\n}\n\n\n/*!\n    Sets current folder that model read data from it.\n    \\param url folder path\n    \\sa folder\n */\nvoid AsemanFileSystemModel::setFolder(const QString &url)\n{\n    if(p->folder == url)\n        return;\n\n    if(!p->folder.isEmpty())\n        p->watcher->removePath(p->folder);\n\n    p->folder = url;\n    if(!p->folder.isEmpty())\n        p->watcher->addPath(p->folder);\n\n    Q_EMIT folderChanged();\n\n    refresh();\n}\n\n/*!\n    Returns current folder string.\n    \\sa setFolder\n */\nQString AsemanFileSystemModel::folder() const\n{\n    return p->folder;\n}\n\n\n/*!\n    Sets sort SortFlag, model sort using it.\n    \\param field sort flag\n    \\sa sortField\n */\nvoid AsemanFileSystemModel::setSortField(int field)\n{\n    if(p->sortField == field)\n        return;\n\n    p->sortField = field;\n    Q_EMIT sortFieldChanged();\n\n    refresh();\n}\n\n/*!\n    Returns current sortField value.\n    \\sa setSortField\n */\nint AsemanFileSystemModel::sortField() const\n{\n    return p->sortField;\n}\n\n\n/*!\n    Recursive lookup files and folders. If it's set to true, model will show\n    all files of the folder, even in the sub-folders.\n    \\param recursive recursive flag\n    \\sa recursive\n */\nvoid AsemanFileSystemModel::setRecursive(bool recursive)\n{\n    if(p->recursive == recursive)\n        return;\n\n    p->recursive = recursive;\n    Q_EMIT recursiveChanged();\n\n    refresh();\n}\n\n/*!\n    Returns recursive flag state\n    \\sa setRecursive\n */\nbool AsemanFileSystemModel::recursive() const\n{\n    return p->recursive;\n}\n\n\n/*!\n    Sets limit of the files and folder to load in the model. It's useful\n    when you want to explore a folder with million of files and folders.\n    \\param limit limits of the model\n    \\sa limit\n */\nvoid AsemanFileSystemModel::setLimit(qint32 limit)\n{\n    if(p->limit == limit)\n        return;\n\n    p->limit = limit;\n    Q_EMIT limitChanged();\n}\n\n/*!\n    Returns limit value\n    \\sa setRecursive\n */\nqint32 AsemanFileSystemModel::limit() const\n{\n    return p->limit;\n}\n\n/*!\n    Returns parent path of the current folder. It's useful when you\n    want to add \"up\" action to your view.\n    \\sa folder\n */\nQString AsemanFileSystemModel::parentFolder() const\n{\n    return QFileInfo(p->folder).dir().absolutePath();\n}\n\nconst QFileInfo &AsemanFileSystemModel::id(const QModelIndex &index) const\n{\n    return p->list.at( index.row() );\n}\n\nint AsemanFileSystemModel::rowCount(const QModelIndex &parent) const\n{\n    Q_UNUSED(parent)\n    return count();\n}\n\nQVariant AsemanFileSystemModel::data(const QModelIndex &index, int role) const\n{\n    QVariant result;\n    const QFileInfo &info = id(index);\n    switch(role)\n    {\n    case FilePath:\n        result = info.filePath();\n        break;\n\n    case FileUrl:\n        result = QUrl::fromLocalFile(info.filePath());\n        break;\n\n    case FileName:\n        result = info.fileName();\n        break;\n\n    case FileMime:\n        result = p->mdb.mimeTypeForFile(info.filePath()).name();\n        break;\n\n    case FileSize:\n        result = info.size();\n        break;\n\n    case FileSuffix:\n        result = info.suffix();\n        break;\n\n    case FileBaseName:\n        result = info.completeBaseName();\n        break;\n\n    case FileIsDir:\n        result = info.isDir();\n        break;\n\n    case FileModifiedDate:\n        result = info.lastModified();\n        break;\n\n    case FileCreatedDate:\n        result = info.birthTime();\n        break;\n    }\n\n    return result;\n}\n\nQHash<qint32, QByteArray> AsemanFileSystemModel::roleNames() const\n{\n    static QHash<qint32, QByteArray> *res = 0;\n    if( res )\n        return *res;\n\n    res = new QHash<qint32, QByteArray>();\n    res->insert( FilePath, \"filePath\");\n    res->insert( FileUrl , \"fileUrl\");\n    res->insert( FileName, \"fileName\");\n    res->insert( FileMime, \"fileMime\");\n    res->insert( FileSize, \"fileSize\");\n    res->insert( FileSuffix, \"fileSuffix\");\n    res->insert( FileBaseName, \"fileBaseName\");\n    res->insert( FileIsDir, \"fileIsDir\");\n    res->insert( FileModifiedDate, \"fileModifiedDate\");\n    res->insert( FileCreatedDate, \"fileCreatedDate\");\n\n    return *res;\n}\n\n/*!\n    Returns count of items exists in the model.\n    \\returns count of items exists in the model.\n    \\sa indexOf\n */\nint AsemanFileSystemModel::count() const\n{\n    return p->list.count();\n}\n\n\n/*!\n    Clean and reload all data of the model\n    \\sa count\n    \\sa setFolder\n */\nvoid AsemanFileSystemModel::refresh()\n{\n    p->refresh_timer->stop();\n    p->refresh_timer->start();\n}\n\nvoid AsemanFileSystemModel::reinit_buffer()\n{\n    p->refresh_timer->stop();\n\n    int filter = 0;\n    if(p->showDirs)\n        filter = filter | QDir::Dirs;\n    if(!p->showDotAndDotDot)\n        filter = filter | QDir::NoDotAndDotDot;\n    if(p->showFiles)\n        filter = filter | QDir::Files;\n    if(p->showHidden)\n        filter = filter | QDir::Hidden;\n\n    qint32 limit = p->limit? p->limit : INT_MAX;\n    QList<QFileInfo> res = ls(p->folder, filter, p->recursive, limit);\n\n    if(!p->nameFilters.isEmpty())\n        for(int i=0; i<res.count(); i++)\n        {\n            const QFileInfo &inf = res.at(i);\n\n            QStringList suffixes;\n            if(!inf.suffix().isEmpty())\n                suffixes << inf.suffix();\n            else\n                suffixes = p->mdb.mimeTypeForFile(inf.filePath()).suffixes();\n\n            bool founded = inf.isDir();\n            for(const QString &sfx: suffixes)\n                if(p->nameFilters.contains(QStringLiteral(\"*.\")+sfx, Qt::CaseInsensitive))\n                {\n                    founded = true;\n                    break;\n                }\n\n            if(!founded)\n            {\n                res.removeAt(i);\n                i--;\n            }\n        }\n\n    fileListSort_private_data = p;\n    std::stable_sort(res.begin(), res.end(), aseman_fileListSort);\n\n    changed(res);\n}\n\nQList<QFileInfo> AsemanFileSystemModel::ls(const QString &path, qint32 filter, bool recursive, qint32 &limit)\n{\n    QList<QFileInfo> res;\n\n    QDir::SortFlags sort = QDir::Name;\n    switch(p->sortField)\n    {\n    case Size:\n        sort = QDir::Size;\n        break;\n    case Date:\n        sort = (QDir::Time | QDir::Reversed);\n        break;\n    }\n\n    QStringList list;\n    if(filter && !path.isEmpty())\n        list = QDir(path).entryList(static_cast<QDir::Filter>(filter) | QDir::Dirs, sort);\n\n    for(const QString &fileName: list)\n    {\n        QFileInfo info(path + \"/\" + fileName);\n        if(!info.isDir() || (static_cast<QDir::Filter>(filter) & QDir::Dirs))\n        {\n            res << info;\n            limit--;\n        }\n        if(limit < 0)\n            return res;\n\n        if(info.isDir() && recursive)\n            res << ls(path + \"/\" + fileName, filter, recursive, limit);\n    }\n\n    return res;\n}\n\nvoid AsemanFileSystemModel::changed(const QList<QFileInfo> &list)\n{\n    bool count_changed = (list.count()==p->list.count());\n\n    for( int i=0 ; i<p->list.count() ; i++ )\n    {\n        const QFileInfo &file = p->list.at(i);\n        if( list.contains(file) )\n            continue;\n\n        beginRemoveRows(QModelIndex(), i, i);\n        p->list.removeAt(i);\n        i--;\n        endRemoveRows();\n    }\n\n    QList<QFileInfo> temp_list = list;\n    for( int i=0 ; i<temp_list.count() ; i++ )\n    {\n        const QFileInfo &file = temp_list.at(i);\n        if( p->list.contains(file) )\n            continue;\n\n        temp_list.removeAt(i);\n        i--;\n    }\n    while( p->list != temp_list )\n        for( int i=0 ; i<p->list.count() ; i++ )\n        {\n            const QFileInfo &file = p->list.at(i);\n            int nw = temp_list.indexOf(file);\n            if( i == nw )\n                continue;\n\n            beginMoveRows( QModelIndex(), i, i, QModelIndex(), nw>i?nw+1:nw );\n            p->list.move( i, nw );\n            endMoveRows();\n        }\n\n    for( int i=0 ; i<list.count() ; i++ )\n    {\n        const QFileInfo &file = list.at(i);\n        if( p->list.contains(file) )\n            continue;\n\n        beginInsertRows(QModelIndex(), i, i );\n        p->list.insert( i, file );\n        endInsertRows();\n    }\n\n    if(count_changed)\n        Q_EMIT countChanged();\n\n    Q_EMIT listChanged();\n}\n\nAsemanFileSystemModel::~AsemanFileSystemModel()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/core/asemanfilesystemmodel.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANFILESYSTEMMODEL_H\n#define ASEMANFILESYSTEMMODEL_H\n\n#include \"asemanabstractlistmodel.h\"\n#include <QStringList>\n#include <QFileInfo>\n\n#include \"asemancore_global.h\"\n\nclass AsemanFileSystemModelPrivate;\nclass LIBQTASEMAN_CORE_EXPORT AsemanFileSystemModel : public AsemanAbstractListModel\n{\n    Q_OBJECT\n    Q_ENUMS(SortFlag)\n    Q_ENUMS(DataRole)\n\n    Q_PROPERTY(bool showDirs READ showDirs WRITE setShowDirs NOTIFY showDirsChanged)\n    Q_PROPERTY(bool showDotAndDotDot READ showDotAndDotDot WRITE setShowDotAndDotDot NOTIFY showDotAndDotDotChanged)\n    Q_PROPERTY(bool showDirsFirst READ showDirsFirst WRITE setShowDirsFirst NOTIFY showDirsFirstChanged)\n    Q_PROPERTY(bool showFiles READ showFiles WRITE setShowFiles NOTIFY showFilesChanged)\n    Q_PROPERTY(bool showHidden READ showHidden WRITE setShowHidden NOTIFY showHiddenChanged)\n    Q_PROPERTY(bool recursive READ recursive WRITE setRecursive NOTIFY recursiveChanged)\n    Q_PROPERTY(QStringList nameFilters READ nameFilters WRITE setNameFilters NOTIFY nameFiltersChanged)\n    Q_PROPERTY(QString folder READ folder WRITE setFolder NOTIFY folderChanged)\n    Q_PROPERTY(qint32 limit READ limit WRITE setLimit NOTIFY limitChanged)\n    Q_PROPERTY(QString parentFolder READ parentFolder NOTIFY parentFolderChanged)\n    Q_PROPERTY(int sortField READ sortField WRITE setSortField NOTIFY sortFieldChanged)\n    Q_PROPERTY(int count READ count NOTIFY countChanged)\n\npublic:\n    enum SortFlag {\n        Name,\n        Size,\n        Date\n    };\n\n    enum DataRole {\n        FilePath = Qt::UserRole,\n        FileUrl,\n        FileName,\n        FileMime,\n        FileSize,\n        FileSuffix,\n        FileBaseName,\n        FileIsDir,\n        FileModifiedDate,\n        FileCreatedDate\n    };\n\n    AsemanFileSystemModel(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanFileSystemModel();\n\n    void setShowDirs(bool stt);\n    bool showDirs() const;\n\n    void setShowDotAndDotDot(bool stt);\n    bool showDotAndDotDot() const;\n\n    void setShowDirsFirst(bool stt);\n    bool showDirsFirst() const;\n\n    void setShowFiles(bool stt);\n    bool showFiles() const;\n\n    void setShowHidden(bool stt);\n    bool showHidden() const;\n\n    void setNameFilters(const QStringList &list);\n    QStringList nameFilters() const;\n\n    void setFolder(const QString &url);\n    QString folder() const;\n\n    void setSortField(int field);\n    int sortField() const;\n\n    void setRecursive(bool recursive);\n    bool recursive() const;\n\n    void setLimit(qint32 limit);\n    qint32 limit() const;\n\n    QString parentFolder() const;\n\n#ifndef ASEMAN_OXYGEN_SKIP\n    const QFileInfo &id( const QModelIndex &index ) const;\n\n    int rowCount(const QModelIndex & parent = QModelIndex()) const Q_DECL_OVERRIDE;\n    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;\n\n    QHash<qint32,QByteArray> roleNames() const Q_DECL_OVERRIDE;\n#endif\n    int count() const;\n\npublic Q_SLOTS:\n    void refresh();\n\nQ_SIGNALS:\n    void countChanged();\n    void showDirsChanged();\n    void showDotAndDotDotChanged();\n    void showDirsFirstChanged();\n    void showFilesChanged();\n    void showHiddenChanged();\n    void nameFiltersChanged();\n    void folderChanged();\n    void parentFolderChanged();\n    void sortFieldChanged();\n    void recursiveChanged();\n    void limitChanged();\n    void listChanged();\n\nprivate Q_SLOTS:\n    void reinit_buffer();\n\nprivate:\n    QList<QFileInfo> ls(const QString &path, qint32 filter, bool recursive, qint32 &limit);\n    void changed(const QList<QFileInfo> &list);\n\nprivate:\n    AsemanFileSystemModelPrivate *p;\n};\n\ntypedef AsemanFileSystemModel QAsemanFileSystemModel;\n\n#endif // ASEMANFILESYSTEMMODEL_H\n"
  },
  {
    "path": "src/core/asemanglobals.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANGLOBALS_H\n#define ASEMANGLOBALS_H\n\n/*!\n    \\defgroup AsemanCore\n    Provides core classes, methods and tools of the QAseman modules.\n    It only needs QtCore module and has no GUI.\n\n    You can add it to your project using below command:\n    \\code{.pro}\n    QT += asemancore\n    \\endcode\n */\n\n#include <QtGlobal>\n\n#define SET_PROPERTY(PROPERTY_NAME) \\\n    if(_##PROPERTY_NAME == PROPERTY_NAME) return; \\\n    _##PROPERTY_NAME = PROPERTY_NAME; \\\n    Q_EMIT PROPERTY_NAME##Changed();\n\n#define SET_PROPERTY_P(PROPERTY_NAME) \\\n    if(p->PROPERTY_NAME == PROPERTY_NAME) return; \\\n    p->PROPERTY_NAME = PROPERTY_NAME; \\\n    Q_EMIT PROPERTY_NAME##Changed();\n\n#endif // ASEMANGLOBALS_H\n"
  },
  {
    "path": "src/core/asemanhashobject.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n/*!\n    \\class AsemanHashObject\n    \\brief In fact it acts like a QHash<QString, QVariant> class, But\n    in the QML.\n\n    \\reentrant\n    \\ingroup AsemanCore\n */\n\n/*!\n    \\fn AsemanHashObject::countChanged\n    This signal emits when count of the hash object changed.\n    \\sa insert\n */\n\n#include \"asemanhashobject.h\"\n\n#include <QList>\n#include <QPair>\n#include <QDebug>\n#include <QDebug>\n\nclass AsemanHashObjectPrivate\n{\npublic:\n    QMultiHash<QString,QVariant> hash;\n};\n\nAsemanHashObject::AsemanHashObject(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanHashObjectPrivate;\n}\n\n\n/*!\n    \\brief Inserts a new item with the \\a key and \\a value of value.\n\n    If there is already an item with the key,\n    that item's value is replaced with value.\n    If there are multiple items with the key,\n    the most recently inserted item's value is replaced with value.\n\n    \\sa insertMulti\n */\nvoid AsemanHashObject::insert(const QString &key, const QVariant &value)\n{\n    p->hash.replace(key,value);\n    Q_EMIT countChanged();\n    Q_EMIT valuesChanged();\n    Q_EMIT keysChanged();\n}\n\n\n/*!\n    \\brief Inserts a new item with the \\a key and \\a value of value.\n\n    If there is already an item with the same key in the hash,\n    this function will simply create a new one.\n\n    \\sa insert\n */\nvoid AsemanHashObject::insertMulti(const QString &key, const QVariant &value)\n{\n    p->hash.insert(key,value);\n    Q_EMIT countChanged();\n    Q_EMIT valuesChanged();\n    Q_EMIT keysChanged();\n}\n\n\n/*!\n    \\brief Removes all the items that have the \\a key from the hash.\n    Returns the number of items removed which is usually 1 but will\n    be 0 if the key isn't in the hash, or greater than 1 if insertMulti()\n    has been used with the key.\n\n    \\sa insertMulti\n */\nvoid AsemanHashObject::remove(const QString &key)\n{\n    p->hash.remove(key);\n    Q_EMIT countChanged();\n    Q_EMIT valuesChanged();\n    Q_EMIT keysChanged();\n}\n\n\n/*!\n    \\brief Removes all the items that have both the \\a key and the \\a value\n    from the hash.\n    Returns the number of items removed which is usually 1 but will\n    be 0 if the key isn't in the hash, or greater than 1 if insertMulti()\n    has been used with the key.\n\n    \\sa insertMulti\n */\nvoid AsemanHashObject::remove(const QString &key, const QVariant &value)\n{\n    p->hash.remove(key,value);\n    Q_EMIT countChanged();\n    Q_EMIT valuesChanged();\n    Q_EMIT keysChanged();\n}\n\n\n/*!\n    \\brief Returns the first key mapped to value.\n    If the hash contains no item with the value,\n    the function returns a default-constructed key.\n\n    \\sa value\n    \\sa key\n */\nQVariant AsemanHashObject::key(const QVariant &value)\n{\n    return p->hash.key(value);\n}\n\n\n/*!\n    \\brief Returns a list containing all the keys in the hash, in an\n    arbitrary order. Keys that occur multiple times in the hash\n    (because items were inserted with insertMulti(), or unite() was\n    used) also occur multiple times in the list.\n\n    To obtain a list of unique keys, where each key from the map\n    only occurs once, use uniqueKeys().\n\n    The order is guaranteed to be the same as that used by values().\n\n    \\sa uniqueKeys\n    \\sa key\n    \\sa values\n */\nQStringList AsemanHashObject::keys(const QVariant &value)\n{\n    return p->hash.keys(value);\n}\n\n\n/*!\n    \\brief Returns a list containing all the keys in the map.\n    Keys that occur multiple times in the map (because items\n    were inserted with insertMulti(), or unite() was used) occur\n    only once in the returned list.\n\n    \\sa key\n    \\sa values\n */\nQStringList AsemanHashObject::uniqueKeys()\n{\n    return p->hash.uniqueKeys();\n}\n\n\n/*!\n    \\brief Returns a list containing all the keys in the hash,\n    in an arbitrary order. Keys that occur multiple times in\n    the hash (because items were inserted with insertMulti(),\n    or unite() was used) also occur multiple times in the list.\n\n    To obtain a list of unique keys, where each key from the\n    map only occurs once, use uniqueKeys().\n\n    The order is guaranteed to be the same as that used by values().\n\n    \\sa key\n    \\sa values\n    \\sa uniqueKeys\n */\nQStringList AsemanHashObject::keys()\n{\n    return p->hash.keys();\n}\n\n\n/*!\n    \\brief Returns the value associated with the \\a key.\n\n    If the hash contains no item with the \\a key, the function\n    returns a default-constructed value. If there are multiple\n    items for the key in the hash, the value of the most\n    recently inserted one is returned.\n\n    \\sa key\n    \\sa values\n    \\sa contains\n */\nQVariant AsemanHashObject::value(const QString &key)\n{\n    return p->hash.value(key);\n}\n\n\n/*!\n    \\brief Returns a list containing all the values in the hash,\n    in an arbitrary order. If a \\a key is associated with multiple\n    values, all of its values will be in the list, and not just\n    the most recently inserted one.\n\n    The order is guaranteed to be the same as that used by keys().\n\n    \\sa keys\n    \\sa value\n */\nQVariantList AsemanHashObject::values(const QString &key)\n{\n    return p->hash.values(key);\n}\n\nQVariantList AsemanHashObject::values() const\n{\n    return p->hash.values();\n}\n\n\n/*!\n    \\brief Returns true if the hash contains an item with the \\a key;\n    otherwise returns false.\n\n    \\sa count\n */\nQVariant AsemanHashObject::contains(const QString &key)\n{\n    return p->hash.contains(key);\n}\n\n\n/*!\n    \\brief Returns true if the hash contains an item with the \\a key and \\a value;\n    otherwise returns false.\n\n    \\sa count\n */\nQVariant AsemanHashObject::contains(const QString &key, const QVariant &value)\n{\n    return p->hash.contains(key,value);\n}\n\n\n/*!\n    \\brief Removes all items from the hash.\n\n    \\sa remove\n */\nvoid AsemanHashObject::clear()\n{\n    if(p->hash.isEmpty())\n        return;\n    p->hash.clear();\n    Q_EMIT countChanged();\n    Q_EMIT valuesChanged();\n    Q_EMIT keysChanged();\n}\n\n\n/*!\n    \\brief Returns the number of items associated with the key.\n\n    \\sa contains\n    \\sa insertMulti\n */\nint AsemanHashObject::count()\n{\n    return p->hash.count();\n}\n\n\n/*!\n    \\brief Converts and Return hash to the QVariantMap object.\n\n    \\sa keys\n    \\sa values\n */\nQVariantMap AsemanHashObject::toMap() const\n{\n    QVariantMap map;\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n    QHashIterator<QString, QVariant> i(p->hash);\n#else\n    QMultiHashIterator<QString, QVariant> i(p->hash);\n#endif\n    while(i.hasNext())\n    {\n        i.next();\n        map.insert(i.key(), i.value());\n    }\n    return map;\n}\n\nAsemanHashObject::~AsemanHashObject()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/core/asemanhashobject.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANHASHOBJECT_H\n#define ASEMANHASHOBJECT_H\n\n#include <QObject>\n#include <QVariant>\n\n#include \"asemancore_global.h\"\n\nclass AsemanHashObjectPrivate;\nclass LIBQTASEMAN_CORE_EXPORT AsemanHashObject : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(int count READ count NOTIFY countChanged)\n    Q_PROPERTY(QVariantList values READ values NOTIFY valuesChanged)\n    Q_PROPERTY(QStringList keys READ keys NOTIFY keysChanged)\n\npublic:\n    AsemanHashObject(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanHashObject();\n\n    QVariantList values() const;\n\npublic Q_SLOTS:\n    void insert(const QString & key, const QVariant & value );\n    void insertMulti(const QString & key, const QVariant & value );\n    void remove( const QString & key );\n    void remove( const QString & key, const QVariant & value );\n\n    QVariant key( const QVariant & value );\n    QStringList keys( const QVariant & value );\n    QStringList uniqueKeys();\n    QStringList keys();\n    QVariant value( const QString & key );\n    QVariantList values( const QString & key );\n\n    QVariant contains( const QString & key );\n    QVariant contains( const QString & key, const QVariant & value );\n\n    void clear();\n    int count();\n\n    QVariantMap toMap() const;\n\nQ_SIGNALS:\n    void countChanged();\n    void valuesChanged();\n    void keysChanged();\n\nprivate:\n    AsemanHashObjectPrivate *p;\n};\n\ntypedef AsemanHashObject QAsemanHashObject;\n\n#endif // ASEMANHASHOBJECT_H\n"
  },
  {
    "path": "src/core/asemanlistmodel.cpp",
    "content": "#include \"asemanlistmodel.h\"\n\n#include <QDataStream>\n#include <QFile>\n#include <QSet>\n#include <QDebug>\n\nclass AsemanListModel::Private\n{\npublic:\n    QList< QVariantMap > list;\n    QHash<qint32, QByteArray> roleNames;\n    QString cachePath;\n};\n\nAsemanListModel::AsemanListModel(QObject *parent) :\n    AsemanAbstractListModel(parent)\n{\n    p = new Private;\n}\n\nint AsemanListModel::rowCount(const QModelIndex &parent) const\n{\n    Q_UNUSED(parent)\n    return count();\n}\n\nQVariant AsemanListModel::data(const QModelIndex &index, int role) const\n{\n    if(index.row() >= count())\n        return QVariant();\n\n    QString keyName = p->roleNames.value(role);\n    QVariantMap map = p->list.value(index.row());\n    return map.value(keyName);\n}\n\nbool AsemanListModel::setData(const QModelIndex &index, const QVariant &value, int role)\n{\n    if(index.row() >= count())\n        return false;\n\n    QString keyName = p->roleNames.value(role);\n    QVariantMap &map = p->list[index.row()];\n    if(keyName.isEmpty())\n        return false;\n\n    map[keyName] = value;\n    saveCache();\n    return true;\n}\n\nQHash<qint32, QByteArray> AsemanListModel::roleNames() const\n{\n    QSet<QByteArray> inserteds;\n    for (const auto &v: p->roleNames.values())\n        inserteds.insert(v);\n\n    for(const QVariantMap &map: p->list)\n    {\n        QStringList keys = map.keys();\n        for(const QString &k: keys)\n            if(!inserteds.contains(k.toUtf8()))\n            {\n                p->roleNames[ Qt::UserRole + p->roleNames.count() ] = k.toUtf8();\n                inserteds.insert(k.toUtf8());\n            }\n    }\n\n    return p->roleNames;\n}\n\nint AsemanListModel::count() const\n{\n    return p->list.count();\n}\n\nvoid AsemanListModel::setCachePath(const QString &path)\n{\n    if(p->cachePath == path)\n        return;\n\n    p->cachePath = path;\n    loadCache();\n    Q_EMIT cachePathChanged();\n}\n\nQString AsemanListModel::cachePath() const\n{\n    return p->cachePath;\n}\n\nQVariantList AsemanListModel::data() const\n{\n    QVariantList res;\n    for (const QVariantMap &m: p->list)\n        res << m;\n    return res;\n}\n\nvoid AsemanListModel::setData(const QVariantList &data)\n{\n    if (data == AsemanListModel::data())\n        return;\n\n    QList<QVariantMap> list;\n    for (const QVariant &d: data)\n    {\n        auto m = d.toMap();\n        m[QStringLiteral(\"94d4191b6b08\")] = list.count();\n\n        list << m;\n    }\n\n    changed(list);\n    Q_EMIT dataListChanged();\n}\n\nvoid AsemanListModel::insert(int row, const QVariantMap &map)\n{\n    if(p->list.count() < row || row < 0)\n        return;\n\n    beginInsertRows(QModelIndex(), row, row);\n    p->list.insert(row, map);\n    saveCache();\n    endInsertRows();\n    Q_EMIT countChanged();\n    Q_EMIT listChanged();\n}\n\nvoid AsemanListModel::append(const QVariantMap &map)\n{\n    insert(count(), map);\n}\n\nvoid AsemanListModel::remove(int row)\n{\n    if(p->list.count() <= row || row < 0)\n        return;\n\n    beginRemoveRows(QModelIndex(), row, row);\n    p->list.removeAt(row);\n    saveCache();\n    endRemoveRows();\n    Q_EMIT countChanged();\n    Q_EMIT listChanged();\n}\n\nvoid AsemanListModel::move(int from, int to)\n{\n    if(p->list.count() <= from || from < 0)\n        return;\n    if(p->list.count() < to || to < 0)\n        return;\n\n    QList<QVariantMap> newMap = p->list;\n    newMap.move(from, to);\n\n    changed(newMap);\n    saveCache();\n}\n\nvoid AsemanListModel::clear()\n{\n    beginResetModel();\n    p->list.clear();\n    saveCache();\n    endResetModel();\n    Q_EMIT countChanged();\n    Q_EMIT listChanged();\n}\n\nvoid AsemanListModel::change(const QVariantList &list)\n{\n    QList<QVariantMap> lst;\n    for (const QVariant &v: list)\n        lst << v.toMap();\n\n    changed(lst);\n    saveCache();\n}\n\nvoid AsemanListModel::changed(const QList<QVariantMap> &list)\n{\n    bool count_changed = (list.count()!=p->list.count());\n\n    for( int i=0 ; i<p->list.count() ; i++ )\n    {\n        const QVariantMap &file = p->list.at(i);\n        if( list.contains(file) )\n            continue;\n\n        beginRemoveRows(QModelIndex(), i, i);\n        p->list.removeAt(i);\n        i--;\n        endRemoveRows();\n    }\n\n    QList<QVariantMap> temp_list = list;\n    for( int i=0 ; i<temp_list.count() ; i++ )\n    {\n        const QVariantMap &file = temp_list.at(i);\n        if( p->list.contains(file) )\n            continue;\n\n        temp_list.removeAt(i);\n        i--;\n    }\n    while( p->list != temp_list )\n        for( int i=0 ; i<p->list.count() ; i++ )\n        {\n            const QVariantMap &file = p->list.at(i);\n            int nw = temp_list.indexOf(file);\n            if( i == nw )\n                continue;\n\n            beginMoveRows( QModelIndex(), i, i, QModelIndex(), nw>i?nw+1:nw );\n            p->list.move( i, nw );\n            endMoveRows();\n        }\n\n    for( int i=0 ; i<list.count() ; i++ )\n    {\n        const QVariantMap &file = list.at(i);\n        if( p->list.contains(file) )\n            continue;\n\n        beginInsertRows(QModelIndex(), i, i );\n        p->list.insert( i, file );\n        endInsertRows();\n    }\n\n    if(count_changed)\n        Q_EMIT countChanged();\n\n    Q_EMIT listChanged();\n}\n\nvoid AsemanListModel::loadCache()\n{\n    if(p->cachePath.isEmpty())\n        return;\n\n    QFile file(p->cachePath);\n    if(!file.open(QFile::ReadOnly))\n        return;\n\n    QVariantList list;\n\n    QDataStream stream(&file);\n    stream >> list;\n\n    file.close();\n\n    QList<QVariantMap> newList;\n    for(const QVariant &v: list)\n        newList << v.toMap();\n\n    changed(newList);\n}\n\nvoid AsemanListModel::saveCache()\n{\n    if(p->cachePath.isEmpty())\n        return;\n\n    QFile file(p->cachePath);\n    if(!file.open(QFile::WriteOnly))\n        return;\n\n    QVariantList list;\n    for(const QVariantMap &m: p->list)\n        list << QVariant::fromValue<QVariantMap>(m);\n\n    QDataStream stream(&file);\n    stream << list;\n\n    file.flush();\n    file.close();\n}\n\nAsemanListModel::~AsemanListModel()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/core/asemanlistmodel.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANLISTMODEL_H\n#define ASEMANLISTMODEL_H\n\n#include <QObject>\n#include \"asemanabstractlistmodel.h\"\n\n#include \"asemancore_global.h\"\n\nclass LIBQTASEMAN_CORE_EXPORT AsemanListModel : public AsemanAbstractListModel\n{\n    Q_OBJECT\n    class Private;\n    Q_PROPERTY(int count READ count NOTIFY countChanged)\n    Q_PROPERTY(QString cachePath READ cachePath WRITE setCachePath NOTIFY cachePathChanged)\n    Q_PROPERTY(QVariantList data READ data WRITE setData NOTIFY dataListChanged)\n\npublic:\n    AsemanListModel(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanListModel();\n\n    int rowCount(const QModelIndex & parent = QModelIndex()) const Q_DECL_OVERRIDE;\n    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;\n    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) Q_DECL_OVERRIDE;\n\n    QHash<qint32,QByteArray> roleNames() const Q_DECL_OVERRIDE;\n    int count() const;\n\n    void setCachePath(const QString &path);\n    QString cachePath() const;\n\n    QVariantList data() const;\n    void setData(const QVariantList &data);\n\nQ_SIGNALS:\n    void countChanged();\n    void cachePathChanged();\n    void listChanged();\n    void dataListChanged();\n\npublic Q_SLOTS:\n    void insert(int row, const QVariantMap &map);\n    void append(const QVariantMap &map);\n    void remove(int row);\n    void move(int from, int to);\n    void clear();\n    void change(const QVariantList &list);\n\nprotected:\n    virtual void changed(const QList<QVariantMap> &list);\n\nprivate:\n    void loadCache();\n    void saveCache();\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanListModel QAsemanListModel;\n\n#endif // ASEMANLISTMODEL_H\n"
  },
  {
    "path": "src/core/asemanlistobject.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanlistobject.h\"\n\n#include <QVariantList>\n#include <QDebug>\n#include <QDateTime>\n\nclass AsemanListObjectPrivate\n{\npublic:\n    QVariantList list;\n};\n\nAsemanListObject::AsemanListObject(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanListObjectPrivate;\n}\n\nvoid AsemanListObject::removeAll(const QVariant &v)\n{\n    p->list.removeAll( v );\n    Q_EMIT countChanged();\n}\n\nvoid AsemanListObject::removeOne(const QVariant &v)\n{\n    p->list.removeOne( v );\n    Q_EMIT countChanged();\n}\n\nvoid AsemanListObject::removeAt(int index)\n{\n    p->list.removeAt( index );\n    Q_EMIT countChanged();\n}\n\nQVariant AsemanListObject::takeLast()\n{\n    if( p->list.isEmpty() )\n        return QVariant();\n\n    const QVariant & res = p->list.takeLast();\n    Q_EMIT countChanged();\n\n    return res;\n}\n\nQVariant AsemanListObject::takeFirst()\n{\n    if( p->list.isEmpty() )\n        return QVariant();\n\n    const QVariant & res = p->list.takeFirst();\n    Q_EMIT countChanged();\n\n    return res;\n}\n\nQVariant AsemanListObject::takeAt(int index)\n{\n    const QVariant & res = p->list.takeAt( index );\n    Q_EMIT countChanged();\n\n    return res;\n}\n\nvoid AsemanListObject::clear()\n{\n    p->list.clear();\n    Q_EMIT countChanged();\n}\n\nQVariant AsemanListObject::last() const\n{\n    if( p->list.isEmpty() )\n        return QVariant();\n\n    return p->list.last();\n}\n\nQVariant AsemanListObject::first() const\n{\n    if( p->list.isEmpty() )\n        return QVariant();\n\n    return p->list.first();\n}\n\nvoid AsemanListObject::insert(int index, const QVariant &v)\n{\n    p->list.insert( index, v );\n    Q_EMIT countChanged();\n}\n\nvoid AsemanListObject::append(const QVariant &v)\n{\n    p->list.append( v );\n    Q_EMIT countChanged();\n}\n\nvoid AsemanListObject::prepend(const QVariant &v)\n{\n    p->list.prepend( v );\n    Q_EMIT countChanged();\n}\n\nvoid AsemanListObject::replace(int index, const QVariant &v)\n{\n    p->list.replace(index, v);\n}\n\nvoid AsemanListObject::swap(int idx0, int idx1)\n{\n    const auto val_0 = p->list.value(idx0);\n    const auto val_1 = p->list.value(idx1);\n\n    p->list[idx0] = val_1;\n    p->list[idx1] = val_0;\n}\n\nint AsemanListObject::count() const\n{\n    return p->list.count();\n}\n\nbool AsemanListObject::isEmpty() const\n{\n    return p->list.isEmpty();\n}\n\nQVariant AsemanListObject::at(int index) const\n{\n    if(index == -1)\n        return QVariant();\n\n    return p->list.at(index);\n}\n\nint AsemanListObject::indexOf(const QVariant &v) const\n{\n    return p->list.indexOf(v);\n}\n\nvoid AsemanListObject::fromList(const QVariantList &list)\n{\n    if( p->list == list )\n        return;\n\n    p->list = list;\n    Q_EMIT countChanged();\n}\n\nQVariantList AsemanListObject::toList() const\n{\n    return p->list;\n}\n\nbool AsemanListObject::contains(const QVariant &v) const\n{\n    return p->list.contains(v);\n}\n\nAsemanListObject::~AsemanListObject()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/core/asemanlistobject.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANLISTOBJECT_H\n#define ASEMANLISTOBJECT_H\n\n#include <QObject>\n#include <QVariant>\n\n#include \"asemancore_global.h\"\n\nclass AsemanListObjectPrivate;\nclass LIBQTASEMAN_CORE_EXPORT AsemanListObject : public QObject\n{\n    Q_PROPERTY(int count READ count NOTIFY countChanged)\n    Q_PROPERTY(QVariantList list READ toList WRITE fromList NOTIFY countChanged)\n\n    Q_OBJECT\npublic:\n    AsemanListObject(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanListObject();\n\npublic Q_SLOTS:\n    void removeAll( const QVariant & v );\n    void removeOne( const QVariant & v );\n    void removeAt( int index );\n    QVariant takeLast();\n    QVariant takeFirst();\n    QVariant takeAt( int index );\n\n    void clear();\n\n    QVariant last() const;\n    QVariant first() const;\n\n    void insert( int index, const QVariant & v );\n    void append( const QVariant & v );\n    void prepend( const QVariant & v );\n\n    void replace(int index, const QVariant &v);\n    void swap(int idx0, int idx1);\n\n    int count() const;\n    bool isEmpty() const;\n\n    QVariant at( int index ) const;\n    int indexOf( const QVariant & v ) const;\n\n    void fromList( const QVariantList & list );\n    QVariantList toList() const;\n\n    bool contains( const QVariant & v ) const;\n\nQ_SIGNALS:\n    void countChanged();\n\nprivate:\n    AsemanListObjectPrivate *p;\n};\n\ntypedef AsemanListObject QAsemanListObject;\n\n#endif // ASEMANLISTOBJECT_H\n"
  },
  {
    "path": "src/core/asemanlistrecord.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanlistrecord.h\"\n#include <iostream>\n\n#include <QChar>\n\nAsemanListRecord::AsemanListRecord()\n{\n    offsets.clear();\n    offsets << 0;\n}\n\nAsemanListRecord::AsemanListRecord( const QByteArray & record )\n{\n    offsets.clear();\n    offsets << 0;\n    FromQByteArray( record );\n}\n\nvoid AsemanListRecord::operator<<( AsemanListRecord record )\n{\n    for( int i=0 ; record.count(); i++ )\n        operator <<( record[i] );\n}\n\nvoid AsemanListRecord::operator<<( const QByteArray & str )\n{\n    list << strToRecord( str );\n    offsets << offsets.last() + list.last().size();\n}\n\nvoid AsemanListRecord::operator<<( const QList<QByteArray> & list )\n{\n    for( int i=0 ; i<list.count() ; i++ )\n        operator <<( list[i] );\n}\n\nQByteArray AsemanListRecord::operator[]( int index )\n{\n    QByteArray result = list.at(index);\n\n    int cnt = result.size();\n    for( int i=0 ; i<cnt ; i++ )\n    {\n        if( result.at(0)==',' )\n        {\n            result.remove(0,1);\n            break;\n        }\n        if( !QString::fromUtf8(result).at(0).isNumber() )\n        {\n            break;\n        }\n        result.remove(0,1);\n    }\n    return result;\n}\n\nQByteArray AsemanListRecord::at( int i )\n{\n    return operator [](i);\n}\n\nQByteArray AsemanListRecord::last()\n{\n    return at( count()-1 );\n}\n\nQByteArray AsemanListRecord::first()\n{\n    return at(0);\n}\n\nQByteArray AsemanListRecord::takeLast()\n{\n    return takeAt( count()-1 );\n}\n\nQByteArray AsemanListRecord::takeFirst()\n{\n    return takeAt(0);\n}\n\nQList<QByteArray> AsemanListRecord::mid( int index , int len )\n{\n    QList<QByteArray> res;\n    for( int i=index ; i<index+len ; i++ )\n        res << operator [](i);\n\n    return res;\n}\n\nQList<QByteArray> AsemanListRecord::toQByteArrayList()\n{\n    return mid( 0 , count() );\n}\n\nvoid AsemanListRecord::removeAt( int index )\n{\n    int shift_size = list.at(index).size();\n    list.removeAt( index );\n\n    for( int i=index+1 ; i<offsets.count() ; i++ )\n        offsets[i] -= shift_size;\n}\n\nQByteArray AsemanListRecord::takeAt( int index )\n{\n    QByteArray tmp( at(index) );\n    removeAt( index );\n    return tmp;\n}\n\nvoid AsemanListRecord::FromQByteArray( const QByteArray & str )\n{\n    int data_size = str.size();\n    bool ok;\n\n    int ext = offsets.last();\n    for( int i=0,j=0 ; i<data_size ; i++ )\n    {\n        if( str[i] == ',' )\n        {\n            QByteArray tmp = str.mid( j , i-j );\n            j += tmp.toInt( &ok );\n            offsets << j+ext;\n\n            if( j > i )\n                i=j;\n        }\n    }\n\n    for( int i=0 ; i<offsets.count()-1 ; i++ )\n        list << str.mid( offsets[i] , offsets[i+1]-offsets[i] );\n}\n\nQByteArray AsemanListRecord::toQByteArray()\n{\n    QByteArray result;\n    for(const QByteArray &ba: list)\n        result += ba;\n\n    return result;\n}\n\nint AsemanListRecord::count()\n{\n    return list.count();\n}\n\nint AsemanListRecord::size()\n{\n    return count();\n}\n\nint AsemanListRecord::lenght()\n{\n    return count();\n}\n\nvoid AsemanListRecord::clear()\n{\n    list.clear();\n    offsets.clear();\n    offsets << 0;\n}\n\nQByteArray AsemanListRecord::strToRecord(const QByteArray &str )\n{\n    char str_size[13];\n    QByteArray record(\"0,\" + str);\n    int size;\n\n    do\n    {\n        size = record.count();\n        sprintf( str_size , \"%d\" , size  );\n        record = \",\" + str;\n        record.prepend( str_size );\n    }while( size != record.count() );\n\n    return record;\n}\n"
  },
  {
    "path": "src/core/asemanlistrecord.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANLISTRECORD_H\n#define ASEMANLISTRECORD_H\n\n#include <QByteArray>\n#include <QList>\n#include <cstdio>\n\n#include \"asemancore_global.h\"\n\nclass LIBQTASEMAN_CORE_EXPORT AsemanListRecord\n{\npublic:\n    AsemanListRecord();\n    AsemanListRecord( const QByteArray & record );\n\n    void operator<<( AsemanListRecord record );\n    void operator<<( const QByteArray & str );\n    void operator<<( const QList<QByteArray> & list );\n\n    QByteArray operator[]( int index );\n    QByteArray at( int index );\n    QByteArray last();\n    QByteArray first();\n    QByteArray takeLast();\n    QByteArray takeFirst();\n    QList<QByteArray> mid( int i , int len );\n    QList<QByteArray> toQByteArrayList();\n\n    void removeAt( int index );\n    QByteArray takeAt( int index );\n\n    void FromQByteArray( const QByteArray & str );\n    QByteArray toQByteArray();\n\n    int count();\n    int size();\n    int lenght();\n\n    void clear();\n\nprivate:\n    QList<QByteArray> list;\n    QList<int> offsets;\n\n    QByteArray strToRecord( const QByteArray & str );\n};\n\ntypedef AsemanListRecord QAsemanListRecord;\n\n#endif // ASEMANLISTRECORD_H\n"
  },
  {
    "path": "src/core/asemanmapobject.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanmapobject.h\"\n\n#include <QList>\n#include <QPair>\n#include <QDebug>\n#include <QDebug>\n\nclass AsemanMapObjectPrivate\n{\npublic:\n    QMultiMap<QString,QVariant> map;\n};\n\nAsemanMapObject::AsemanMapObject(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanMapObjectPrivate;\n}\n\nvoid AsemanMapObject::insert(const QString &key, const QVariant &value)\n{\n    p->map.replace(key,value);\n    Q_EMIT countChanged();\n    Q_EMIT valuesChanged();\n    Q_EMIT keysChanged();\n}\n\nvoid AsemanMapObject::insertMulti(const QString &key, const QVariant &value)\n{\n    p->map.insert(key,value);\n    Q_EMIT countChanged();\n    Q_EMIT valuesChanged();\n    Q_EMIT keysChanged();\n}\n\nvoid AsemanMapObject::remove(const QString &key)\n{\n    p->map.remove(key);\n    Q_EMIT countChanged();\n    Q_EMIT valuesChanged();\n    Q_EMIT keysChanged();\n}\n\nvoid AsemanMapObject::remove(const QString &key, const QVariant &value)\n{\n    p->map.remove(key,value);\n    Q_EMIT countChanged();\n    Q_EMIT valuesChanged();\n    Q_EMIT keysChanged();\n}\n\nQVariant AsemanMapObject::key(const QVariant &value)\n{\n    return p->map.key(value);\n}\n\nQStringList AsemanMapObject::keys(const QVariant &value)\n{\n    return p->map.keys(value);\n}\n\nQStringList AsemanMapObject::uniqueKeys()\n{\n    return p->map.uniqueKeys();\n}\n\nQStringList AsemanMapObject::keys()\n{\n    return p->map.keys();\n}\n\nQVariant AsemanMapObject::value(const QString &key)\n{\n    return p->map.value(key);\n}\n\nQVariantList AsemanMapObject::values(const QString &key)\n{\n    return p->map.values(key);\n}\n\nQVariantList AsemanMapObject::values() const\n{\n    return p->map.values();\n}\n\nQVariant AsemanMapObject::containt(const QString &key)\n{\n    return contains(key);\n}\n\nQVariant AsemanMapObject::containt(const QString &key, const QVariant &value)\n{\n    return contains(key, value);\n}\n\nQVariant AsemanMapObject::contains(const QString &key)\n{\n    return p->map.contains(key);\n}\n\nQVariant AsemanMapObject::contains(const QString &key, const QVariant &value)\n{\n    return p->map.contains(key,value);\n}\n\nvoid AsemanMapObject::clear()\n{\n    if(p->map.isEmpty())\n        return;\n    p->map.clear();\n    Q_EMIT countChanged();\n    Q_EMIT valuesChanged();\n    Q_EMIT keysChanged();\n}\n\nint AsemanMapObject::count()\n{\n    return p->map.count();\n}\n\nQVariantMap AsemanMapObject::toMap() const\n{\n    QVariantMap map;\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n    QMapIterator<QString, QVariant> i(p->map);\n#else\n    QMultiMapIterator<QString, QVariant> i(p->map);\n#endif\n    while(i.hasNext())\n    {\n        i.next();\n        map.insert(i.key(), i.value());\n    }\n    return map;\n}\n\nAsemanMapObject::~AsemanMapObject()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/core/asemanmapobject.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANMAPOBJECT_H\n#define ASEMANMAPOBJECT_H\n\n#include <QObject>\n#include <QVariant>\n\n#include \"asemancore_global.h\"\n\nclass AsemanMapObjectPrivate;\nclass LIBQTASEMAN_CORE_EXPORT AsemanMapObject : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(int count READ count NOTIFY countChanged)\n    Q_PROPERTY(QVariantList values READ values NOTIFY valuesChanged)\n    Q_PROPERTY(QStringList keys READ keys NOTIFY keysChanged)\n\npublic:\n    AsemanMapObject(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanMapObject();\n\n    Q_INVOKABLE void insert(const QString & key, const QVariant & value );\n    Q_INVOKABLE void insertMulti(const QString & key, const QVariant & value );\n    Q_INVOKABLE void remove( const QString & key );\n    Q_INVOKABLE void remove( const QString & key, const QVariant & value );\n\n    Q_INVOKABLE QVariant key( const QVariant & value );\n    Q_INVOKABLE QStringList keys( const QVariant & value );\n    Q_INVOKABLE QStringList uniqueKeys();\n    Q_INVOKABLE QStringList keys();\n    Q_INVOKABLE QVariant value( const QString & key );\n    Q_INVOKABLE QVariantList values( const QString & key );\n    QVariantList values() const;\n\n    Q_INVOKABLE QVariant containt( const QString & key );\n    Q_INVOKABLE QVariant containt( const QString & key, const QVariant & value );\n    Q_INVOKABLE QVariant contains( const QString & key );\n    Q_INVOKABLE QVariant contains( const QString & key, const QVariant & value );\n\n    Q_INVOKABLE void clear();\n    Q_INVOKABLE int count();\n\n    Q_INVOKABLE QVariantMap toMap() const;\n\nQ_SIGNALS:\n    void countChanged();\n    void valuesChanged();\n    void keysChanged();\n\nprivate:\n    AsemanMapObjectPrivate *p;\n};\n\ntypedef AsemanMapObject QAsemanMapObject;\n\n#endif // ASEMANMAPOBJECT_H\n"
  },
  {
    "path": "src/core/asemanmixedlistmodel.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanmixedlistmodel.h\"\n\n#include <QTimer>\n#include <QDebug>\n\nclass AsemanMixedListModelPrivate\n{\npublic:\n    QList<QAbstractListModel*> models;\n    QVariantList cachedList;\n    QTimer *initTimer;\n    bool inited;\n};\n\nAsemanMixedListModel::AsemanMixedListModel(QObject *parent) :\n    AsemanAbstractListModel(parent)\n{\n    p = new AsemanMixedListModelPrivate;\n    p->inited = false;\n\n    p->initTimer = new QTimer(this);\n    p->initTimer->setInterval(200);\n    p->initTimer->setSingleShot(true);\n\n    connect(p->initTimer, &QTimer::timeout, this, &AsemanMixedListModel::reinit_prv);\n}\n\nint AsemanMixedListModel::rowCount(const QModelIndex &parent) const\n{\n    Q_UNUSED(parent)\n    return count();\n}\n\nQVariant AsemanMixedListModel::data(const QModelIndex &index, int role) const\n{\n    for(QAbstractListModel *model: p->models)\n    {\n        QModelIndex newIndex = mapToModelIndex(model, index);\n        if(!newIndex.isValid())\n            continue;\n\n        if(role == RolesModelObject)\n            return QVariant::fromValue<QObject*>(model);\n        else\n        if(role == RolesModelIndex)\n            return p->models.indexOf(model);\n        else\n        if(role == RolesModelName)\n            return model? model->objectName() : QStringLiteral(\"\");\n        else\n        if(role < Qt::UserRole)\n            return model->data(newIndex, role);\n        else\n        if(model->roleNames().contains(role))\n            return model->data(newIndex, role);\n    }\n\n    return QVariant();\n}\n\nbool AsemanMixedListModel::setData(const QModelIndex &index, const QVariant &value, int role)\n{\n    for(QAbstractListModel *model: p->models)\n    {\n        QModelIndex newIndex = mapToModelIndex(model, index);\n        if(!newIndex.isValid())\n            continue;\n\n        return model->setData(newIndex, value, role);\n    }\n\n    return false;\n}\n\nQHash<qint32, QByteArray> AsemanMixedListModel::roleNames() const\n{\n    QHash<qint32, QByteArray> roles;\n    roles[RolesModelObject] = \"modelObject\";\n    roles[RolesModelIndex] = \"modelIndex\";\n    roles[RolesModelName] = \"modelName\";\n\n    for(QAbstractListModel *model: p->models)\n    {\n        const auto &roleNames = model->roleNames();\n        auto it = roleNames.begin();\n        const auto end = roleNames.end();\n        while (it != end)\n        {\n            roles[it.key()] = it.value();\n            it++;\n        }\n    }\n\n    return roles;\n}\n\nint AsemanMixedListModel::count() const\n{\n    int count = 0;\n    for(QAbstractListModel *model: p->models)\n        count += model->rowCount();\n    return count;\n}\n\nvoid AsemanMixedListModel::setModels(const QVariantList &list)\n{\n    if(list == p->cachedList)\n        return;\n\n    p->cachedList = list;\n    reinit();\n\n    Q_EMIT modelsChanged();\n    Q_EMIT countChanged();\n}\n\nQVariantList AsemanMixedListModel::models() const\n{\n    return p->cachedList;\n}\n\nQt::ItemFlags AsemanMixedListModel::flags(const QModelIndex &index) const\n{\n    for(QAbstractListModel *model: p->models)\n    {\n        QModelIndex newIndex = mapToModelIndex(model, index);\n        if(!newIndex.isValid())\n            continue;\n\n        return model->flags(newIndex);\n    }\n\n    return Qt::NoItemFlags;\n}\n\nbool AsemanMixedListModel::insertColumns(int column, int count, const QModelIndex &parent)\n{\n    for(QAbstractListModel *model: p->models)\n    {\n        QModelIndex newIndex = mapToModelIndex(model, parent);\n        if(!newIndex.isValid())\n            continue;\n\n        return model->insertColumns(column, count, newIndex);\n    }\n\n    return false;\n}\n\nbool AsemanMixedListModel::insertRows(int row, int count, const QModelIndex &parent)\n{\n    for(QAbstractListModel *model: p->models)\n    {\n        QModelIndex newIndex = mapToModelIndex(model, parent);\n        if(!newIndex.isValid())\n            continue;\n\n        return model->insertRows(row, count, newIndex);\n    }\n\n    return false;\n}\n\nbool AsemanMixedListModel::moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationChild)\n{\n    for(QAbstractListModel *model: p->models)\n    {\n        QModelIndex newIndex = mapToModelIndex(model, sourceParent);\n        if(!newIndex.isValid())\n            continue;\n\n        return model->moveColumns(sourceParent, sourceColumn, count, destinationParent, destinationChild);\n    }\n\n    return false;\n}\n\nbool AsemanMixedListModel::moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild)\n{\n    for(QAbstractListModel *model: p->models)\n    {\n        QModelIndex newIndex = mapToModelIndex(model, sourceParent);\n        if(!newIndex.isValid())\n            continue;\n\n        return model->moveRows(sourceParent, sourceRow, count, destinationParent, destinationChild);\n    }\n\n    return false;\n}\n\nbool AsemanMixedListModel::removeColumns(int column, int count, const QModelIndex &parent)\n{\n    for(QAbstractListModel *model: p->models)\n    {\n        QModelIndex newIndex = mapToModelIndex(model, parent);\n        if(!newIndex.isValid())\n            continue;\n\n        return model->removeColumns(column, count, newIndex);\n    }\n\n    return false;\n}\n\nbool AsemanMixedListModel::removeRows(int row, int count, const QModelIndex &parent)\n{\n    for(QAbstractListModel *model: p->models)\n    {\n        QModelIndex newIndex = mapToModelIndex(model, parent);\n        if(!newIndex.isValid())\n            continue;\n\n        return model->removeRows(row, count, newIndex);\n    }\n\n    return false;\n}\n\nvoid AsemanMixedListModel::columnsAboutToBeInserted_slt(const QModelIndex &parent, int first, int last)\n{\n    QAbstractListModel *model = qobject_cast<QAbstractListModel*>(sender());\n    if(model)\n        beginInsertColumns( mapFromModelIndex(model, parent),\n                            mapFromModel(model, first),\n                            mapFromModel(model, last));\n}\n\nvoid AsemanMixedListModel::columnsAboutToBeMoved_slt(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn)\n{\n    QAbstractListModel *model = qobject_cast<QAbstractListModel*>(sender());\n    if(model)\n        beginMoveColumns( mapFromModelIndex(model, sourceParent),\n                          mapFromModel(model, sourceStart),\n                          mapFromModel(model, sourceEnd),\n                          mapFromModelIndex(model, destinationParent),\n                          mapFromModel(model, destinationColumn));\n}\n\nvoid AsemanMixedListModel::columnsAboutToBeRemoved_slt(const QModelIndex &parent, int first, int last)\n{\n    QAbstractListModel *model = qobject_cast<QAbstractListModel*>(sender());\n    if(model)\n        beginRemoveColumns( mapFromModelIndex(model, parent),\n                            mapFromModel(model, first),\n                            mapFromModel(model, last));\n}\n\nvoid AsemanMixedListModel::columnsInserted_slt(const QModelIndex &parent, int first, int last)\n{\n    Q_UNUSED(parent)\n    Q_UNUSED(first)\n    Q_UNUSED(last)\n    QAbstractListModel *model = qobject_cast<QAbstractListModel*>(sender());\n    if(model)\n        endInsertColumns();\n}\n\nvoid AsemanMixedListModel::columnsMoved_slt(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int column)\n{\n    Q_UNUSED(parent)\n    Q_UNUSED(start)\n    Q_UNUSED(end)\n    Q_UNUSED(destination)\n    Q_UNUSED(column)\n    QAbstractListModel *model = qobject_cast<QAbstractListModel*>(sender());\n    if(model)\n        endMoveColumns();\n}\n\nvoid AsemanMixedListModel::columnsRemoved_slt(const QModelIndex &parent, int first, int last)\n{\n    Q_UNUSED(parent)\n    Q_UNUSED(first)\n    Q_UNUSED(last)\n    QAbstractListModel *model = qobject_cast<QAbstractListModel*>(sender());\n    if(model)\n        endRemoveColumns();\n}\n\nvoid AsemanMixedListModel::dataChanged_slt(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)\n{\n    QAbstractListModel *model = qobject_cast<QAbstractListModel*>(sender());\n    if(model)\n        Q_EMIT dataChanged( mapFromModelIndex(model, topLeft),\n                          mapFromModelIndex(model, bottomRight),\n                          roles);\n}\n\nvoid AsemanMixedListModel::headerDataChanged_slt(Qt::Orientation orientation, int first, int last)\n{\n    Q_UNUSED(orientation)\n    Q_UNUSED(first)\n    Q_UNUSED(last)\n}\n\nvoid AsemanMixedListModel::layoutAboutToBeChanged_slt(const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint)\n{\n    Q_UNUSED(parents)\n    Q_UNUSED(hint)\n}\n\nvoid AsemanMixedListModel::layoutChanged_slt(const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint)\n{\n    Q_UNUSED(parents)\n    Q_UNUSED(hint)\n}\n\nvoid AsemanMixedListModel::modelAboutToBeReset_slt()\n{\n    beginResetModel();\n}\n\nvoid AsemanMixedListModel::modelReset_slt()\n{\n    endResetModel();\n    Q_EMIT countChanged();\n}\n\nvoid AsemanMixedListModel::rowsAboutToBeInserted_slt(const QModelIndex &parent, int start, int end)\n{\n    QAbstractListModel *model = qobject_cast<QAbstractListModel*>(sender());\n    if(model)\n        beginInsertRows( mapFromModelIndex(model, parent),\n                         mapFromModel(model, start),\n                         mapFromModel(model, end));\n}\n\nvoid AsemanMixedListModel::rowsAboutToBeMoved_slt(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)\n{\n    QAbstractListModel *model = qobject_cast<QAbstractListModel*>(sender());\n    if(model)\n        beginMoveRows( mapFromModelIndex(model, sourceParent),\n                       mapFromModel(model, sourceStart),\n                       mapFromModel(model, sourceEnd),\n                       mapFromModelIndex(model, destinationParent),\n                       mapFromModel(model, destinationRow));\n}\n\nvoid AsemanMixedListModel::rowsAboutToBeRemoved_slt(const QModelIndex &parent, int first, int last)\n{\n    QAbstractListModel *model = qobject_cast<QAbstractListModel*>(sender());\n    if(model)\n        beginRemoveRows( mapFromModelIndex(model, parent),\n                         mapFromModel(model, first),\n                         mapFromModel(model, last));\n}\n\nvoid AsemanMixedListModel::rowsInserted_slt(const QModelIndex &parent, int first, int last)\n{\n    Q_UNUSED(parent)\n    Q_UNUSED(first)\n    Q_UNUSED(last)\n    QAbstractListModel *model = qobject_cast<QAbstractListModel*>(sender());\n    if(model)\n        endInsertRows();\n\n    Q_EMIT countChanged();\n}\n\nvoid AsemanMixedListModel::rowsMoved_slt(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row)\n{\n    Q_UNUSED(parent)\n    Q_UNUSED(start)\n    Q_UNUSED(end)\n    Q_UNUSED(destination)\n    Q_UNUSED(row)\n    QAbstractListModel *model = qobject_cast<QAbstractListModel*>(sender());\n    if(model)\n        endMoveRows();\n\n    Q_EMIT countChanged();\n}\n\nvoid AsemanMixedListModel::rowsRemoved_slt(const QModelIndex &parent, int first, int last)\n{\n    Q_UNUSED(parent)\n    Q_UNUSED(first)\n    Q_UNUSED(last)\n    QAbstractListModel *model = qobject_cast<QAbstractListModel*>(sender());\n    if(model)\n        endRemoveRows();\n\n    Q_EMIT countChanged();\n}\n\nvoid AsemanMixedListModel::modelDestroyed(QObject *obj)\n{\n    QAbstractListModel *model = qobject_cast<QAbstractListModel*>(obj);\n    if(!model)\n        return;\n\n    p->models.removeAll(model);\n    p->cachedList.removeAll(QVariant::fromValue<QObject*>(obj));\n    Q_EMIT modelsChanged();\n}\n\nvoid AsemanMixedListModel::reinit()\n{\n    p->inited = false;\n    p->initTimer->stop();\n    p->initTimer->start();\n}\n\nvoid AsemanMixedListModel::reinit_prv()\n{\n    for(QAbstractListModel *model: p->models)\n    {\n        disconnect(model, &QAbstractListModel::destroyed, this, &AsemanMixedListModel::modelDestroyed);\n        disconnect(model, &QAbstractListModel::dataChanged, this, &AsemanMixedListModel::dataChanged_slt);\n        disconnect(model, &QAbstractListModel::columnsAboutToBeInserted, this, &AsemanMixedListModel::columnsAboutToBeInserted_slt);\n        disconnect(model, &QAbstractListModel::columnsAboutToBeMoved, this, &AsemanMixedListModel::columnsAboutToBeMoved_slt);\n        disconnect(model, &QAbstractListModel::columnsAboutToBeRemoved, this, &AsemanMixedListModel::columnsAboutToBeRemoved_slt);\n        disconnect(model, &QAbstractListModel::columnsInserted, this, &AsemanMixedListModel::columnsInserted_slt);\n        disconnect(model, &QAbstractListModel::columnsMoved, this, &AsemanMixedListModel::columnsMoved_slt);\n        disconnect(model, &QAbstractListModel::columnsRemoved, this, &AsemanMixedListModel::columnsRemoved_slt);\n        disconnect(model, &QAbstractListModel::dataChanged, this, &AsemanMixedListModel::dataChanged_slt);\n        disconnect(model, &QAbstractListModel::headerDataChanged, this, &AsemanMixedListModel::headerDataChanged_slt);\n        disconnect(model, &QAbstractListModel::layoutAboutToBeChanged, this, &AsemanMixedListModel::layoutAboutToBeChanged_slt);\n        disconnect(model, &QAbstractListModel::layoutChanged, this, &AsemanMixedListModel::layoutChanged_slt);\n        disconnect(model, &QAbstractListModel::modelAboutToBeReset, this, &AsemanMixedListModel::modelAboutToBeReset_slt);\n        disconnect(model, &QAbstractListModel::modelReset, this, &AsemanMixedListModel::modelReset_slt);\n        disconnect(model, &QAbstractListModel::rowsAboutToBeInserted, this, &AsemanMixedListModel::rowsAboutToBeInserted_slt);\n        disconnect(model, &QAbstractListModel::rowsAboutToBeMoved, this, &AsemanMixedListModel::rowsAboutToBeMoved_slt);\n        disconnect(model, &QAbstractListModel::rowsAboutToBeRemoved, this, &AsemanMixedListModel::rowsAboutToBeRemoved_slt);\n        disconnect(model, &QAbstractListModel::rowsInserted, this, &AsemanMixedListModel::rowsInserted_slt);\n        disconnect(model, &QAbstractListModel::rowsMoved, this, &AsemanMixedListModel::rowsMoved_slt);\n        disconnect(model, &QAbstractListModel::rowsRemoved, this, &AsemanMixedListModel::rowsRemoved_slt);\n    }\n\n    beginResetModel();\n    p->models.clear();\n    for(const QVariant &var: p->cachedList)\n    {\n        QAbstractListModel *model = qobject_cast<QAbstractListModel*>(var.value<QObject*>());\n        if(!model)\n            continue;\n\n        p->models << model;\n        connect(model, &QAbstractListModel::destroyed, this, &AsemanMixedListModel::modelDestroyed);\n        connect(model, &QAbstractListModel::dataChanged, this, &AsemanMixedListModel::dataChanged_slt);\n        connect(model, &QAbstractListModel::columnsAboutToBeInserted, this, &AsemanMixedListModel::columnsAboutToBeInserted_slt);\n        connect(model, &QAbstractListModel::columnsAboutToBeMoved, this, &AsemanMixedListModel::columnsAboutToBeMoved_slt);\n        connect(model, &QAbstractListModel::columnsAboutToBeRemoved, this, &AsemanMixedListModel::columnsAboutToBeRemoved_slt);\n        connect(model, &QAbstractListModel::columnsInserted, this, &AsemanMixedListModel::columnsInserted_slt);\n        connect(model, &QAbstractListModel::columnsMoved, this, &AsemanMixedListModel::columnsMoved_slt);\n        connect(model, &QAbstractListModel::columnsRemoved, this, &AsemanMixedListModel::columnsRemoved_slt);\n        connect(model, &QAbstractListModel::dataChanged, this, &AsemanMixedListModel::dataChanged_slt);\n        connect(model, &QAbstractListModel::headerDataChanged, this, &AsemanMixedListModel::headerDataChanged_slt);\n        connect(model, &QAbstractListModel::layoutAboutToBeChanged, this, &AsemanMixedListModel::layoutAboutToBeChanged_slt);\n        connect(model, &QAbstractListModel::layoutChanged, this, &AsemanMixedListModel::layoutChanged_slt);\n        connect(model, &QAbstractListModel::modelAboutToBeReset, this, &AsemanMixedListModel::modelAboutToBeReset_slt);\n        connect(model, &QAbstractListModel::modelReset, this, &AsemanMixedListModel::modelReset_slt);\n        connect(model, &QAbstractListModel::rowsAboutToBeInserted, this, &AsemanMixedListModel::rowsAboutToBeInserted_slt);\n        connect(model, &QAbstractListModel::rowsAboutToBeMoved, this, &AsemanMixedListModel::rowsAboutToBeMoved_slt);\n        connect(model, &QAbstractListModel::rowsAboutToBeRemoved, this, &AsemanMixedListModel::rowsAboutToBeRemoved_slt);\n        connect(model, &QAbstractListModel::rowsInserted, this, &AsemanMixedListModel::rowsInserted_slt);\n        connect(model, &QAbstractListModel::rowsMoved, this, &AsemanMixedListModel::rowsMoved_slt);\n        connect(model, &QAbstractListModel::rowsRemoved, this, &AsemanMixedListModel::rowsRemoved_slt);\n    }\n    endResetModel();\n    p->inited = true;\n}\n\nQModelIndex AsemanMixedListModel::mapFromModelIndex(QAbstractListModel *model, const QModelIndex &index) const\n{\n    if(index.parent().isValid())\n        return index;\n\n    const int mappedRow = mapFromModel(model, index.row());\n    return model->index( mappedRow, index.column(), index.parent());\n}\n\nint AsemanMixedListModel::mapFromModel(QAbstractListModel *model, int row) const\n{\n    return row+modelPad(model);\n}\n\nQModelIndex AsemanMixedListModel::mapToModelIndex(QAbstractListModel *model, const QModelIndex &index) const\n{\n    if(index.parent().isValid())\n        return index;\n\n    const int mappedRow = mapToModel(model, index.row());\n    if(mappedRow < 0)\n        return QModelIndex();\n    else\n        return model->index(mappedRow, index.column(), index.parent());\n}\n\nint AsemanMixedListModel::mapToModel(QAbstractListModel *model, int row) const\n{\n    int newRow = row-modelPad(model);\n    if(0 <= newRow && newRow < model->rowCount())\n        return newRow;\n    else\n        return -1;\n}\n\nint AsemanMixedListModel::modelPad(QAbstractListModel *model) const\n{\n    int rowPad = 0;\n    for(QAbstractListModel *mdl: p->models)\n    {\n        if(mdl == model)\n            break;\n\n        rowPad += mdl->rowCount();\n    }\n\n    return rowPad;\n}\n\nAsemanMixedListModel::~AsemanMixedListModel()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/core/asemanmixedlistmodel.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANMIXEDLISTMODEL_H\n#define ASEMANMIXEDLISTMODEL_H\n\n#include \"asemanabstractlistmodel.h\"\n\n#include \"asemancore_global.h\"\n\nclass AsemanMixedListModelPrivate;\nclass LIBQTASEMAN_CORE_EXPORT AsemanMixedListModel : public AsemanAbstractListModel\n{\n    Q_OBJECT\n    Q_ENUMS(DataRoles)\n    Q_PROPERTY(int count READ count NOTIFY countChanged)\n    Q_PROPERTY(QVariantList models READ models WRITE setModels NOTIFY modelsChanged)\n\npublic:\n    enum DataRoles {\n        RolesModelObject = Qt::UserRole + 1000000,\n        RolesModelIndex,\n        RolesModelName\n    };\n\n    AsemanMixedListModel(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanMixedListModel();\n\n    int rowCount(const QModelIndex & parent = QModelIndex()) const Q_DECL_OVERRIDE;\n    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;\n    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::DisplayRole) Q_DECL_OVERRIDE;\n\n    QHash<qint32,QByteArray> roleNames() const Q_DECL_OVERRIDE;\n    int count() const;\n\n    void setModels(const QVariantList &list);\n    QVariantList models() const;\n\n    Qt::ItemFlags flags(const QModelIndex & index) const Q_DECL_OVERRIDE;\n    bool insertColumns(int column, int count, const QModelIndex & parent = QModelIndex()) Q_DECL_OVERRIDE;\n    bool insertRows(int row, int count, const QModelIndex & parent = QModelIndex()) Q_DECL_OVERRIDE;\n    bool moveColumns(const QModelIndex & sourceParent, int sourceColumn, int count, const QModelIndex & destinationParent, int destinationChild) Q_DECL_OVERRIDE;\n    bool moveRows(const QModelIndex & sourceParent, int sourceRow, int count, const QModelIndex & destinationParent, int destinationChild) Q_DECL_OVERRIDE;\n    bool removeColumns(int column, int count, const QModelIndex & parent = QModelIndex()) Q_DECL_OVERRIDE;\n    bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex()) Q_DECL_OVERRIDE;\n\nQ_SIGNALS:\n    void countChanged();\n    void modelsChanged();\n\nprivate Q_SLOTS:\n    void columnsAboutToBeInserted_slt(const QModelIndex & parent, int first, int last);\n    void columnsAboutToBeMoved_slt(const QModelIndex & sourceParent, int sourceStart, int sourceEnd, const QModelIndex & destinationParent, int destinationColumn);\n    void columnsAboutToBeRemoved_slt(const QModelIndex & parent, int first, int last);\n    void columnsInserted_slt(const QModelIndex & parent, int first, int last);\n    void columnsMoved_slt(const QModelIndex & parent, int start, int end, const QModelIndex & destination, int column);\n    void columnsRemoved_slt(const QModelIndex & parent, int first, int last);\n    void dataChanged_slt(const QModelIndex & topLeft, const QModelIndex & bottomRight, const QVector<int> & roles = QVector<int> ());\n    void headerDataChanged_slt(Qt::Orientation orientation, int first, int last);\n    void layoutAboutToBeChanged_slt(const QList<QPersistentModelIndex> & parents = QList<QPersistentModelIndex> (), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint);\n    void layoutChanged_slt(const QList<QPersistentModelIndex> & parents = QList<QPersistentModelIndex> (), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint);\n    void modelAboutToBeReset_slt();\n    void modelReset_slt();\n    void rowsAboutToBeInserted_slt(const QModelIndex & parent, int start, int end);\n    void rowsAboutToBeMoved_slt(const QModelIndex & sourceParent, int sourceStart, int sourceEnd, const QModelIndex & destinationParent, int destinationRow);\n    void rowsAboutToBeRemoved_slt(const QModelIndex & parent, int first, int last);\n    void rowsInserted_slt(const QModelIndex & parent, int first, int last);\n    void rowsMoved_slt(const QModelIndex & parent, int start, int end, const QModelIndex & destination, int row);\n    void rowsRemoved_slt(const QModelIndex & parent, int first, int last);\n    void modelDestroyed(QObject *obj);\n    void reinit_prv();\n\nprivate:\n    void reinit();\n\nprotected:\n    QModelIndex mapFromModelIndex(QAbstractListModel *model, const QModelIndex &index) const;\n    int mapFromModel(QAbstractListModel *model, int row) const;\n\n    QModelIndex mapToModelIndex(QAbstractListModel *model, const QModelIndex &index) const;\n    int mapToModel(QAbstractListModel *model, int row) const;\n\n    int modelPad(QAbstractListModel *model) const;\n\nprivate:\n    AsemanMixedListModelPrivate *p;\n};\n\ntypedef AsemanMixedListModel QAsemanMixedListModel;\n\n#endif // ASEMANMIXEDLISTMODEL_H\n"
  },
  {
    "path": "src/core/asemanqtlogger.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanqtlogger.h\"\n\n#include <QDebug>\n#include <QFile>\n#include <QDir>\n#include <QDateTime>\n#include <QFileInfo>\n#include <QCoreApplication>\n#include <QMutex>\n\nQSet<AsemanQtLogger*> aseman_qt_logger_objs;\nQtMessageHandler aseman_qt_logger_previousHandler = 0;\n\nvoid asemanQtLoggerFnc(QtMsgType type, const QMessageLogContext &context, const QString &msg)\n{\n    for(AsemanQtLogger *obj: aseman_qt_logger_objs)\n        obj->logMsg(type,context,msg);\n    aseman_qt_logger_previousHandler(type, context, msg);\n}\n\nclass AsemanQtLoggerPrivate\n{\npublic:\n    QFile *file;\n    QString path;\n    QMutex file_mutex;\n};\n\nAsemanQtLogger::AsemanQtLogger(const QString &path, QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanQtLoggerPrivate;\n    p->path = path;\n    p->file = 0;\n\n    aseman_qt_logger_objs.insert(this);\n}\n\nvoid AsemanQtLogger::logMsg(QtMsgType type, const QMessageLogContext &context, const QString &msg)\n{\n    QString file = QString::fromUtf8(context.file);\n    QByteArray localMsg = msg.toLocal8Bit();\n    QString text = QStringLiteral(\": (%2:%3, %4) %5 : %1\\n\").arg(QString::fromUtf8(localMsg.constData()))\n            .arg(file.mid(file.lastIndexOf(QStringLiteral(\"/\"))+1))\n            .arg(context.line).arg(QString::fromUtf8(context.function)).arg(QTime::currentTime().toString());\n\n    switch (static_cast<int>(type)) {\n    case QtDebugMsg:\n        text = \"Debug\" + text;\n        p->file_mutex.lock();\n        p->file->write(text.toUtf8());\n        p->file->flush();\n        p->file_mutex.unlock();\n        break;\n    case QtWarningMsg:\n        text = \"Warning\" + text;\n        p->file_mutex.lock();\n        p->file->write(text.toUtf8());\n        p->file->flush();\n        p->file_mutex.unlock();\n        break;\n    case QtCriticalMsg:\n        text = \"Critical\" + text;\n        p->file_mutex.lock();\n        p->file->write(text.toUtf8());\n        p->file->flush();\n        p->file_mutex.unlock();\n        break;\n    case QtFatalMsg:\n        text = \"Fatal\" + text;\n        p->file_mutex.lock();\n        p->file->write(text.toUtf8());\n        p->file->flush();\n        p->file_mutex.unlock();\n        abort();\n    }\n}\n\nQString AsemanQtLogger::path() const\n{\n    return p->path;\n}\n\nvoid AsemanQtLogger::debug(const QVariant &var)\n{\n    qDebug() << var;\n}\n\nvoid AsemanQtLogger::start()\n{\n    if(p->file)\n        return;\n\n    p->file = new QFile(p->path);\n    p->file->open(QFile::WriteOnly);\n\n    if(aseman_qt_logger_previousHandler)\n        return;\n\n    aseman_qt_logger_previousHandler = qInstallMessageHandler(asemanQtLoggerFnc);\n}\n\nvoid AsemanQtLogger::app_closed()\n{\n}\n\nAsemanQtLogger::~AsemanQtLogger()\n{\n    aseman_qt_logger_objs.remove(this);\n    if( aseman_qt_logger_objs.isEmpty() )\n        qInstallMessageHandler(0);\n\n    delete p;\n}\n"
  },
  {
    "path": "src/core/asemanqtlogger.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQTLOGGER_H\n#define ASEMANQTLOGGER_H\n\n#include <QObject>\n\n#include \"asemancore_global.h\"\n\nclass AsemanQtLoggerPrivate;\nclass LIBQTASEMAN_CORE_EXPORT AsemanQtLogger : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QString path READ path NOTIFY pathChanged)\n\npublic:\n    AsemanQtLogger(const QString & path, QObject *parent = Q_NULLPTR);\n    virtual ~AsemanQtLogger();\n\n    virtual void logMsg(QtMsgType type , const QMessageLogContext &context, const QString &msg);\n    QString path() const;\n\nQ_SIGNALS:\n    void pathChanged();\n\npublic Q_SLOTS:\n    void debug( const QVariant & var );\n    void start();\n\nprivate Q_SLOTS:\n    void app_closed();\n\nprivate:\n    AsemanQtLoggerPrivate *p;\n};\n\ntypedef AsemanQtLogger QAsemanQtLogger;\n\n#endif // ASEMANQTLOGGER_H\n"
  },
  {
    "path": "src/core/asemanrefresherobject.cpp",
    "content": "#include \"asemanrefresherobject.h\"\n\nAsemanRefresherObject::AsemanRefresherObject(QObject *parent)\n    : QObject(parent)\n{\n    mDelayTimer = new QTimer(this);\n    mDelayTimer->setSingleShot(true);\n\n    connect(mDelayTimer, &QTimer::timeout, this, [this](){\n        mRefreshing = true;\n        Q_EMIT refreshingChanged();\n        Q_EMIT activeChanged();\n    });\n}\n\nAsemanRefresherObject::~AsemanRefresherObject()\n{\n}\n\nbool AsemanRefresherObject::refreshing() const\n{\n    return mRefreshing;\n}\n\nbool AsemanRefresherObject::active() const\n{\n    return mDelayTimer->isActive() || mRefreshing;\n}\n\nvoid AsemanRefresherObject::setRefreshing(bool state)\n{\n    if (!state)\n    {\n        mDelayTimer->stop();\n        if (mRefreshing)\n            mInitialized = true;\n\n        mRefreshing = false;\n        Q_EMIT refreshingChanged();\n    }\n    else if (!mDelay || !mInitialized)\n    {\n        mDelayTimer->stop();\n        mRefreshing = true;\n        Q_EMIT refreshingChanged();\n    }\n    else\n    {\n        if (!mDelayTimer->isActive())\n            mDelayTimer->start(mDelay);\n    }\n    Q_EMIT activeChanged();\n}\n\nqint32 AsemanRefresherObject::delay() const\n{\n    return mDelay;\n}\n\nbool AsemanRefresherObject::forceActiveOnInitialize() const\n{\n    return mForceActiveOnInitialize;\n}\n\nvoid AsemanRefresherObject::setForceActiveOnInitialize(bool newForceActiveOnInitialize)\n{\n    mForceActiveOnInitialize = newForceActiveOnInitialize;\n    mInitialized = false;\n}\n\nvoid AsemanRefresherObject::setDelay(qint32 newDelay)\n{\n    if (mDelay == newDelay)\n        return;\n\n    mDelay = newDelay;\n    if (mDelayTimer->isActive())\n    {\n        mDelayTimer->stop();\n        if (mDelay)\n            mDelayTimer->start(mDelay);\n        else\n        {\n            mRefreshing = true;\n            Q_EMIT refreshingChanged();\n        }\n    }\n\n    Q_EMIT delayChanged();\n}\n"
  },
  {
    "path": "src/core/asemanrefresherobject.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANREFRESHEROBJECT_H\n#define ASEMANREFRESHEROBJECT_H\n\n#include <QObject>\n#include <QTimer>\n\n#include \"asemancore_global.h\"\n\nclass LIBQTASEMAN_CORE_EXPORT AsemanRefresherObject : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(bool refreshing READ refreshing NOTIFY refreshingChanged)\n    Q_PROPERTY(bool active READ active NOTIFY activeChanged)\n    Q_PROPERTY(qint32 delay READ delay NOTIFY delayChanged)\n\npublic:\n    AsemanRefresherObject(QObject *parent = nullptr);\n    virtual ~AsemanRefresherObject();\n\n    void setRefreshing(bool state);\n    void setDelay(qint32 newDelay);\n\n    bool refreshing() const;\n    bool active() const;\n    qint32 delay() const;\n\n    bool forceActiveOnInitialize() const;\n    void setForceActiveOnInitialize(bool newForceActiveOnInitialize);\n\nQ_SIGNALS:\n    void refreshingChanged();\n    void activeChanged();\n    void delayChanged();\n\nprivate:\n    bool mForceActiveOnInitialize = true;\n    bool mInitialized = false;\n    bool mRefreshing = false;\n\n    qint32 mDelay = 0;\n    QTimer *mDelayTimer;\n};\n\ntypedef AsemanRefresherObject QAsemanRefresherObject;\n\n#endif // ASEMANREFRESHEROBJECT_H\n"
  },
  {
    "path": "src/core/asemansettings.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#define PROPERTY_KEY(PROPERTY) QString(p->caregory.isEmpty()? QString(PROPERTY) : p->caregory + QStringLiteral(\"/\") + QString(PROPERTY))\n\n#include \"asemansettings.h\"\n\n#include <QMetaObject>\n#include <QMetaProperty>\n#include <QDir>\n#include <QSettings>\n#include <QFileInfo>\n#include <QTimer>\n#include <QDebug>\n\nclass AsemanSettingsPrivate\n{\npublic:\n    QHash<QByteArray, QByteArray> signalsProperties;\n    QSettings *settings;\n    QString caregory;\n    QString source;\n};\n\nAsemanSettings::AsemanSettings(QObject *parent) : QObject(parent)\n{\n    p = new AsemanSettingsPrivate;\n\n#ifdef Q_OS_WASM\n    p->settings = new QSettings;\n\n    std::function<void(void)> *testSettingsReady = new std::function<void(void)>();\n    *testSettingsReady = [=](){\n        if (p->settings->status() == QSettings::NoError) {\n            delete testSettingsReady;\n            initProperties();\n        } else {\n            QTimer::singleShot(10, this, *testSettingsReady);\n        }\n    };\n    (*testSettingsReady)();\n#else\n    p->settings = 0;\n\n    initProperties();\n#endif\n}\n\nvoid AsemanSettings::setCategory(const QString &category)\n{\n    if(p->caregory == category)\n        return;\n\n    p->caregory = category;\n    initProperties();\n    Q_EMIT categoryChanged();\n}\n\nQString AsemanSettings::category() const\n{\n    return p->caregory;\n}\n\nvoid AsemanSettings::setSource(const QString &source)\n{\n    if(p->source == source)\n        return;\n\n    p->source = source;\n#ifndef Q_OS_WASM\n    if(p->settings)\n        delete p->settings;\n\n    p->settings = 0;\n    if(!p->source.isEmpty())\n    {\n        QDir().mkpath(QFileInfo(p->source).dir().path());\n        p->settings = new QSettings(p->source, QSettings::IniFormat, this);\n        initProperties();\n    }\n#endif\n\n    Q_EMIT sourceChanged();\n}\n\nQString AsemanSettings::source() const\n{\n    return p->source;\n}\n\nvoid AsemanSettings::setValue(const QString &key, const QVariant &value)\n{\n    if(!p->settings)\n        return;\n\n    p->settings->setValue(PROPERTY_KEY(key), value);\n    Q_EMIT valueChanged();\n}\n\nQVariant AsemanSettings::value(const QString &key, const QVariant &defaultValue)\n{\n    if(!p->settings)\n        return QVariant();\n\n    return p->settings->value(PROPERTY_KEY(key), defaultValue);\n}\n\nvoid AsemanSettings::remove(const QString &key)\n{\n    if(!p->settings)\n        return;\n    p->settings->remove(PROPERTY_KEY(key));\n}\n\nQStringList AsemanSettings::keys() const\n{\n    QStringList result;\n    if(!p->settings)\n        return result;\n\n    p->settings->beginGroup(p->caregory);\n    result = p->settings->childKeys();\n    p->settings->endGroup();\n    return result;\n}\n\nvoid AsemanSettings::sync()\n{\n    if(!p->settings)\n        return;\n\n    p->settings->sync();\n    initProperties();\n}\n\nvoid AsemanSettings::propertyChanged()\n{\n    if(sender() != this)\n        return;\n\n    const int signalIndex = senderSignalIndex();\n    if(signalIndex == -1)\n        return;\n\n    QMetaMethod signalObj = metaObject()->method(signalIndex);\n    const QByteArray &propertyName = p->signalsProperties.value(signalObj.methodSignature());\n    const QVariant &value = property(propertyName);\n    if(p->settings)\n        p->settings->setValue( PROPERTY_KEY(QString::fromUtf8(propertyName)), value);\n\n    Q_EMIT valueChanged();\n}\n\nvoid AsemanSettings::initProperties()\n{\n    if(!p->settings || p->caregory.isEmpty())\n        return;\n\n    for (const auto &signalSign: p->signalsProperties.keys())\n        disconnect(this, QByteArray(QByteArray::number(QSIGNAL_CODE)+signalSign),\n                   this, SLOT(propertyChanged()));\n\n    p->signalsProperties.clear();\n\n    const QMetaObject *meta = metaObject();\n    for(int i=0; i<meta->propertyCount(); i++)\n    {\n        QMetaProperty property = meta->property(i);\n        const QByteArray &propertyName = property.name();\n        const QByteArray &signalSign = property.notifySignal().methodSignature();\n        if(propertyName == \"source\" || propertyName == \"category\" || propertyName == \"objectName\")\n            continue;\n\n        p->signalsProperties[signalSign] = propertyName;\n        if(p->settings)\n        {\n            QVariant value = p->settings->value(PROPERTY_KEY( QString::fromUtf8(propertyName) ));\n            if(value != QObject::property(propertyName) && value.isValid())\n                setProperty(propertyName, value);\n        }\n\n        connect(this, QByteArray(QByteArray::number(QSIGNAL_CODE)+signalSign),\n                this, SLOT(propertyChanged()));\n    }\n}\n\nAsemanSettings::~AsemanSettings()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/core/asemansettings.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANSETTINGS_H\n#define ASEMANSETTINGS_H\n\n#include <QObject>\n#include <QVariant>\n\n#include \"asemancore_global.h\"\n\nclass AsemanSettingsPrivate;\nclass LIBQTASEMAN_CORE_EXPORT AsemanSettings : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QString category READ category WRITE setCategory NOTIFY categoryChanged)\n    Q_PROPERTY(QString source READ source WRITE setSource NOTIFY sourceChanged)\npublic:\n    AsemanSettings(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanSettings();\n\n    void setCategory(const QString &category);\n    QString category() const;\n\n    void setSource(const QString &source);\n    QString source() const;\n\npublic Q_SLOTS:\n    void setValue(const QString &key, const QVariant &value);\n    QVariant value(const QString &key, const QVariant &defaultValue = QVariant());\n    void remove(const QString &key);\n    QStringList keys() const;\n    void sync();\n\nQ_SIGNALS:\n    void categoryChanged();\n    void sourceChanged();\n    void valueChanged();\n\nprivate Q_SLOTS:\n    void propertyChanged();\n    void initProperties();\n\nprivate:\n    AsemanSettingsPrivate *p;\n};\n\ntypedef AsemanSettings QAsemanSettings;\n\n#endif // ASEMANSETTINGS_H\n"
  },
  {
    "path": "src/core/asemansimpleqtcryptor.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/*\n *  SimpleQtCryptor is an encryption library for Qt.\n *\n *  Copyright (C) 2010 Gunnar Thorburn\n *\n *  SimpleQtRC5 is free software: you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 3 of the License, or\n *  (at your option) any later version.\n *\n *  ParrotShare is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n#include \"asemansimpleqtcryptor.h\"\n\n#ifdef WITH_SERPENT_INCLUDE_FAST_SBOX\n#include \"private/serpent_sbox.h\"\n#endif\n\n#include <QString>\n#include <QCryptographicHash>\n#include <QtEndian>\n#include <QDate>\n#include <QTime>\n\n#include <QDebug>\n\n\n#define ROUNDS 32\n#define KEYSIZE_RC5 20\n#define KEYSIZE_SERPENT 32\n#define SSIZE_RC5 66\n#define SSIZE_SERPENT 132\n\n#define P32 0xb7e17163\n#define Q32 0x9e3779b9\n#define P64 Q_UINT64_C(0xb7e151628aed2a6b);\n#define Q64 Q_UINT64_C(0x9e3779b97f4a7c15);\n\n#define ROTL32(x,y) (((x)<<(y)) | ((x)>>(32-(y))))\n#define ROTR32(x,y) (((x)>>(y)) | ((x)<<(32-(y))))\n#define ROTL64(x,y) (((x)<<(y)) | ((x)>>(64-(y))))\n#define ROTR64(x,y) (((x)>>(y)) | ((x)<<(64-(y))))\n\nnamespace AsemanSimpleQtCryptor {\n\n#ifdef WITHRC5\nQByteArray header_RC5_32_32_20  = QString::fromUtf8(\"RC5/32/32/20:\").toLatin1();\nQByteArray header_RC5_64_32_20  = QString::fromUtf8(\"RC5/64/32/20:\").toLatin1();\n#endif\nQByteArray header_SERPENT_32  = QString::fromUtf8(\"SERPENT/32:\").toLatin1();\n\nQByteArray header_CBC  = QString::fromUtf8(\"CBC:PADN::\").toLatin1();\nQByteArray header_CFB  = QString::fromUtf8(\"CFB::\").toLatin1();\n\n\n#ifdef WITH_SERPENT_FAST_SBOX\ninline quint32 serpent_sbox_fast(int sbox, quint32 X);\n#else\nvoid serpent_sbox_it(int sbox, quint32 &X1, quint32 &X2,\n                               quint32 &X3, quint32 &X4);\n#endif\n\n#ifdef WITHRC5\nAlgorithm Info::fastRC5() {\n    #if (QT_POINTER_SIZE==4)\n        return RC5_32_32_20;\n    #else\n        return RC5_64_32_20;\n    #endif\n}\n#endif\n\nQString Info::errorText(Error e) {\n    switch (e) {\n    case NoError:\n        return QStringLiteral(\"NoError\");\n    case ErrorNoAlgorithm:\n        return QStringLiteral(\"ErrorNoAlgorithm\");\n    case ErrorNoMode:\n        return QStringLiteral(\"ErrorNoMode\");\n    case ErrorInvalidKey:\n        return QStringLiteral(\"ErrorInvalidKey\");\n    case ErrorNotEnoughData:\n        return QStringLiteral(\"ErrorNotEnoughData\");\n    case ErrorModeNotImplemented:\n        return QStringLiteral(\"ErrorModeNotImplemented\");\n    case ErrorAlgorithmNotImplemented:\n        return QStringLiteral(\"ErrorAlgorithmNotImplemented\");\n    case ErrorChecksumNotImplemented:\n        return QStringLiteral(\"ErrorChecksumNotImplemented\");\n    case ErrorAlreadyError:\n        return QStringLiteral(\"ErrorAlreadyError\");\n    default:\n        return QStringLiteral(\"UnknownError\");\n    }\n    return QStringLiteral();\n}\n\n\nKey::Key() {\n#ifdef WITHRC5\n    s32 = 0;\n    s64 = 0;\n#endif\n    serpent = 0;\n}\n\nKey::Key(const QByteArray &k) {\n    key = k;\n#ifdef WITHRC5\n    s32 = 0;\n    s64 = 0;\n#endif\n    serpent = 0;\n}\n\nKey::Key(const QString &k) {\n    QCryptographicHash qch(QCryptographicHash::Sha1);\n    qch.addData(k.toUtf8());\n    key = qch.result();\n#ifdef WITHRC5\n    s32 = 0;\n    s64 = 0;\n#endif\n    serpent = 0;\n}\n\nKey::~Key() {\n#ifdef WITHRC5\n    delete[] s32;\n    delete[] s64;\n#endif\n    delete[] serpent;\n}\n\n\nQByteArray Key::resizeKey(int ks) {\n    QByteArray newKey(ks, 0);\n    unsigned char *ok = (unsigned char *)(key.data());\n    unsigned char *nk = (unsigned char *)(newKey.data());\n    for ( int i = 0 ; i < key.size() ; i++ ) {\n        nk[i%ks] ^= ok[i];\n    }\n    return newKey;\n}\n\n#ifdef WITHRC5\nvoid Key::expandKeyRc532() {\n    if (s32) return;\n    if ( KEYSIZE_RC5 != keyRc5.size() ) {\n        keyRc5 = resizeKey(KEYSIZE_RC5);\n    } \n    s32 = new quint32[SSIZE_RC5];\n    quint32 *s = s32;\n\n    unsigned char *k = (unsigned char *)(keyRc5.data());\n    quint32 L[5];\n    L[0] = qFromLittleEndian<quint32>(k);\n    L[1] = qFromLittleEndian<quint32>(k+4);\n    L[2] = qFromLittleEndian<quint32>(k+8);\n    L[3] = qFromLittleEndian<quint32>(k+12);\n    L[4] = qFromLittleEndian<quint32>(k+16);\n\n    s[0] = P32;\n    for ( int i = 1 ; i < SSIZE_RC5 ; i++ ) {\n        s[i] = s[i-1] + Q32;\n    }\n\n    int i=0 , j=0;\n    quint32 A=0 , B=0;\n\n    for ( int x = 0 ; x < ROUNDS ; x++ ) {\n        A = s[i] = ROTL32(s[i] + (A+B), 3);\n        B = L[j] = ROTL32(L[j] + (A+B), (A+B) & 31 );\n        i = (i + 1) % SSIZE_RC5;\n        j = (j + 1) % 5;\n    }\n}\n#endif\n\n#ifdef WITHRC5\nvoid Key::expandKeyRc564() {\n    if (s64) return;\n    if ( KEYSIZE_RC5 != keyRc5.size() ) {\n        keyRc5 = resizeKey(KEYSIZE_RC5);\n    } \n    s64 = new quint64[SSIZE_RC5];\n    quint64 *s = s64;\n\n    unsigned char *k = (unsigned char *)(keyRc5.data());\n    quint64 L[3];\n    L[0] = qFromLittleEndian<quint64>(k);\n    L[1] = qFromLittleEndian<quint64>(k+8);\n    L[2] = qFromLittleEndian<quint32>(k+16);\n\n    s[0] = P64;\n    for ( int i = 1 ; i < SSIZE_RC5 ; i++ ) {\n        s[i] = s[i-1] + Q64;\n    }\n\n    int i=0 , j=0;\n    quint64 A=0 , B=0;\n\n    for ( int x = 0 ; x < ROUNDS ; x++ ) {\n        A = s[i] = ROTL64(s[i] + (A+B), 3);\n        B = L[j] = ROTL64(L[j] + (A+B), (A+B) & 63 );\n        i = (i + 1) % SSIZE_RC5;\n        j = (j + 1) % 3;\n    }\n}\n#endif\n\n\nvoid Key::expandKeySerpent() {\n    quint32 i;\n    quint32 tmp;\n    quint32 *s;\n    if (serpent) return;\n    if ( KEYSIZE_SERPENT != keySerpent.size() ) {\n        keySerpent = resizeKey(KEYSIZE_SERPENT);\n    } \n    serpent = new quint32[SSIZE_SERPENT];\n    s = new quint32[SSIZE_SERPENT + 8];\n\n    unsigned char *k = (unsigned char *)(keySerpent.data());\n    for ( i=0 ; i<8 ; i++ ) {\n        s[i] = qFromLittleEndian<quint32>(k + 4*i);\n    }\n\n    for(i=8 ; i < SSIZE_SERPENT + 8 ; i++) {\n        tmp = ( s[i-8] ^ s[i-5] ^ s[i-3] ^ s[i-1] ^ Q32 ^ (i-8) );\n        serpent[i-8] = s[i] = ROTL32(tmp, 11);\n    }\n    for(i=0;i<33;i++) {\n#ifdef WITH_SERPENT_FAST_SBOX\n        tmp = (35-i) % 8;\n        for (int j=0;j<4;j++) {\n            serpent[4*i+j] = serpent_sbox_fast(tmp,serpent[4*i+j]);\n        }\n#else\n        serpent_sbox_it( (35-i)%8 , serpent[4*i  ], serpent[4*i+1],\n                                    serpent[4*i+2], serpent[4*i+3] );\n#endif\n    }\n\n    delete[] s;\n}\n\n\n/* *** ENCRYPTOR *** */\n\nEncryptor::Encryptor(QSharedPointer<Key> k, Algorithm a, Mode m, Checksum c) {\n    key = k;\n    algorithm = a;\n    mode = m;\n    checksum = c;\n#ifdef WITHRC5\n    if ( algorithm == RC5_FAST_32_20 ) {\n        algorithm = Info::fastRC5();\n    }\n#endif\n    state = StateReset;\n    modex = 0;\n}\n\nEncryptor::~Encryptor() {\n    delete modex;\n}\n\nError Encryptor::encrypt(const QByteArray &plain, QByteArray &cipher, bool end) {\n    QByteArray tmpIn;\n    switch ( state ) {\n    case StateReset:\n\n        switch ( algorithm ) {\n#ifdef WITHRC5\n        case RC5_32_32_20:\n            tmpIn.append(header_RC5_32_32_20);\n            break;\n        case RC5_64_32_20:\n            tmpIn.append(header_RC5_64_32_20);\n            break;\n#endif\n        case SERPENT_32:\n            tmpIn.append(header_SERPENT_32);\n            break;\n        case NoAlgorithm:\n        case DetectAlgorithm:\n#ifdef WITHRC5\n        case RC5_FAST_32_20:\n#endif\n            state = StateError;\n            return ErrorNoAlgorithm;\n        }\n\n        switch ( mode ) {\n        case ModeCBC:\n            tmpIn.append(header_CBC);\n            if ( 0 == modex) modex = new CBC(key,algorithm);\n            break;\n        case ModeCFB:\n            tmpIn.append(header_CFB);\n            if ( 0 == modex) modex = new CFB(key, algorithm);\n            break;\n        case NoMode:\n        case DetectMode:\n        default:\n            state = StateError;\n            return ErrorNoMode;\n        }\n\n        if ( checksum != NoChecksum ) {\n            state = StateError;\n            return ErrorChecksumNotImplemented;\n        }\n        // switch (checksum) HERE\n\n        state = StateOn;\n    case StateOn:\n        tmpIn.append(plain);\n        cipher = modex->encrypt(tmpIn, end);\n        break;\n    case StateError:\n    default:\n        return ErrorAlreadyError;\n    }\n    if (end) {\n        state = StateReset;\n    }\n\n    return NoError;\n}\n\n\n/* *** DECRYPTOR *** */\n\nDecryptor::Decryptor(QSharedPointer<Key> k, Algorithm a, Mode m) {\n    key = k;\n    algorithm = a;\n    mode = m;\n    state = StateReset;\n    checksum = NoChecksum;\n    modex = 0;\n}\n\nDecryptor::~Decryptor() {\n    delete modex;\n}\n\nChecksum Decryptor::getChecksumType() {\n    return checksum;\n}\n\nError Decryptor::decrypt(const QByteArray &cipher, QByteArray &plain, bool end) {\n    QByteArray expectHeader;\n    QByteArray remainingFromHeader;\n    QByteArray tmpIn;\n    QByteArray tmpOut;\n    int neededForHeader = -1;\n    int neededForIv = -1;\n\n    switch ( state ) {\n    case StateReset:\n        switch ( algorithm ) {\n#ifdef WITHRC5\n        case RC5_32_32_20:\n            expectHeader.append(header_RC5_32_32_20);\n            neededForIv = 8;\n            break;\n        case RC5_64_32_20:\n            expectHeader.append(header_RC5_64_32_20);\n            neededForIv = 16;\n            break;\n#endif\n        case SERPENT_32:\n            expectHeader.append(header_SERPENT_32);\n            neededForIv = 16;\n            break;\n        case NoAlgorithm:\n        case DetectAlgorithm:\n#ifdef WITHRC5\n        case RC5_FAST_32_20:\n#endif\n            state = StateError;\n            return ErrorNoAlgorithm;\n        }\n\n        switch ( mode ) {\n        case ModeCBC:\n            expectHeader.append(header_CBC);\n            neededForHeader = (((neededForIv + expectHeader.size() - 1) / neededForIv) + 1) * neededForIv;\n            if ( 0 == modex) modex = new CBC(key, algorithm);\n            break;\n        case ModeCFB:\n            expectHeader.append(header_CFB);\n            neededForHeader = neededForIv + expectHeader.size();\n            if ( 0 == modex) modex = new CFB(key, algorithm);\n            break;\n        case NoMode:\n        case DetectMode:\n        default:\n            state = StateError;\n            return ErrorNoMode;\n        }\n\n\n        if ( cipher.size() < neededForHeader ) {\n            state = StateError;\n            return ErrorNotEnoughData;\n        }\n\n        tmpOut = modex->decrypt(cipher.left(neededForHeader), false);\n\n        if ( tmpOut.startsWith(expectHeader) ) {\n            remainingFromHeader = tmpOut.right(tmpOut.size() - expectHeader.size());\n            tmpOut.clear();\n            tmpIn = cipher.right(cipher.size() - neededForHeader);\n            state = StateOn;\n        } else {\n            state = StateError;\n            tmpOut.clear();\n            return ErrorInvalidKey;\n        }\n\n    case StateOn:\n        if ( tmpIn.isEmpty() ) {\n            tmpIn = cipher;\n        }\n        tmpOut = modex->decrypt(tmpIn, end);\n        break;\n    case StateError:\n    default:\n        return ErrorAlreadyError;\n    }\n    if ( ! remainingFromHeader.isEmpty() ) {\n        tmpOut.prepend(remainingFromHeader);\n    }\n    if (end) {\n        state = StateReset;\n    }\n    plain = tmpOut;\n    return NoError;\n}\n\n\n/* *** DECRYPTOR WIZARD ENTRY *** */\n\nclass DecryptorWizardEntry {\npublic:\n    QSharedPointer<Key> key;\n    Algorithm alg;\n    Mode mode;\n    Checksum csum;\n};\n\n\n/* *** DECRYPTOR WIZARD *** */\n\nDecryptorWizard::DecryptorWizard() {\n}\n\nDecryptorWizard::DecryptorWizard(QSharedPointer<Key> k, Algorithm a, Mode m) {\n    addParameters(k, a, m);\n}\n\nDecryptorWizard::~DecryptorWizard() {\n    for ( int i=0 ; i < entries.size() ; i++ ) {\n        delete entries.at(i);\n    }\n}\n\nvoid DecryptorWizard::addParameters(QSharedPointer<Key> k, Algorithm a, Mode m) {\n    DecryptorWizardEntry *dwe = new DecryptorWizardEntry();\n    dwe->key = k;\n    dwe->alg = a;\n    dwe->mode = m;\n    entries.append(dwe);\n}\n\nError DecryptorWizard::decrypt(const QByteArray &cipher, QByteArray &plain, QSharedPointer<Decryptor> &decryptor, bool end) {\n#ifdef WITHRC5\n    Algorithm aList[3] = { RC5_32_32_20, RC5_64_32_20, SERPENT_32 };\n    int aL = 3;\n#else\n    Algorithm aList[1] = { SERPENT_32 };\n    int aL = 1;\n#endif\n    Mode mList[2] = { ModeCBC, ModeCFB };\n    int mL = 2;\n    int eL = entries.size();\n    int eI, aI, mI;\n    Decryptor *dx;\n    Error dxError;\n    Error retError = ErrorInvalidKey;\n\n    for (eI=0 ; eI<eL ; eI++) for (aI=0 ; aI<aL ; aI++) for (mI=0 ; mI<mL ; mI++) {\n        if ( (entries.at(eI)->alg != aList[aI]) && (entries.at(eI)->alg != DetectAlgorithm) ) continue;\n        if ( (entries.at(eI)->mode != mList[mI]) && (entries.at(eI)->mode != DetectMode) ) continue;\n        dx = new Decryptor(entries.at(eI)->key, aList[aI], mList[mI]);\n        dxError = dx->decrypt(cipher, plain, end);\n        switch (dxError) {\n        case NoError:\n            decryptor = QSharedPointer<Decryptor>(dx);\n            return NoError;\n        case ErrorNotEnoughData:\n            retError = ErrorNotEnoughData;\n            break;\n        case ErrorInvalidKey:\n            if ( ErrorNotEnoughData != retError ) {\n                retError = ErrorInvalidKey;\n            }\n            break;\n        default:\n            delete dx;\n            return dxError;\n        }\n        delete dx;\n    }\n    return retError;\n}\n\nError DecryptorWizard::decryptToEnd(const QByteArray &cipher, QByteArray &plain) {\n    QSharedPointer<Decryptor> qspd;\n    Error er = decrypt(cipher, plain, qspd, true);\n    return er;\n}\n\n\n/* *** INITIALIZATION VECTOR *** */\n\nQByteArray InitializationVector::getVector8() {\n    QByteArray ret(8, 0);\n    quint32 A = ((quint32)(rand())) ^ ((quint32)(QTime::currentTime().msecsTo(QTime(23,59,59,999))));\n    quint32 B = ((quint32)(rand())) ^ ((quint32)(QDate::currentDate().daysTo(QDate(2999,12,31))));\n    qToLittleEndian(A, (uchar *)(ret.data()));\n    qToLittleEndian(B, (uchar *)(ret.data() + 4));\n    ret[0] = ( (uchar)(ret[0]) | 128 );\n    return ret;\n}\n\nQByteArray InitializationVector::getVector16() {\n    QByteArray ret(16, 0);\n    quint32 A = ((quint32)(rand())) ^ ((quint32)(QTime::currentTime().msecsTo(QTime(23,59,59,999))));\n    quint32 B = ((quint32)(rand())) ^ ((quint32)(QDate::currentDate().daysTo(QDate(2999,12,31))));\n    quint32 C = (quint32)(rand());\n    quint32 D = (quint32)(rand());\n    qToLittleEndian(A, (uchar *)(ret.data()));\n    qToLittleEndian(B, (uchar *)(ret.data() + 4));\n    qToLittleEndian(C, (uchar *)(ret.data() + 8));\n    qToLittleEndian(D, (uchar *)(ret.data() + 12));\n    ret[0] = ( (uchar)(ret[0]) | 128 );\n    return ret;\n}\n\nvoid InitializationVector::initiate() {\n    srand((quint32)(QTime::currentTime().msecsTo(QTime(23,59,59,999))));\n}\n\n/* *** CBC *** */\n\nCBC::CBC(QSharedPointer<Key> k, Algorithm a) {\n    algorithm = a;\n    key = k;\n    reset();\n}\n\nCBC::~CBC() {\n}\n\nvoid CBC::reset() {\n    worksize = -1;\n    buffer.clear();\n    cbcBuffer.clear();\n    padHostageBuffer.clear();\n}\n\n/*\n *\n * PSEUDO\n *\n * documentation missing\n *\n */\nQByteArray CBC::encrypt(const QByteArray plain, bool end) {\n    int cipherpos = 0;\n    int padsize = -1;\n    bool iv = false;\n\n    // set initialization vector if first data\n    if ( -1 == worksize ) {\n        switch (algorithm) {\n#ifdef WITHRC5\n        case RC5_32_32_20:\n            cbcBuffer = InitializationVector::getVector8();\n            worksize = 8;\n            iv = true;\n            key->expandKeyRc532();\n            break;\n        case RC5_64_32_20:\n            cbcBuffer = InitializationVector::getVector16();\n            worksize = 16;\n            iv = true;\n            key->expandKeyRc564();\n            break;\n#endif\n        case SERPENT_32:\n            cbcBuffer = InitializationVector::getVector16();\n            worksize = 16;\n            iv = true;\n            key->expandKeySerpent();\n            break;\n        default:\n            buffer.clear();\n            return QByteArray();\n        }\n    }\n    buffer.append(plain);\n\n    int cipherlen = ( buffer.size() / worksize ) * worksize;\n    padsize = worksize - (buffer.size() - cipherlen);\n    if (iv) cipherlen += cbcBuffer.size();\n    if (end) cipherlen += worksize;\n\n    QByteArray cipher = QByteArray(cipherlen, 0);\n\n    if (end) {\n        buffer.append(QByteArray(padsize, (char)padsize));\n    }\n\n    if ( iv ) while (cipherpos < worksize) {\n        cipher[cipherpos] = cbcBuffer[cipherpos];\n        cipherpos++;\n    }\n\n    uchar *bufdat = (uchar *)buffer.data();\n    uchar *cipdat = (uchar *)cipher.data();\n    uchar *cbcdat = (uchar *)cbcBuffer.data();\n    int bufpos = 0;\n\n    switch (algorithm) {\n#ifdef WITHRC5\n    case RC5_32_32_20:\n        {\n            quint32 cbc1 = qFromLittleEndian<quint32>(cbcdat);\n            quint32 cbc2 = qFromLittleEndian<quint32>(cbcdat + 4);\n            quint32 buf1;\n            quint32 buf2;\n\n            while ( cipherpos < cipherlen ) {\n                buf1 = qFromLittleEndian<quint32>(bufdat + bufpos);\n                buf2 = qFromLittleEndian<quint32>(bufdat + bufpos + 4);\n                cbc1 ^= buf1;\n                cbc2 ^= buf2;\n                rc5_32_encrypt_2w(cbc1, cbc2, key->s32);\n                qToLittleEndian(cbc1, cipdat + cipherpos);\n                qToLittleEndian(cbc2, cipdat + cipherpos + 4);\n\n                cipherpos += worksize;\n                bufpos += worksize;\n            }\n\n            qToLittleEndian(cbc1, cbcdat);\n            qToLittleEndian(cbc2, cbcdat + 4);\n        }\n        break;\n    case RC5_64_32_20:\n        {\n            quint64 cbc1 = qFromLittleEndian<quint64>(cbcdat);\n            quint64 cbc2 = qFromLittleEndian<quint64>(cbcdat + 8);\n            quint64 buf1;\n            quint64 buf2;\n\n            while ( cipherpos < cipherlen ) {\n                buf1 = qFromLittleEndian<quint64>(bufdat + bufpos);\n                buf2 = qFromLittleEndian<quint64>(bufdat + bufpos + 8);\n                cbc1 ^= buf1;\n                cbc2 ^= buf2;\n                rc5_64_encrypt_2w(cbc1, cbc2, key->s64);\n                qToLittleEndian(cbc1, cipdat + cipherpos);\n                qToLittleEndian(cbc2, cipdat + cipherpos + 8);\n\n                cipherpos += worksize;\n                bufpos += worksize;\n            }\n\n            qToLittleEndian(cbc1, cbcdat);\n            qToLittleEndian(cbc2, cbcdat + 8);\n        }\n        break;\n#endif\n    case SERPENT_32:\n        {\n            quint32 cbc1 = qFromLittleEndian<quint32>(cbcdat);\n            quint32 cbc2 = qFromLittleEndian<quint32>(cbcdat + 4);\n            quint32 cbc3 = qFromLittleEndian<quint32>(cbcdat + 8);\n            quint32 cbc4 = qFromLittleEndian<quint32>(cbcdat + 12);\n            quint32 buf1;\n            quint32 buf2;\n            quint32 buf3;\n            quint32 buf4;\n\n            while ( cipherpos < cipherlen ) {\n                buf1 = qFromLittleEndian<quint64>(bufdat + bufpos);\n                buf2 = qFromLittleEndian<quint64>(bufdat + bufpos + 4);\n                buf3 = qFromLittleEndian<quint64>(bufdat + bufpos + 8);\n                buf4 = qFromLittleEndian<quint64>(bufdat + bufpos + 12);\n                cbc1 ^= buf1;\n                cbc2 ^= buf2;\n                cbc3 ^= buf3;\n                cbc4 ^= buf4;\n                serpent_encrypt_4w(cbc1, cbc2, cbc3, cbc4, key->serpent);\n                qToLittleEndian(cbc1, cipdat + cipherpos);\n                qToLittleEndian(cbc2, cipdat + cipherpos + 4);\n                qToLittleEndian(cbc3, cipdat + cipherpos + 8);\n                qToLittleEndian(cbc4, cipdat + cipherpos + 12);\n\n                cipherpos += worksize;\n                bufpos += worksize;\n            }\n\n            qToLittleEndian(cbc1, cbcdat);\n            qToLittleEndian(cbc2, cbcdat + 4);\n            qToLittleEndian(cbc3, cbcdat + 8);\n            qToLittleEndian(cbc4, cbcdat + 12);\n        }\n\tbreak;\n    default:\n        cipher.clear();\n        return cipher;\n    }\n\n    if (end) {\n        reset();\n    } else {\n        buffer = buffer.right( buffer.size() - bufpos );\n    }\n    return cipher;\n}\n\nQByteArray CBC::decrypt(const QByteArray cipher, bool end) {\n    int bufferpos = 0;\n    int plainpos = 0;\n\n    buffer.append(cipher);\n    if ( -1 == worksize ) {\n        switch (algorithm) {\n#ifdef WITHRC5\n        case RC5_32_32_20:\n            if ( buffer.size() < 8 ) return QByteArray();\n            cbcBuffer = buffer.left(8);\n            worksize = 8;\n            bufferpos = 8;\n            key->expandKeyRc532();\n            break;\n        case RC5_64_32_20:\n            if ( buffer.size() < 16 ) return QByteArray();\n            cbcBuffer = buffer.left(16);\n            worksize = 16;\n            bufferpos = 16;\n            key->expandKeyRc564();\n            break;\n#endif\n        case SERPENT_32:\n            if ( buffer.size() < 16 ) return QByteArray();\n            cbcBuffer = buffer.left(16);\n            worksize = 16;\n            bufferpos = 16;\n            key->expandKeySerpent();\n            break;\n        default:\n            buffer.clear();\n            return QByteArray();\n        }\n    }\n\n    int plainlen = ( (buffer.size() - bufferpos) / worksize ) * worksize + padHostageBuffer.size();\n    QByteArray plain(plainlen, 0);\n    while (plainpos < padHostageBuffer.size()) {\n        plain[plainpos] = padHostageBuffer[plainpos];\n        plainpos++;\n    }\n    padHostageBuffer.clear();\n\n    uchar *bufdat = (uchar *)buffer.data();\n    uchar *plndat = (uchar *)plain.data();\n    uchar *cbcdat = (uchar *)cbcBuffer.data();\n\n    switch (algorithm) {\n#ifdef WITHRC5\n    case RC5_32_32_20:\n        {\n            quint32 cbc1 = qFromLittleEndian<quint32>(cbcdat);\n            quint32 cbc2 = qFromLittleEndian<quint32>(cbcdat + 4);\n            quint32 buf1;\n            quint32 buf2;\n            quint32 pln1;\n            quint32 pln2;\n            while ( plainpos < plainlen ) {\n                pln1 = buf1 = qFromLittleEndian<quint32>(bufdat + bufferpos);\n                pln2 = buf2 = qFromLittleEndian<quint32>(bufdat + bufferpos + 4);\n                rc5_32_decrypt_2w(pln1,pln2,key->s32);\n                qToLittleEndian( (pln1 ^ cbc1) , plndat + plainpos);\n                qToLittleEndian( (pln2 ^ cbc2) , plndat + plainpos + 4);\n                cbc1 = buf1;\n                cbc2 = buf2;\n\n                plainpos += worksize;\n                bufferpos += worksize;\n            }\n            qToLittleEndian(cbc1, cbcdat);\n            qToLittleEndian(cbc2, cbcdat + 4);\n        }\n        break;\n    case RC5_64_32_20:\n        {\n            quint64 cbc1 = qFromLittleEndian<quint64>(cbcdat);\n            quint64 cbc2 = qFromLittleEndian<quint64>(cbcdat + 8);\n            quint64 buf1;\n            quint64 buf2;\n            quint64 pln1;\n            quint64 pln2;\n            while ( plainpos < plainlen ) {\n                pln1 = buf1 = qFromLittleEndian<quint64>(bufdat + bufferpos);\n                pln2 = buf2 = qFromLittleEndian<quint64>(bufdat + bufferpos + 8);\n                rc5_64_decrypt_2w(pln1,pln2,key->s64);\n                qToLittleEndian( (pln1 ^ cbc1) , plndat + plainpos);\n                qToLittleEndian( (pln2 ^ cbc2) , plndat + plainpos + 8);\n                cbc1 = buf1;\n                cbc2 = buf2;\n\n                plainpos += worksize;\n                bufferpos += worksize;\n            }\n            qToLittleEndian(cbc1, cbcdat);\n            qToLittleEndian(cbc2, cbcdat + 8);\n        }\n        break;\n#endif\n    case SERPENT_32:\n        {\n            quint32 cbc1 = qFromLittleEndian<quint32>(cbcdat);\n            quint32 cbc2 = qFromLittleEndian<quint32>(cbcdat + 4);\n            quint32 cbc3 = qFromLittleEndian<quint32>(cbcdat + 8);\n            quint32 cbc4 = qFromLittleEndian<quint32>(cbcdat + 12);\n            quint32 buf1;\n            quint32 buf2;\n            quint32 buf3;\n            quint32 buf4;\n            quint32 pln1;\n            quint32 pln2;\n            quint32 pln3;\n            quint32 pln4;\n            while ( plainpos < plainlen ) {\n                pln1 = buf1 = qFromLittleEndian<quint32>(bufdat+bufferpos);\n                pln2 = buf2 = qFromLittleEndian<quint32>(bufdat+bufferpos + 4);\n                pln3 = buf3 = qFromLittleEndian<quint32>(bufdat+bufferpos + 8);\n                pln4 = buf4 = qFromLittleEndian<quint32>(bufdat+bufferpos + 12);\n                serpent_decrypt_4w(pln1,pln2,pln3,pln4,key->serpent);\n                qToLittleEndian( (pln1 ^ cbc1) , plndat + plainpos);\n                qToLittleEndian( (pln2 ^ cbc2) , plndat + plainpos + 4);\n                qToLittleEndian( (pln3 ^ cbc3) , plndat + plainpos + 8);\n                qToLittleEndian( (pln4 ^ cbc4) , plndat + plainpos + 12);\n                cbc1 = buf1;\n                cbc2 = buf2;\n                cbc3 = buf3;\n                cbc4 = buf4;\n\n                plainpos += worksize;\n                bufferpos += worksize;\n            }\n            qToLittleEndian(cbc1, cbcdat);\n            qToLittleEndian(cbc2, cbcdat + 4);\n            qToLittleEndian(cbc3, cbcdat + 8);\n            qToLittleEndian(cbc4, cbcdat + 12);\n        }\n        break;\n    default:\n        plain.clear();\n        return plain;\n    }\n\n    if (end) {\n        // in case we dont have any valid padding, the only explanation\n        // is a transmission error, or someone modified the file\n        // however, this is not the layer where to discover such problems\n        // and I have nowhere to report a problem, so I just need\n        // to avoid crashing\n        int padc = 0;\n        if ( ! plain.isEmpty() ) {\n            padc = (int)plain[plainlen - 1];\n            if ( padc > plain.size() ) {\n                padc = 0;\n            }\n        }\n        if ( 0 < padc && padc <= 16 ) {\n            plain = plain.left(plainlen - padc);\n        }\n        reset();\n    } else {\n        buffer = buffer.right(buffer.size() - bufferpos);\n\n        // there is a chance, that we will not get more data,\n        // but end=false anyways. in this case, we must not\n        // return possible pad data as plain text\n        if ( buffer.size() == 0 && plainlen > 0 ) {\n            uchar lastByte = plain[plainlen - 1];\n            if ( 0 < lastByte && lastByte <= 16 ) {\n                QByteArray padPattern((int)lastByte,(char)lastByte);\n                if (plain.endsWith(padPattern)) {\n                    padHostageBuffer = plain.right(worksize);\n                    plain = plain.left(plainlen - worksize);\n                    plainlen -= worksize;\n                }\n            }\n        }\n    }\n\n    return plain;\n}\n\n\n/* *** CFB *** */\n\nCFB::CFB(QSharedPointer<Key> k, Algorithm a) {\n    algorithm = a;\n    key = k;\n    reset();\n}\n\nCFB::~CFB() {\n}\n\nvoid CFB::reset() {\n    bufferpos = -1;\n    buffer.clear();\n}\n\n\n/*\n * PSEUDO:\n *\n * if first: make IV, put in buffer\n *\n * if unused bytes in buffer\n *   cipher = buffer XOR plain\n *   buffer = cipher\n *\n * while ( more to encrypt )\n *   encrypt buffer\n *   cipher = buffer XOR plain\n *   buffer = cipher\n *\n *\n */\nQByteArray CFB::encrypt(const QByteArray plain, bool end) {\n    int plainpos = 0;\n    int plainlen = plain.size();\n    int cipherpos = 0;\n    int bufferlen = buffer.size();\n    int copysize = 0;\n    QByteArray cipher(plainlen, 0);\n    uchar *bufdat = 0;\n\n    // set initialization vector if first data\n    if ( -1 == bufferpos ) {\n        switch (algorithm) {\n#ifdef WITHRC5\n        case RC5_32_32_20:\n            buffer = InitializationVector::getVector8();\n            key->expandKeyRc532();\n            bufferlen = 8;\n            break;\n        case RC5_64_32_20:\n            buffer = InitializationVector::getVector16();\n            key->expandKeyRc564();\n            bufferlen = 16;\n            break;\n#endif\n        case SERPENT_32:\n            buffer = InitializationVector::getVector16();\n            key->expandKeySerpent();\n            bufferlen = 16;\n            break;\n        default:\n            buffer.clear();\n            return QByteArray();\n        }\n        cipher.prepend(buffer);\n        bufferpos = bufferlen;\n        cipherpos += bufferlen;\n    }\n\n    bufdat = (uchar *)(buffer.data());\n\n    uchar *cphdat = (uchar *)cipher.data();\n    uchar *plndat = (uchar *)plain.data();\n\n    copysize = qMin( bufferlen - bufferpos , plainlen - plainpos );\n    // in case the buffer contains unused data from last encrypt,\n    // use those bytes first\n    while ( 0 < copysize ) {\n        bufdat[bufferpos] = plndat[plainpos] ^ bufdat[bufferpos];\n        cphdat[cipherpos] = bufdat[bufferpos];\n        cipherpos++;\n        plainpos++;\n        bufferpos++;\n        copysize--;\n    }\n\n    copysize = qMin( bufferlen , plainlen - plainpos );\n\n    if ( bufferlen == copysize ) {\n        switch (algorithm) {\n#ifdef WITHRC5\n        case RC5_32_32_20:\n            {\n            quint32 B1 = qFromLittleEndian<quint32>(bufdat);\n            quint32 B2 = qFromLittleEndian<quint32>(bufdat + 4);\n            quint32 P1 = 0;\n            quint32 P2 = 0;\n\n            do {\n                rc5_32_encrypt_2w(B1,B2,key->s32);\n                P1 = qFromLittleEndian<quint32>(plndat + plainpos);\n                P2 = qFromLittleEndian<quint32>(plndat + plainpos + 4);\n                B1 ^= P1;\n                B2 ^= P2;\n                qToLittleEndian(B1, cphdat + cipherpos);\n                qToLittleEndian(B2, cphdat + cipherpos + 4);\n                cipherpos += copysize;\n                plainpos += copysize;\n                copysize = qMin( bufferlen , plainlen - plainpos );\n            } while ( bufferlen == copysize );\n            qToLittleEndian(B1, bufdat);\n            qToLittleEndian(B2, bufdat + 4);\n            }\n            break;\n        case RC5_64_32_20:\n            {\n            quint64 B1 = qFromLittleEndian<quint64>(bufdat);\n            quint64 B2 = qFromLittleEndian<quint64>(bufdat + 8);\n            quint64 P1 = 0;\n            quint64 P2 = 0;\n\n            do {\n                rc5_64_encrypt_2w(B1,B2,key->s64);\n                P1 = qFromLittleEndian<quint64>(plndat + plainpos);\n                P2 = qFromLittleEndian<quint64>(plndat + plainpos + 8);\n                B1 ^= P1;\n                B2 ^= P2;\n                qToLittleEndian(B1, cphdat + cipherpos);\n                qToLittleEndian(B2, cphdat + cipherpos + 8);\n                cipherpos += copysize;\n                plainpos += copysize;\n                copysize = qMin( bufferlen , plainlen - plainpos );\n            } while ( bufferlen == copysize );\n            qToLittleEndian(B1, bufdat);\n            qToLittleEndian(B2, bufdat + 8);\n            }\n            break;\n#endif\n        case SERPENT_32:\n            {\n            quint32 B1 = qFromLittleEndian<quint64>(bufdat);\n            quint32 B2 = qFromLittleEndian<quint64>(bufdat + 4);\n            quint32 B3 = qFromLittleEndian<quint64>(bufdat + 8);\n            quint32 B4 = qFromLittleEndian<quint64>(bufdat + 12);\n            quint32 P1 = 0;\n            quint32 P2 = 0;\n            quint32 P3 = 0;\n            quint32 P4 = 0;\n\n            do {\n                serpent_encrypt_4w(B1,B2,B3,B4,key->serpent);\n                P1 = qFromLittleEndian<quint32>(plndat + plainpos);\n                P2 = qFromLittleEndian<quint32>(plndat + plainpos + 4);\n                P3 = qFromLittleEndian<quint32>(plndat + plainpos + 8);\n                P4 = qFromLittleEndian<quint32>(plndat + plainpos + 12);\n                B1 ^= P1;\n                B2 ^= P2;\n                B3 ^= P3;\n                B4 ^= P4;\n                qToLittleEndian(B1, cphdat + cipherpos);\n                qToLittleEndian(B2, cphdat + cipherpos + 4);\n                qToLittleEndian(B3, cphdat + cipherpos + 8);\n                qToLittleEndian(B4, cphdat + cipherpos + 12);\n                cipherpos += copysize;\n                plainpos += copysize;\n                copysize = qMin( bufferlen , plainlen - plainpos );\n            } while ( bufferlen == copysize );\n            qToLittleEndian(B1, bufdat);\n            qToLittleEndian(B2, bufdat + 4);\n            qToLittleEndian(B3, bufdat + 8);\n            qToLittleEndian(B4, bufdat + 12);\n            }\n            break;\n        default:\n            cipher.clear();\n            return cipher;\n        }\n        bufferpos = bufferlen;\n    }\n\n    while ( 0 < copysize ) {\n        switch (algorithm) {\n#ifdef WITHRC5\n        case RC5_32_32_20:\n            {\n            quint32 X32_1 = qFromLittleEndian<quint32>(bufdat);\n            quint32 X32_2 = qFromLittleEndian<quint32>(bufdat + 4);\n            rc5_32_encrypt_2w(X32_1,X32_2,key->s32);\n            qToLittleEndian(X32_1, bufdat);\n            qToLittleEndian(X32_2, bufdat + 4);\n            }\n            break;\n        case RC5_64_32_20:\n            {\n            quint64 X64_1 = qFromLittleEndian<quint64>(bufdat);\n            quint64 X64_2 = qFromLittleEndian<quint64>(bufdat + 8);\n            rc5_64_encrypt_2w(X64_1,X64_2,key->s64);\n            qToLittleEndian(X64_1, bufdat);\n            qToLittleEndian(X64_2, bufdat + 8);\n            }\n            break;\n#endif\n        case SERPENT_32:\n            {\n            quint32 X32_1 = qFromLittleEndian<quint32>(bufdat);\n            quint32 X32_2 = qFromLittleEndian<quint32>(bufdat + 4);\n            quint32 X32_3 = qFromLittleEndian<quint32>(bufdat + 8);\n            quint32 X32_4 = qFromLittleEndian<quint32>(bufdat + 12);\n            serpent_encrypt_4w(X32_1,X32_2,X32_3,X32_4,key->serpent);\n            qToLittleEndian(X32_1, bufdat);\n            qToLittleEndian(X32_2, bufdat + 4);\n            qToLittleEndian(X32_3, bufdat + 8);\n            qToLittleEndian(X32_4, bufdat + 12);\n            }\n            break;\n        default:\n            cipher.clear();\n            return cipher;\n        }\n        bufferpos = 0;\n\n        while ( 0 < copysize ) {\n            bufdat[bufferpos] = plndat[plainpos] ^ bufdat[bufferpos];\n            cphdat[cipherpos] = bufdat[bufferpos];\n            cipherpos++;\n            plainpos++;\n            bufferpos++;\n            copysize--;\n        }\n        copysize = qMin( bufferlen , plainlen - plainpos );\n    }    \n    if (end) {\n        reset();\n    }\n    return cipher;\n}\n\n\n\n/*\n * PSEUDO\n *\n * if buffer not full-size\n *   copy cipher (IV) into buffer\n *\n * if unused buffer available\n *   plain = cipher XOR buffer\n *   buffer = cipher\n *\n * while ( more to decrypt )\n *   encrypt buffer\n *   plain = cipher XOR buffer\n *   buffer = cipher\n *\n */\nQByteArray CFB::decrypt(const QByteArray cipher, bool end) {\n    int cipherpos = 0;\n    int cipherlen = cipher.size();\n    int bufferlen = -1;\n    int copysize = 0;\n    int plainpos = 0;\n    uchar *bufdat = 0;\n    uchar *cphdat = 0;\n    uchar *plndat = 0;\n\n    // as long as bufferpos == -1, the initialization vector\n    // has not yet been loaded\n    if ( -1 == bufferpos ) {\n        switch (algorithm) {\n#ifdef WITHRC5\n        case RC5_32_32_20:\n            key->expandKeyRc532();\n            bufferlen = 8;\n            break;\n        case RC5_64_32_20:\n            key->expandKeyRc564();\n            bufferlen = 16;\n            break;\n#endif\n        case SERPENT_32:\n            key->expandKeySerpent();\n            bufferlen = 16;\n            break;\n        default:\n            return QByteArray();\n        }\n        copysize = qMin ( bufferlen - buffer.size() , cipherlen );\n        buffer.append(cipher.left(copysize));\n        cipherpos = copysize;\n        if ( bufferlen == buffer.size() ) {\n            bufferpos = bufferlen;\n        } else {\n            return QByteArray();\n        }\n    } else {\n        bufferlen = buffer.size();\n    }\n\n    QByteArray plain(cipherlen - cipherpos, 0);\n\n    bufdat = (uchar *)(buffer.data());\n    cphdat = (uchar *)(cipher.data());\n    plndat = (uchar *)(plain.data());\n\n    copysize = qMin( bufferlen - bufferpos , cipherlen - cipherpos );\n    while ( 0 < copysize ) {\n        plndat[plainpos] = buffer[bufferpos] ^ cphdat[cipherpos];\n        buffer[bufferpos] = cphdat[cipherpos];\n        plainpos++;\n        cipherpos++;\n        bufferpos++;\n        copysize--;\n    }\n\n    copysize = qMin( bufferlen , cipherlen - cipherpos );\n\n    if ( bufferlen == copysize ) {\n        switch (algorithm) {\n#ifdef WITHRC5\n        case RC5_32_32_20:\n            {\n                quint32 B1 = qFromLittleEndian<quint32>(bufdat);\n                quint32 B2 = qFromLittleEndian<quint32>(bufdat + 4);\n                quint32 C1 = 0;\n                quint32 C2 = 0;\n\n                do {\n                    rc5_32_encrypt_2w(B1,B2,key->s32);\n                    C1 = qFromLittleEndian<quint32>(cphdat + cipherpos);\n                    C2 = qFromLittleEndian<quint32>(cphdat + cipherpos + 4);\n                    B1 ^= C1;\n                    B2 ^= C2;\n                    qToLittleEndian(B1, plndat + plainpos);\n                    qToLittleEndian(B2, plndat + plainpos + 4);\n                    B1 = C1;\n                    B2 = C2;\n                    cipherpos += copysize;\n                    plainpos += copysize;\n                    copysize = qMin( bufferlen , cipherlen - cipherpos );\n                } while ( bufferlen == copysize );\n                qToLittleEndian(B1, bufdat);\n                qToLittleEndian(B2, bufdat + 4);\n            }\n            break;\n        case RC5_64_32_20:\n            {\n                quint64 B1 = qFromLittleEndian<quint64>(bufdat);\n                quint64 B2 = qFromLittleEndian<quint64>(bufdat + 8);\n                quint64 C1 = 0;\n                quint64 C2 = 0;\n\n                do {\n                    rc5_64_encrypt_2w(B1,B2,key->s64);\n                    C1 = qFromLittleEndian<quint64>(cphdat + cipherpos);\n                    C2 = qFromLittleEndian<quint64>(cphdat + cipherpos + 8);\n                    B1 ^= C1;\n                    B2 ^= C2;\n                    qToLittleEndian(B1, plndat + plainpos);\n                    qToLittleEndian(B2, plndat + plainpos + 8);\n                    B1 = C1;\n                    B2 = C2;\n                    cipherpos += copysize;\n                    plainpos += copysize;\n                    copysize = qMin( bufferlen , cipherlen - cipherpos );\n                } while ( bufferlen == copysize );\n                qToLittleEndian(B1, bufdat);\n                qToLittleEndian(B2, bufdat + 8);\n            }\n            break;\n#endif\n        case SERPENT_32:\n            {\n                quint32 B1 = qFromLittleEndian<quint32>(bufdat);\n                quint32 B2 = qFromLittleEndian<quint32>(bufdat + 4);\n                quint32 B3 = qFromLittleEndian<quint32>(bufdat + 8);\n                quint32 B4 = qFromLittleEndian<quint32>(bufdat + 12);\n                quint32 C1 = 0;\n                quint32 C2 = 0;\n                quint32 C3 = 0;\n                quint32 C4 = 0;\n\n                do {\n                    serpent_encrypt_4w(B1,B2,B3,B4,key->serpent);\n                    C1 = qFromLittleEndian<quint32>(cphdat + cipherpos);\n                    C2 = qFromLittleEndian<quint32>(cphdat + cipherpos + 4);\n                    C3 = qFromLittleEndian<quint32>(cphdat + cipherpos + 8);\n                    C4 = qFromLittleEndian<quint32>(cphdat + cipherpos + 12);\n                    B1 ^= C1;\n                    B2 ^= C2;\n                    B3 ^= C3;\n                    B4 ^= C4;\n                    qToLittleEndian(B1, plndat + plainpos);\n                    qToLittleEndian(B2, plndat + plainpos + 4);\n                    qToLittleEndian(B3, plndat + plainpos + 8);\n                    qToLittleEndian(B4, plndat + plainpos + 12);\n                    B1 = C1;\n                    B2 = C2;\n                    B3 = C3;\n                    B4 = C4;\n                    cipherpos += copysize;\n                    plainpos += copysize;\n                    copysize = qMin( bufferlen , cipherlen - cipherpos );\n                } while ( bufferlen == copysize );\n                qToLittleEndian(B1, bufdat);\n                qToLittleEndian(B2, bufdat + 4);\n                qToLittleEndian(B3, bufdat + 8);\n                qToLittleEndian(B4, bufdat + 12);\n            }\n            break;\n        default:\n            plain.clear();\n            return plain;\n        }\n        bufferpos = bufferlen;\n    }\n\n    while ( 0 < copysize ) {\n        switch (algorithm) {\n#ifdef WITHRC5\n        case RC5_32_32_20:\n            {\n            quint32 X32_1 = qFromLittleEndian<quint32>(bufdat);\n            quint32 X32_2 = qFromLittleEndian<quint32>(bufdat + 4);\n            rc5_32_encrypt_2w(X32_1,X32_2,key->s32);\n            qToLittleEndian(X32_1, bufdat);\n            qToLittleEndian(X32_2, bufdat + 4);\n            }\n            break;\n        case RC5_64_32_20:\n            {\n            quint64 X64_1 = qFromLittleEndian<quint64>(bufdat);\n            quint64 X64_2 = qFromLittleEndian<quint64>(bufdat + 8);\n            rc5_64_encrypt_2w(X64_1,X64_2,key->s64);\n            qToLittleEndian(X64_1, bufdat);\n            qToLittleEndian(X64_2, bufdat + 8);\n            }\n            break;\n#endif\n        case SERPENT_32:\n            {\n            quint32 X32_1 = qFromLittleEndian<quint32>(bufdat);\n            quint32 X32_2 = qFromLittleEndian<quint32>(bufdat + 4);\n            quint32 X32_3 = qFromLittleEndian<quint32>(bufdat + 8);\n            quint32 X32_4 = qFromLittleEndian<quint32>(bufdat + 12);\n            serpent_encrypt_4w(X32_1,X32_2,X32_3,X32_4,key->serpent);\n            qToLittleEndian(X32_1, bufdat);\n            qToLittleEndian(X32_2, bufdat + 4);\n            qToLittleEndian(X32_3, bufdat + 8);\n            qToLittleEndian(X32_4, bufdat + 12);\n            }\n            break;\n        default:\n            plain.clear();\n            return plain;\n        }\n        bufferpos = 0;\n\n        while ( 0 < copysize ) {\n            plndat[plainpos] = buffer[bufferpos] ^ cphdat[cipherpos];\n            buffer[bufferpos] = cphdat[cipherpos];\n            plainpos++;\n            cipherpos++;\n            bufferpos++;\n            copysize--;\n        }\n\n        copysize = qMin( bufferlen , cipherlen - cipherpos );\n    }\n    if (end) {\n        reset();\n    }\n    return plain;\n}\n\n\n#ifdef WITHRC5\nvoid rc5_32_encrypt_2w(quint32 &X1, quint32 &X2, const quint32 *s) {\n    quint32 x1 = X1 + s[0];\n    quint32 x2 = X2 + s[1];\n    int r;\n    for ( int i = 1 ; i <= ROUNDS ; i++ ) {\n        r = x2 & 31;\n        x1 ^= x2;\n        x1 = ROTL32(x1,r);\n        x1 += s[2*i];\n\n        r = x1 & 31;\n        x2 ^= x1;\n        x2 = ROTL32(x2,r);\n        x2 += s[2*i + 1];\n    }\n    X1 = x1;\n    X2 = x2;\n}\n\nvoid rc5_64_encrypt_2w(quint64 &X1, quint64 &X2, const quint64 *s) {\n    quint64 x1 = X1 + s[0];\n    quint64 x2 = X2 + s[1];\n    int r;\n    for ( int i = 1 ; i <= ROUNDS ; i++ ) {\n        r = x2 & 63;\n        x1 ^= x2;\n        x1 = ROTL64(x1,r) + s[2*i];\n\n        r = x1 & 63;\n        x2 ^= x1;\n        x2 = ROTL64(x2,r) + s[2*i + 1];\n    }\n    X1 = x1;\n    X2 = x2;\n}\n\nvoid rc5_32_decrypt_2w(quint32 &X1, quint32 &X2, const quint32 *s) {\n    quint32 x1 = X1;\n    quint32 x2 = X2;\n    int r;\n    for ( int i = ROUNDS ; i > 0 ; i-- ) {\n        r = x1 & 31;\n        x2 -= s[2*i+1];\n        x2 = ROTR32(x2,r);\n        x2 ^= x1;\n\n        r = x2 & 31;\n        x1 -= s[2*i];\n        x1 = ROTR32(x1,r);\n        x1 ^= x2;\n    }\n    x2 -= s[1];\n    x1 -= s[0];\n    X2 = x2;\n    X1 = x1;\n}\n\nvoid rc5_64_decrypt_2w(quint64 &X1, quint64 &X2, const quint64 *s) {\n    quint64 x1 = X1;\n    quint64 x2 = X2;\n    int r;\n    for ( int i = ROUNDS ; i > 0 ; i-- ) {\n        r = x1 & 63;\n        x2 -= s[2*i+1];\n        x2 = ROTR64(x2,r) ^ x1;\n\n        r = x2 & 63;\n        x1 -= s[2*i];\n        x1 = ROTR64(x1,r) ^ x2;\n    }\n    x2 -= s[1];\n    x1 -= s[0];\n    X2 = x2;\n    X1 = x1;\n}\n\n\n\nvoid rc5_32_encrypt_8b(const uchar *plain8, uchar *cipher8, const quint32 *s) {\n    quint32 X1 = qFromLittleEndian<quint32>(plain8);\n    quint32 X2 = qFromLittleEndian<quint32>(plain8 + 4);\n    rc5_32_encrypt_2w(X1, X2, s);\n    qToLittleEndian(X1, cipher8);\n    qToLittleEndian(X2, cipher8 + 4);\n}\n\nvoid rc5_64_encrypt_16b(const uchar *plain16, uchar *cipher16, const quint64 *s) {\n    quint64 X1 = qFromLittleEndian<quint64>(plain16);\n    quint64 X2 = qFromLittleEndian<quint64>(plain16 + 8);\n    rc5_64_encrypt_2w(X1, X2, s);\n    qToLittleEndian(X1, cipher16);\n    qToLittleEndian(X2, cipher16 + 8);\n}\n\nvoid rc5_32_decrypt_8b(const uchar *cipher8, uchar *plain8, const quint32 *s) {\n    quint32 X1 = qFromLittleEndian<quint32>(cipher8);\n    quint32 X2 = qFromLittleEndian<quint32>(cipher8 + 4);\n    rc5_32_decrypt_2w(X1, X2, s);\n    qToLittleEndian(X1, plain8);\n    qToLittleEndian(X2, plain8 + 4);\n}\n\nvoid rc5_64_decrypt_16b(const uchar *cipher16, uchar *plain16, const quint64 *s) {\n    quint64 X1 = qFromLittleEndian<quint64>(cipher16);\n    quint64 X2 = qFromLittleEndian<quint64>(cipher16 + 8);\n    rc5_64_decrypt_2w(X1, X2, s);\n    qToLittleEndian(X1, plain16);\n    qToLittleEndian(X2, plain16 + 8);\n}\n\n#endif // WITHRC5\n\n\n/* SERPENT BELOW */\n\n\n#ifdef WITH_SERPENT_FAST_SBOX\n\nquint32 serpent_sbox_fast(int sbox, quint32 X) {\n    int sbox512 = sbox * 512;\n    quint16 Y = 0;\n    quint32 R = 0;\n\n    Y  = serpent_sbox_fast_data[ sbox512 + ( 0xff & X ) + 256 ];\n    X >>= 8;\n    Y += serpent_sbox_fast_data[ sbox512 + ( 0xff & X ) ];\n    X >>= 8;\n\n    R = Y;\n    Y  = serpent_sbox_fast_data[ sbox512 + ( 0xff & X ) + 256 ];\n    X >>= 8;\n    Y += serpent_sbox_fast_data[ sbox512 + ( 0xff & X ) ];\n\n    R += ( Y << 16 );\n\n    return R;\n}\n\n#else\n\nconst quint8 serpent_sboxes[256] = {\n  //sbox [0-7]\n  //      0   1   2   3   4   5   6   7   8   9   a   b   c   d   e   f\n\t0x3,0x8,0xf,0x1,0xa,0x6,0x5,0xb,0xe,0xd,0x4,0x2,0x7,0x0,0x9,0xc,\n\t0xf,0xc,0x2,0x7,0x9,0x0,0x5,0xa,0x1,0xb,0xe,0x8,0x6,0xd,0x3,0x4,\n\t0x8,0x6,0x7,0x9,0x3,0xc,0xa,0xf,0xd,0x1,0xe,0x4,0x0,0xb,0x5,0x2,\n\t0x0,0xf,0xb,0x8,0xc,0x9,0x6,0x3,0xd,0x1,0x2,0x4,0xa,0x7,0x5,0xe,\n\t0x1,0xf,0x8,0x3,0xc,0x0,0xb,0x6,0x2,0x5,0x4,0xa,0x9,0xe,0x7,0xd,\n\t0xf,0x5,0x2,0xb,0x4,0xa,0x9,0xc,0x0,0x3,0xe,0x8,0xd,0x6,0x7,0x1,\n\t0x7,0x2,0xc,0x5,0x8,0x4,0x6,0xb,0xe,0x9,0x1,0xf,0xd,0x3,0xa,0x0,\n\t0x1,0xd,0xf,0x0,0xe,0x8,0x2,0xb,0x7,0x4,0xc,0xa,0x9,0x3,0x5,0x6,\n  //inverse sbox[8-15]\n  //      0   1   2   3   4   5   6   7   8   9   a   b   c   d   e   f\n\t0xd,0x3,0xb,0x0,0xa,0x6,0x5,0xc,0x1,0xe,0x4,0x7,0xf,0x9,0x8,0x2,\n\t0x5,0x8,0x2,0xe,0xf,0x6,0xc,0x3,0xb,0x4,0x7,0x9,0x1,0xd,0xa,0x0,\n\t0xc,0x9,0xf,0x4,0xb,0xe,0x1,0x2,0x0,0x3,0x6,0xd,0x5,0x8,0xa,0x7,\n\t0x0,0x9,0xa,0x7,0xb,0xe,0x6,0xd,0x3,0x5,0xc,0x2,0x4,0x8,0xf,0x1,\n\t0x5,0x0,0x8,0x3,0xa,0x9,0x7,0xe,0x2,0xc,0xb,0x6,0x4,0xf,0xd,0x1,\n\t0x8,0xf,0x2,0x9,0x4,0x1,0xd,0xe,0xb,0x6,0x5,0x3,0x7,0xc,0xa,0x0,\n\t0xf,0xa,0x1,0xd,0x5,0x3,0x6,0x0,0x4,0x9,0xe,0x7,0x2,0xc,0x8,0xb,\n\t0x3,0x0,0x6,0xd,0x9,0xe,0xf,0x8,0x5,0xc,0xb,0x7,0xa,0x1,0x4,0x2\n};\n\n\n\n/*\n * This function is used both for S-boxes and reverse S-boxes\n * since the same thing is done\n * Argument \"sbox\" > 8 means reverse sbox\n */\nvoid serpent_sbox_it(int sbox, quint32 &X1, quint32 &X2,\n                               quint32 &X3, quint32 &X4) {\n    quint32 i,j,tmp;\n    quint32 newword, mask, X;\n\n    X = X1;\n    /* Data block is 128 bits, integer is 32 bits => 4 loops */\t\n    for(i=0;i<4;i++) {\n        newword = 0x0;\n        switch(i) {\n        case 1:\n\t    X1 = X;\n\t    X = X2;\n            break;\n        case 2:\n            X2 = X;\n            X = X3;\n            break;\n        case 3:\n            X3 = X;\n            X = X4;\n            break;\n        default:\n            break;\n        }\n\t\n        /* Copying on bit per loop round to its new position\n           working on 2x16 bits */\n        for(j=0;j<0x10;j++) {\n            tmp = *(serpent_sboxes + 0x10*sbox + j);\n            mask = 0x80008000;\n            mask >>= tmp;\n            mask &= X;\n            mask <<= tmp;\n            mask >>= j;\n            newword |= mask;\n        }\n        X = newword;\n    }\n    X4 = X;\n}\n\n#endif\n\n\nvoid serpent_encrypt_4w(quint32 &X1a, quint32 &X2a,\n                        quint32 &X3a, quint32 &X4a, const quint32 *s) {\n    int round, rm8;\n    quint32 X1, X2, X3, X4;\n    /* LOOP THROUGH THE 32 ROUNDS */\n\n    X1 = X1a;\n    X2 = X2a;\n    X3 = X3a;\n    X4 = X4a;\n\n    // for(round=0 ; round<ROUNDS ; round++) {\n    round = 0;\n    while ( 1 ) {\n    \n        /* KEY MIXING */\n        X1 = s[4*round    ] ^ X1;\n        X2 = s[4*round + 1] ^ X2;\n        X3 = s[4*round + 2] ^ X3;\n        X4 = s[4*round + 3] ^ X4;\n\n        /* APPLY S-BOX */\n        rm8 = round & 0x7;\n#ifdef WITH_SERPENT_FAST_SBOX\n\tX1 = serpent_sbox_fast(rm8, X1);\n\tX2 = serpent_sbox_fast(rm8, X2);\n\tX3 = serpent_sbox_fast(rm8, X3);\n\tX4 = serpent_sbox_fast(rm8, X4);\n#else\n        serpent_sbox_it(rm8 , X1, X2, X3, X4);\n#endif\n        if ( round == ROUNDS-1 ) break;\n\n        /* DO LINEAR TRANSFORMATION (not in last round) */\n        X1 = ROTL32(X1, 13);\n        X3 = ROTL32(X3, 3);\n        X2 = X2 ^ X1 ^ X3;\n        X4 = X4 ^ X3 ^ ( X1 << 3 );\n        X2 = ROTL32(X2, 1);\n        X4 = ROTL32(X4, 7);\n        X1 = X1 ^ X2 ^ X4;\n        X3 = X3 ^ X4 ^ ( X2 << 7 );\n        X1 = ROTL32(X1, 5);\n        X3 = ROTL32(X3, 22);\n\n        round++;\n    }\n\n    /* FINAL KEY MIX */\n    X1a = X1 ^ s[128];\n    X2a = X2 ^ s[129];\n    X3a = X3 ^ s[130];\n    X4a = X4 ^ s[131];\n}\n\n\nvoid serpent_decrypt_4w(quint32 &X1a, quint32 &X2a,\n                        quint32 &X3a, quint32 &X4a, const quint32 *s) {\n    int round, rm8;\n    quint32 X1, X2, X3, X4;\n\n    X1 = X1a ^ s[128];\n    X2 = X2a ^ s[129];\n    X3 = X3a ^ s[130];\n    X4 = X4a ^ s[131];\n\n    round = ROUNDS - 1;\n    while ( 1 ) {\n        rm8 = (round & 0x7) + 8;\n#ifdef WITH_SERPENT_FAST_SBOX\n\tX1 = serpent_sbox_fast(rm8, X1);\n\tX2 = serpent_sbox_fast(rm8, X2);\n\tX3 = serpent_sbox_fast(rm8, X3);\n\tX4 = serpent_sbox_fast(rm8, X4);\n#else\n        serpent_sbox_it(rm8 , X1, X2, X3, X4);\n#endif\n\n        X1 = s[4*round    ] ^ X1;\n        X2 = s[4*round + 1] ^ X2;\n        X3 = s[4*round + 2] ^ X3;\n        X4 = s[4*round + 3] ^ X4;\n\n        round--;\n        if ( -1 == round ) break;\n\n        X3 = ROTR32(X3, 22);\n        X1 = ROTR32(X1, 5);\n        X3 = X3 ^ X4 ^ (X2 << 7);\n        X1 = X1 ^ X2 ^ X4;\n        X4 = ROTR32(X4, 7);\n        X2 = ROTR32(X2, 1);\n        X4 = X4 ^ X3 ^ (X1 << 3);\n        X2 = X2 ^ X1 ^ X3;\n        X3 = ROTR32(X3, 3);\n        X1 = ROTR32(X1, 13);\n    }\n\n    X1a = X1;\n    X2a = X2;\n    X3a = X3;\n    X4a = X4;\n}\n\nvoid serpent_encrypt_16b(const uchar *plain16, uchar *cipher16, const quint32 *s) {\n    quint32 X1 = qFromLittleEndian<quint32>(plain16);\n    quint32 X2 = qFromLittleEndian<quint32>(plain16 + 4);\n    quint32 X3 = qFromLittleEndian<quint32>(plain16 + 8);\n    quint32 X4 = qFromLittleEndian<quint32>(plain16 + 12);\n    serpent_encrypt_4w(X1, X2, X3, X4, s);\n    qToLittleEndian(X1, cipher16);\n    qToLittleEndian(X2, cipher16 + 4);\n    qToLittleEndian(X3, cipher16 + 8);\n    qToLittleEndian(X4, cipher16 + 12);\n}\n\nvoid serpent_decrypt_16b(const uchar *cipher16, uchar *plain16, const quint32 *s) {\n    quint32 X1 = qFromLittleEndian<quint32>(cipher16);\n    quint32 X2 = qFromLittleEndian<quint32>(cipher16 + 4);\n    quint32 X3 = qFromLittleEndian<quint32>(cipher16 + 8);\n    quint32 X4 = qFromLittleEndian<quint32>(cipher16 + 12);\n    serpent_decrypt_4w(X1, X2, X3, X4, s);\n    qToLittleEndian(X1, plain16);\n    qToLittleEndian(X2, plain16 + 4);\n    qToLittleEndian(X3, plain16 + 8);\n    qToLittleEndian(X4, plain16 + 12);\n}\n\n\n#ifdef WITH_SERPENT_PRINT_SBOX_H\nvoid serpent_print_sbox_h() {\n    int sbox;\n    int i;\n    quint32 X1, X2, X3, X4;\n\n    i = X2 = X3 = X4 = 0;\n\n    printf(\"/* THIS IS serpent_sbox.h\\n\");\n    printf(\" * #include it in simpleqtcryptor.c for faster serpent\\n\");\n    printf(\" */\\n\\n\");\n\n    printf(\"#define WITH_SERPENT_FAST_SBOX\\n\\n\");\n    \n    printf(\"const quint16 serpent_sbox_fast_data[] = {\\n\");\n\n    for ( sbox = 0 ; sbox < 16 ; sbox++ ) {\n\n        printf(\"\\n// SBOX: %d , 0000-FF00\", sbox);\n        for ( i = 0 ; i < 256 ; i++ ) {\n            if ( 0 == (i % 64) ) {\n                printf(\"\\n  /* *** %d - %d *** */\\n\", i, i+63);\n            } else if ( 0 == ( i % 8 ) ) {\n                printf(\"\\n\");\n            }\n            X1 = i * 256;\n\n#ifdef WITH_SERPENT_FAST_SBOX\n            X1 = serpent_sbox_fast(sbox, X1);\n#else\n            serpent_sbox_it(sbox, X1, X2, X3, X4);\n#endif\n            printf(\"0x%04x,\", X1);\n        }\n\n        printf(\"\\n// SBOX: %d , 0000-00FF\", sbox);\n        for ( i = 0 ; i < 256 ; i++ ) {\n            if ( 0 == (i % 64) ) {\n                printf(\"\\n  /* *** %d - %d *** */\\n\", i, i+63);\n            } else if ( 0 == ( i % 8 ) ) {\n                printf(\"\\n\");\n            }\n            X1 = i;\n\n#ifdef WITH_SERPENT_FAST_SBOX\n            X1 = serpent_sbox_fast(sbox, X1);\n#else\n            serpent_sbox_it(sbox, X1, X2, X3, X4);\n#endif\n            printf(\"0x%04x,\", X1);\n        }\n    }\n    printf(\"0x0};\\n\");\n}\n\n#endif // WITH_SERPENT_PRINT_SBOX_H\n\n\n} //namespace\n"
  },
  {
    "path": "src/core/asemansimpleqtcryptor.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/*\n *  SimpleQtCryptor is an encryption library for Qt.\n *\n *  Copyright (C) 2010,2011 Gunnar Thorburn\n *\n *  SimpleQtCrypto is free software: you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation, either version 3 of the License, or\n *  (at your option) any later version.\n *\n *  ParrotShare is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n\n// remove this line if you do not want RC5\n#define WITHRC5\n\n// this line enables the print serpent_sbox.h functionality\n// #define WITH_SERPENT_PRINT_SBOX_H\n\n// remove this line if you want a slightly smaller and much slower\n// binary (serpent only)\n#define WITH_SERPENT_INCLUDE_FAST_SBOX\n\n#ifndef ASEMANSIMPLEQTCRYPTOR_H\n#define ASEMANSIMPLEQTCRYPTOR_H\n\n#include <QtGlobal>\n#include <QByteArray>\n#include <QSharedPointer>\n#include <QObject>\n\n#include \"asemancore_global.h\"\n\nclass QString;\n\nnamespace AsemanSimpleQtCryptor {\n\nclass Encryptor;\nclass Decryptor;\nclass LayerMode;\nclass CFB;\nclass CBC;\n\nenum Algorithm {\n    NoAlgorithm = 0,\n    DetectAlgorithm,\n#ifdef WITHRC5\n    RC5_FAST_32_20,\n    RC5_32_32_20,\n    RC5_64_32_20,\n#endif\n    SERPENT_32\n};\n\nenum Mode {\n    NoMode = 0,\n    DetectMode,\n    ModeCBC,\n    ModeCFB\n};\n\nenum Checksum {\n    NoChecksum = 0,\n    DetectChecksum,\n    ChecksumSoft,\n    ChecksumHard\n};\n\nenum Error {\n    NoError = 0,\n    // ErrorNoKey,\n    ErrorNoAlgorithm,\n    ErrorNoMode,\n    ErrorInvalidKey,\n    ErrorNotEnoughData,\n    ErrorModeNotImplemented,\n    ErrorAlgorithmNotImplemented,\n    ErrorChecksumNotImplemented,\n    ErrorAlreadyError\n};\n\n\nenum State {\n    StateReset = 0,\n    StateOn,\n    StateError\n};\n\n\nclass Info {\npublic:\n    static Algorithm fastRC5();\n    static QString errorText(Error e);\n};\n\n\n\nclass LIBQTASEMAN_CORE_EXPORT Key : public QObject {\n    Q_OBJECT\npublic:\n    Key();\n    Key(const QByteArray &key);\n    Key(const QString &key);\n    virtual ~Key();\n\n    // not for use by end application\n#ifdef WITHRC5\n    void expandKeyRc532();\n    void expandKeyRc564();\n#endif\n    void expandKeySerpent();\n\n    // variables\n    QByteArray key;\n#ifdef WITHRC5\n    QByteArray keyRc5;\n    quint32 *s32;\n    quint64 *s64;\n#endif\n    QByteArray keySerpent;\n    quint32 *serpent;\nprivate:\n    QByteArray resizeKey(int ks);\n};\n\n\n/*\n * About end and reset()\n *  - If you encrypt/decrypt a piece of data (ie a file) in one chunk\n *    make sure end=true. After this, you can use the same LayerMode\n *    object to encrypt/decrypt something else\n *  - If you encrypt/decrypt i piece of data (ie a file or a network\n *    conversation) in more than one chunk, make sure the last chunk\n *    only has end=true.\n *  - Call reset() only if you want to start over after an error\n *    (typically ErrorInvalidKey or ErrorNotEnoughData);\n *    as long as you use end=true, you never need to reset().\n */\nclass Encryptor : public QObject {\n    Q_OBJECT\npublic:\n    Encryptor(QSharedPointer<Key> k, Algorithm a, Mode m, Checksum c);\n    virtual ~Encryptor();   \n    Error encrypt(const QByteArray &plain, QByteArray &cipher, bool end);\n    void reset();\nprivate:\n    QSharedPointer<Key> key;\n    Algorithm algorithm;\n    Mode mode;\n    Checksum checksum;\n    State state;\n    LayerMode *modex;\n};\n\n\n// will attempt all different combinations, and give you a\n// Decryptor back to decrypt rest of data or more messages\n// from the same source\nclass DecryptorWizardEntry;\nclass DecryptorWizard {\npublic:\n    DecryptorWizard();\n    DecryptorWizard(QSharedPointer<Key> k, Algorithm a = DetectAlgorithm, Mode m = DetectMode);\n    virtual ~DecryptorWizard();\n\n    void addParameters(QSharedPointer<Key> k, Algorithm a = DetectAlgorithm, Mode m = DetectMode);\n\n    Error decrypt(const QByteArray &cipher, QByteArray &plain, QSharedPointer<Decryptor> &decryptor, bool end = false);\n    Error decryptToEnd(const QByteArray &cipher, QByteArray &plain);\nprivate:\n    QList<DecryptorWizardEntry*> entries;\n};\n\n\n\nclass Decryptor : public QObject {\n    Q_OBJECT\npublic:\n    Decryptor(QSharedPointer<Key> k, Algorithm a, Mode m);\n    virtual ~Decryptor();\n    Error decrypt(const QByteArray &cipher, QByteArray &plain, bool end);\n    void reset();\n    Checksum getChecksumType();\nprivate:\n    QSharedPointer<Key> key;\n    Algorithm algorithm;\n    Mode mode;\n    State state;\n    Checksum checksum;\n    LayerMode *modex;\n};\n\n\n\nclass InitializationVector {\npublic:\n    static QByteArray getVector8();\n    static QByteArray getVector16();\n    static void initiate();\n};\n\n\n\n/* *** Layer 2 : mode layer *** */\n\n/*\n * A single LayerMode object can handle only one encrypt OR decrypt\n * at a time\n */\nclass LayerMode {\npublic:\n    virtual QByteArray encrypt(const QByteArray plain, bool end) = 0;\n    virtual QByteArray decrypt(const QByteArray cipher, bool end) = 0;\n    virtual void reset() = 0;\n    virtual ~LayerMode() {};\n};\n\nclass CFB : public LayerMode {\npublic:\n    CFB(QSharedPointer<Key> k, Algorithm a);\n    virtual ~CFB();\n    QByteArray encrypt(const QByteArray plain, bool end = false) Q_DECL_OVERRIDE;\n    QByteArray decrypt(const QByteArray cipher, bool end = false) Q_DECL_OVERRIDE;\n    void reset() Q_DECL_OVERRIDE;\nprivate:\n    QByteArray buffer;\n    int bufferpos;\n    Algorithm algorithm;\n    QSharedPointer<Key> key;\n};\n\nclass CBC : public LayerMode {\npublic:\n    CBC(QSharedPointer<Key> k, Algorithm a);\n    virtual ~CBC();\n    QByteArray encrypt(const QByteArray plain, bool end) Q_DECL_OVERRIDE;\n    QByteArray decrypt(const QByteArray cipher, bool end) Q_DECL_OVERRIDE;\n    void reset() Q_DECL_OVERRIDE;\nprivate:\n    QByteArray buffer;\n    QByteArray cbcBuffer;\n    QByteArray padHostageBuffer;\n    int worksize;\n    Algorithm algorithm;\n    QSharedPointer<Key> key;\n};\n\n\n/* *** Layer 1 : block layer - experts only *** */\n\n#ifdef WITHRC5\n// input replaced by output\nvoid rc5_32_encrypt_2w(quint32 &X1, quint32 &X2, const quint32 *s);\nvoid rc5_64_encrypt_2w(quint64 &X1, quint64 &X2, const quint64 *s);\nvoid rc5_32_decrypt_2w(quint32 &X1, quint32 &X2, const quint32 *s);\nvoid rc5_64_decrypt_2w(quint64 &X1, quint64 &X2, const quint64 *s);\n\nvoid rc5_32_encrypt_8b(const uchar *plain8, uchar *cipher8, const quint32 *s);\nvoid rc5_64_encrypt_16b(const uchar *plain16, uchar *cipher16, const quint64 *s);\nvoid rc5_32_decrypt_8b(const uchar *cipher8, uchar *plain8, const quint32 *s);\nvoid rc5_64_decrypt_16b(const uchar *cipher16, uchar *plain16, const quint64 *s);\n#endif\n\nvoid serpent_encrypt_4w(quint32 &X1, quint32 &X2,\n                        quint32 &X3, quint32 &X4, const quint32 *s);\n\nvoid serpent_decrypt_4w(quint32 &X1, quint32 &X2,\n                        quint32 &X3, quint32 &X4, const quint32 *s);\n\nvoid serpent_encrypt_16b(const uchar *plain16, uchar *cipher16, const quint32 *s);\nvoid serpent_decrypt_16b(const uchar *cipher16, uchar *plain16, const quint32 *s);\n\n#ifdef WITH_SERPENT_PRINT_SBOX_H\nvoid serpent_print_sbox_h();\n#endif\n\n} // namespace\n\n\n#endif // ASEMANSIMPLEQTCRYPTOR_H\n"
  },
  {
    "path": "src/core/core.pri",
    "content": "INCLUDEPATH += $$PWD\nDEPENDPATH += $$PWD\n\nQT += core\n\nHEADERS += \\\n    $$PWD/asemanabstractlistmodel.h \\\n    $$PWD/asemanautostartmanager.h \\\n    $$PWD/asemancalendarconverter.h \\\n    $$PWD/asemancalendarconvertercore.h \\\n    $$PWD/asemancalendarmodel.h \\\n    $$PWD/asemancountriesmodel.h \\\n    $$PWD/asemandebugobjectcounter.h \\\n    $$PWD/asemanencrypter.h \\\n    $$PWD/asemanfilesystemmodel.h \\\n    $$PWD/asemanglobals.h \\\n    $$PWD/asemanhashobject.h \\\n    $$PWD/asemanlistobject.h \\\n    $$PWD/asemanlistrecord.h \\\n    $$PWD/asemanmixedlistmodel.h \\\n    $$PWD/asemanqtlogger.h \\\n    $$PWD/asemansettings.h \\\n    $$PWD/asemansimpleqtcryptor.h \\\n    $$PWD/asemancore_global.h \\\n    $$PWD/aseman_macros.h \\\n    $$PWD/private/serpent_sbox.h \\\n    $$PWD/asemanmapobject.h \\\n    $$PWD/asemanrefresherobject.h \\\n    $$PWD/asemanlistmodel.h\n\nSOURCES += \\\n    $$PWD/asemanabstractlistmodel.cpp \\\n    $$PWD/asemanautostartmanager.cpp \\\n    $$PWD/asemancalendarconverter.cpp \\\n    $$PWD/asemancalendarconvertercore.cpp \\\n    $$PWD/asemancalendarmodel.cpp \\\n    $$PWD/asemancountriesmodel.cpp \\\n    $$PWD/asemandebugobjectcounter.cpp \\\n    $$PWD/asemanencrypter.cpp \\\n    $$PWD/asemanfilesystemmodel.cpp \\\n    $$PWD/asemanhashobject.cpp \\\n    $$PWD/asemanlistobject.cpp \\\n    $$PWD/asemanlistrecord.cpp \\\n    $$PWD/asemanmixedlistmodel.cpp \\\n    $$PWD/asemanqtlogger.cpp \\\n    $$PWD/asemansettings.cpp \\\n    $$PWD/asemansimpleqtcryptor.cpp \\\n    $$PWD/asemanmapobject.cpp \\\n    $$PWD/asemanrefresherobject.cpp \\\n    $$PWD/asemanlistmodel.cpp\n\nRESOURCES += \\\n    $$PWD/asemancoreresource_lib.qrc\n\nmacx {\n    !contains(DEFINES, DISABLE_CORE_SERVICES) {\n        LIBS += -framework CoreServices\n        INCLUDEPATH += /System/Library/Frameworks/CoreServices.framework/Headers/\n        DEFINES += OSX_CORE_SERVICES_AVAILABLE\n    }\n    !contains(QMAKE_HOST.arch, x86_64) {\n        LIBS +=  -framework CoreFoundation -framework Carbon -lobjc\n    }\n}\n"
  },
  {
    "path": "src/core/core.pro",
    "content": "load(qt_build_config)\n\nTARGET = QAsemanCore\n\nMODULE = asemancore\n\nload(qt_module)\n\nDEFINES += LIBQTASEMAN_CORE_LIBRARY\n\ninclude(core.pri)\n"
  },
  {
    "path": "src/core/files/countries.csv",
    "content": "name;nativeName;tld;cca2;ccn3;cca3;currency;callingCode;capital;altSpellings;relevance;region;subregion;language;languageCodes;translations;latlng;demonym;borders;area\nAfghanistan;افغانستان;.af;AF;004;AFG;AFN;93;Kabul;AF,Afġānistān;0;Asia;Southern Asia;Pashto,Dari;ps,uz,tk;Affganistan,Afghanistan,Afganistán,Afghanistan,Afghanistan,アフガニスタン,Afghanistan,Afganistan;33,65;Afghan;IRN,PAK,TKM,UZB,TJK,CHN;652230\nÅland Islands;Åland;.ax;AX;248;ALA;EUR;358;Mariehamn;AX,Aaland,Aland,Ahvenanmaa;0;Europe;Northern Europe;Swedish;sv;Åland,Alandia,Åland,Isole Aland,オーランド諸島,Ålandeilanden,Ålandski otoci;60.116667,19.9;Ålandish;;-1\nAlbania;Shqipëria;.al;AL;008;ALB;ALL;355;Tirana;AL,Shqipëri,Shqipëria,Shqipnia;0;Europe;Southern Europe;Albanian;sq;Albania,Albanien,Albania,Albanie,Albania,アルバニア,Albanië,Albanija;41,20;Albanian;MNE,GRC,MKD,KOS;28748\nAlgeria;الجزائر;.dz;DZ;012;DZA;DZD;213;Algiers;DZ,Dzayer,Algérie;0;Africa;Northern Africa;Arabic;ar;Algeria,Algerien,Argelia,Algérie,Algeria,アルジェリア,Algerije,Alžir;28,3;Algerian;TUN,LDY,NER,ESH,MRT,MLI,MAR;2381741\nAmerican Samoa;American Samoa;.as;AS;016;ASM;USD;1684;Pago Pago;AS,Amerika Sāmoa,Amelika Sāmoa,Sāmoa Amelika;0.5;Oceania;Polynesia;English,Samoan;en,sm;Amerikanisch-Samoa,Samoa Americana,Samoa américaines,Samoa Americane,アメリカ領サモア,Amerikaans Samoa,Američka Samoa;-14.33333333,-170;American Samoan;;199\nAndorra;Andorra;.ad;AD;020;AND;EUR;376;Andorra la Vella;AD,Principality of Andorra,Principat d'Andorra;0.5;Europe;Southern Europe;Catalan;ca;Andorra,Andorra,Andorra,Andorre,Andorra,アンドラ,Andorra,Andora;42.5,1.5;Andorran;FRA,ESP;468\nAngola;Angola;.ao;AO;024;AGO;AOA;244;Luanda;AO,República de Angola,ʁɛpublika de an'ɡɔla;0;Africa;Middle Africa;Portuguese;pt;Angola,Angola,Angola,Angola,Angola,アンゴラ,Angola,Angola;-12.5,18.5;Angolan;COG,COD,ZMB,NAM;1246700\nAnguilla;Anguilla;.ai;AI;660;AIA;XCD;1264;The Valley;AI;0.5;Americas;Caribbean;English;en;Anguilla,Anguilla,Anguilla,Anguilla,アンギラ,Anguilla,Angvila;18.25,-63.16666666;Anguillian;;91\nAntarctica;;.aq;AQ;010;ATA;;;;AQ;0;;;;;Antarctica,Antarktis,Antártida,Antarctique,Antartide,南極,Antarctica,Antarktika;-90,0;;;14000000\nAntigua and Barbuda;Antigua and Barbuda;.ag;AG;028;ATG;XCD;1268;Saint John's;AG;0.5;Americas;Caribbean;English;en;Antigwa a Barbiwda,Antigua und Barbuda,Antigua y Barbuda,Antigua-et-Barbuda,Antigua e Barbuda,アンティグア・バーブーダ,Antigua en Barbuda,Antigva i Barbuda;17.05,-61.8;Antiguan, Barbudan;;442\nArgentina;Argentina;.ar;AR;032;ARG;ARS;54;Buenos Aires;AR,Argentine Republic,República Argentina;0;Americas;South America;Spanish;es,gn;Ariannin,Argentinien,Argentina,Argentine,Argentina,アルゼンチン,Argentinië,Argentina;-34,-64;Argentinean;BOL,BRA,CHL,PRY,URY;2780400\nArmenia;Հայաստան;.am;AM;051;ARM;AMD;374;Yerevan;AM,Hayastan,Republic of Armenia,Հայաստանի Հանրապետություն;0;Asia;Western Asia;Armenian;hy,ru;Armenia,Armenien,Armenia,Arménie,Armenia,アルメニア,Armenië,Armenija;40,45;Armenian;AZE,GEO,IRN,TUR;29743\nAruba;Aruba;.aw;AW;533;ABW;AWG;297;Oranjestad;AW;0.5;Americas;Caribbean;Dutch,Papiamento;nl,pa;Aruba,Aruba,Aruba,Aruba,アルバ,Aruba,Aruba;12.5,-69.96666666;Aruban;;180\nAscension Island;Ascension Island;.ac;SH;654;SHN;SHP;247;Georgetown;;0;Americas;South America;English;en;Ynys y Dyrchafael,Ascension,Isla Ascensión,Île de l'Ascension,Isola di Ascensione,アセンション島,Ascension,Otok Ascension;-7.933333,-14.366667;Saints;;-1\nAustralia;Australia;.au;AU;036;AUS;AUD;61;Canberra;AU;1.5;Oceania;Australia and New Zealand;English;en;Awstralia,Australien,Australia,Australie,Australia,オーストラリア,Australië,Australija;-27,133;Australian;;7692024\nAustria;Österreich;.at;AT;040;AUT;EUR;43;Vienna;AT,Österreich,Osterreich,Oesterreich;0;Europe;Western Europe;German;de;Awstria,Österreich,Austria,Autriche,Austria,オーストリア,Oostenrijk,Austrija;47.33333333,13.33333333;Austrian;CZE,DEU,HUN,ITA,LIE,SVK,SVN,CHE;83871\nAzerbaijan;Azərbaycan;.az;AZ;031;AZE;AZN;994;Baku;AZ,Republic of Azerbaijan,Azərbaycan Respublikası;0;Asia;Western Asia;Azerbaijani;az,hy;Aserbaijan,Aserbaidschan,Azerbaiyán,Azerbaïdjan,Azerbaijan,アゼルバイジャン,Azerbeidzjan,Azerbajdžan;40.5,47.5;Azerbaijani;ARM,GEO,IRN,RUS,TUR;86600\nBahamas;Bahamas;.bs;BS;044;BHS;BSD;1242;Nassau;BS,Commonwealth of the Bahamas;0;Americas;Caribbean;English;en;Bahamas,Bahamas,Bahamas,Bahamas,Bahamas,バハマ,Bahama’s,Bahami;24.25,-76;Bahamian;;13943\nBahrain;‏البحرين;.bh;BH;048;BHR;BHD;973;Manama;BH,Kingdom of Bahrain,Mamlakat al-Baḥrayn;0;Asia;Western Asia;Arabic;ar;Bahrain,Bahrain,Bahrein,Bahreïn,Bahrein,バーレーン,Bahrein,Bahrein;26,50.55;Bahraini;;765\nBangladesh;Bangladesh;.bd;BD;050;BGD;BDT;880;Dhaka;BD,People's Republic of Bangladesh,Gônôprôjatôntri Bangladesh;2;Asia;Southern Asia;Bangla;bn;Bangladesh,Bangladesch,Bangladesh,Bangladesh,Bangladesh,バングラデシュ,Bangladesh,Bangladeš;24,90;Bangladeshi;MMR,IND;147570\nBarbados;Barbados;.bb;BB;052;BRB;BBD;1246;Bridgetown;BB;0;Americas;Caribbean;English;en;Barbados,Barbados,Barbados,Barbade,Barbados,バルバドス,Barbados,Barbados;13.16666666,-59.53333333;Barbadian;;430\nBelarus;Белару́сь;.by;BY;112;BLR;BYR;375;Minsk;BY,Bielaruś,Republic of Belarus,Белоруссия,Республика Беларусь,Belorussiya,Respublika Belarus’;0;Europe;Eastern Europe;Belarusian,Russian;be,ru;Belarws,Weißrussland,Bielorrusia,Biélorussie,Bielorussia,ベラルーシ,Wit-Rusland,Bjelorusija;53,28;Belarusian;LVA,LTU,POL,RUS,UKR;207600\nBelgium;België;.be;BE;056;BEL;EUR;32;Brussels;BE,België,Belgie,Belgien,Belgique,Kingdom of Belgium,Koninkrijk België,Royaume de Belgique,Königreich Belgien;1.5;Europe;Western Europe;Dutch,French,German;nl,fr,de;Gwlad Belg,Belgien,Bélgica,Belgique,Belgio,ベルギー,België,Belgija;50.83333333,4;Belgian;FRA,DEU,LUX,NLD;30528\nBelize;Belize;.bz;BZ;084;BLZ;BZD;501;Belmopan;BZ;0;Americas;Central America;English;en,es;Belize,Belize,Belice,Belize,Belize,ベリーズ,Belize,Belize;17.25,-88.75;Belizean;GTM,MEX;22966\nBenin;Bénin;.bj;BJ;204;BEN;XOF;229;Porto-Novo;BJ,Republic of Benin,République du Bénin;0;Africa;Western Africa;French;fr;Benin,Benin,Benín,Bénin,Benin,ベナン,Benin,Benin;9.5,2.25;Beninese;BFA,NER,NGA,TGO;112622\nBermuda;Bermuda;.bm;BM;060;BMU;BMD;1441;Hamilton;BM,The Islands of Bermuda,The Bermudas,Somers Isles;0.5;Americas;Northern America;English;en;Bermiwda,Bermuda,Bermudas,Bermudes,Bermuda,バミューダ,Bermuda,Bermudi;32.33333333,-64.75;Bermudian;;54\nBhutan;ʼbrug-yul;.bt;BT;064;BTN;BTN,INR;975;Thimphu;BT,Kingdom of Bhutan;0;Asia;Southern Asia;Dzongkha;dz;Bhwtan,Bhutan,Bután,Bhoutan,Bhutan,ブータン,Bhutan,Butan;27.5,90.5;Bhutanese;CHN,IND;38394\nBolivia;Bolivia;.bo;BO;068;BOL;BOB,BOV;591;Sucre;BO,Buliwya,Wuliwya,Plurinational State of Bolivia,Estado Plurinacional de Bolivia,Buliwya Mamallaqta,Wuliwya Suyu,Tetã Volívia;0;Americas;South America;Spanish,Quechua,Aymara,Guaraní;es,ay,qu;Bolifia,Bolivien,Bolivia,Bolivie,Bolivia,ボリビア多民族国,Bolivia,Bolivija;-17,-65;Bolivian;ARG,BRA,CHL,PRY,PRU;1098581\nBonaire;Bonaire;.an,.nl;BQ;535;BES;USD;5997;Kralendijk;BQ,Boneiru;0;Americas;Caribbean;Dutch;nl;;12.15,-68.266667;Dutch;;-1\nBosnia and Herzegovina;Bosna i Hercegovina;.ba;BA;070;BIH;BAM;387;Sarajevo;BA,Bosnia-Herzegovina,Босна и Херцеговина;0;Europe;Southern Europe;Bosnian,Croatian,Serbian;bs,hr,sr;Bosnia a Hercegovina,Bosnien und Herzegowina,Bosnia y Herzegovina,Bosnie-Herzégovine,Bosnia ed Erzegovina,ボスニア・ヘルツェゴビナ,Bosnië en Herzegovina,Bosna i Hercegovina;44,18;Bosnian, Herzegovinian;HRV,MNE,SRB;51209\nBotswana;Botswana;.bw;BW;072;BWA;BWP;267;Gaborone;BW,Republic of Botswana,Lefatshe la Botswana;0;Africa;Southern Africa;English,Setswana;en,tn;Botswana,Botswana,Botswana,Botswana,ボツワナ,Botswana,Bocvana;-22,24;Motswana;NAM,ZAF,ZMB,ZWE;582000\nBouvet Island;Bouvetøya;.bv;BV;074;BVT;NOK;;;BV,Bouvetøya,Bouvet-øya;0;;;;;Bouvetinsel,Isla Bouvet,Île Bouvet,Isola Bouvet,ブーベ島,Bouveteiland,Otok Bouvet;-54.43333333,3.4;;;49\nBrazil;Brasil;.br;BR;076;BRA;BRL;55;Brasília;BR,Brasil,Federative Republic of Brazil,República Federativa do Brasil;2;Americas;South America;Portuguese;pt;Brasil,Brasilien,Brasil,Brésil,Brasile,ブラジル,Brazilië,Brazil;-10,-55;Brazilian;ARG,BOL,COL,GUF,GUY,PRY,PER,SUR,URY,VEN;8515767\nBritish Indian Ocean Territory;British Indian Ocean Territory;.io;IO;086;IOT;USD;246;Diego Garcia;IO;0;Africa;Eastern Africa;English;en;Tiriogaeth Brydeinig Cefnfor India,Britisches Territorium im Indischen Ozean,Territorio Británico del Océano Índico,Territoire britannique de l'océan Indien,Territorio britannico dell'oceano indiano,イギリス領インド洋地域,Britse Gebieden in de Indische Oceaan,Britanski Indijskooceanski teritorij;-6,71.5;Indian;;60\nBritish Virgin Islands;British Virgin Islands;.vg;VG;092;VGB;USD;1284;Road Town;VG;0.5;Americas;Caribbean;English;en;Britische Jungferninseln,Islas Vírgenes del Reino Unido,Îles Vierges britanniques,Isole Vergini Britanniche,イギリス領ヴァージン諸島,Britse Maagdeneilanden,Britanski Djevičanski Otoci;18.431383,-64.62305;Virgin Islander;;151\nBrunei;Negara Brunei Darussalam;.bn;BN;096;BRN;BND;673;Bandar Seri Begawan;BN,Nation of Brunei, the Abode of Peace;0;Asia;South-Eastern Asia;Malay;ms;Brunei,Brunei,Brunei,Brunei,Brunei,ブルネイ・ダルサラーム,Brunei,Brunej;4.5,114.66666666;Bruneian;MYS;5765\nBulgaria;България;.bg;BG;100;BGR;BGN;359;Sofia;BG,Republic of Bulgaria,Република България;0;Europe;Eastern Europe;Bulgarian;bg;Bwlgaria,Bulgarien,Bulgaria,Bulgarie,Bulgaria,ブルガリア,Bulgarije,Bugarska;43,25;Bulgarian;GRC,MKD,ROU,SRB,TUR;110879\nBurkina Faso;Burkina Faso;.bf;BF;854;BFA;XOF;226;Ouagadougou;BF;0;Africa;Western Africa;French;fr,ff;Burkina Faso,Burkina Faso,Burkina Faso,Burkina Faso,Burkina Faso,ブルキナファソ,Burkina Faso,Burkina Faso;13,-2;Burkinabe;BEN,CIV,GHA,MLI,NER,TGO;272967\nBurundi;Burundi;.bi;BI;108;BDI;BIF;257;Bujumbura;BI,Republic of Burundi,Republika y'Uburundi,République du Burundi;0;Africa;Eastern Africa;Kirundi,French;fr,rn;Bwrwndi,Burundi,Burundi,Burundi,Burundi,ブルンジ,Burundi,Burundi;-3.5,30;Burundian;COD,RWA,TZA;27834\nCambodia;Kâmpŭchéa;.kh;KH;116;KHM;KHR;855;Phnom Penh;KH,Kingdom of Cambodia;0;Asia;South-Eastern Asia;Khmer;km;Cambodia,Cambodge,Cambodja,Kambodscha,Cambogia,カンボジア,Camboya,Kambodža;13,105;Cambodian;LAO,THA,VNM;181035\nCameroon;Cameroon;.cm;CM;120;CMR;XAF;237;Yaoundé;CM,Republic of Cameroon,République du Cameroun;0;Africa;Middle Africa;French,English;en,fr;Camerŵn,Kamerun,Camerún,Cameroun,Camerun,カメルーン,Kameroen,Kamerun;6,12;Cameroonian;CAF,TCD,COG,GNQ,GAB,NGA;475442\nCanada;Canada;.ca;CA;124;CAN;CAD;1;Ottawa;CA;2;Americas;Northern America;English,French;en,fr;Canada,Kanada,Canadá,Canada,Canada,カナダ,Canada,Kanada;60,-95;Canadian;USA;9984670\nCape Verde;Cabo Verde;.cv;CV;132;CPV;CVE;238;Praia;CV,Republic of Cabo Verde,República de Cabo Verde;0;Africa;Western Africa;Portuguese;pt;Cape Verde,Kap Verde,Cabo Verde,Cap Vert,Capo Verde,カーボベルデ,Kaapverdië,Zelenortska Republika;16,-24;Cape Verdian;;4033\nCayman Islands;Cayman Islands;.ky;KY;136;CYM;KYD;1345;George Town;KY;0.5;Americas;Caribbean;English;en;Ynysoedd_Cayman,Kaimaninseln,Islas Caimán,Îles Caïmans,Isole Cayman,ケイマン諸島,Caymaneilanden,Kajmanski otoci;19.5,-80.5;Caymanian;;264\nCentral African Republic;Ködörösêse tî Bêafrîka;.cf;CF;140;CAF;XAF;236;Bangui;CF,Central African Republic,République centrafricaine;0;Africa;Middle Africa;Sango,French;fr,sg;Gweriniaeth Canolbarth Affrica,Zentralafrikanische Republik,República Centroafricana,République centrafricaine,Repubblica Centrafricana,中央アフリカ共和国,Centraal-Afrikaanse Republiek,Srednjoafrička Republika;7,21;Central African;CMR,TCD,COD,COG,SSD,SDN;622984\nChad;Tchad;.td;TD;148;TCD;XAF;235;N'Djamena;TD,Tchad,Republic of Chad,République du Tchad;0;Africa;Middle Africa;French,Arabic;fr,ar;Tsiad,Tschad,Chad,Tchad,Ciad,チャド,Tsjaad,Čad;15,19;Chadian;CMR,CAF,LBY,NER,NGA,SSD;1284000\nChile;Chile;.cl;CL;152;CHL;CLF,CLP;56;Santiago;CL,Republic of Chile,República de Chile;0;Americas;South America;Spanish;es;Chile,Chile,Chile,Chili,Cile,チリ,Chili,Čile;-30,-71;Chilean;ARG,BOL,PER;756102\nChina;中国;.cn;CN;156;CHN;CNY;86;Beijing;CN,Zhōngguó,Zhongguo,Zhonghua,People's Republic of China,中华人民共和国,Zhōnghuá Rénmín Gònghéguó;0;Asia;Eastern Asia;Standard Chinese;zh;Tsieina,China,China,Chine,Cina,中国,China,Kina;35,105;Chinese;AFG,BTN,MMR,HKG,IND,KAZ,PRK,KGZ,LAO,MAC,MNG,PAK,RUS,TJK,VNM;9706961\nChristmas Island;Christmas Island;.cx;CX;162;CXR;AUD;61;Flying Fish Cove;CX,Territory of Christmas Island;0.5;Oceania;Australia and New Zealand;English;en;Ynys y Nadolig,Île Christmas,Christmaseiland,Weihnachtsinsel,Isola di Natale,クリスマス島,Isla de Navidad,Božićni otok;-10.5,105.66666666;Christmas Island;;135\nCocos (Keeling) Islands;Cocos (Keeling) Islands;.cc;CC;166;CCK;AUD;61;West Island;CC,Territory of the Cocos (Keeling) Islands,Keeling Islands;0;Oceania;Australia and New Zealand;English;en;Ynysoedd Cocos,Îles Cocos,Cocoseilanden,Kokosinseln,Isole Cocos e Keeling,ココス（キーリング）諸島,Islas Cocos o Islas Keeling,Kokosovi Otoci;-12.5,96.83333333;Cocos Islander;;14\nColombia;Colombia;.co;CO;170;COL;COP;57;Bogotá;CO,Republic of Colombia,República de Colombia;0;Americas;South America;Spanish;es;Colombia,Kolumbien,Colombia,Colombie,Colombia,コロンビア,Colombia,Kolumbija;4,-72;Colombian;BRA,ECU,PAN,PER,VEN;1141748\nComoros;Komori;.km;KM;174;COM;KMF;269;Moroni;KM,Union of the Comoros,Union des Comores,Udzima wa Komori,al-Ittiḥād al-Qumurī;0;Africa;Eastern Africa;Comorian,Arabic,French;ar,fr;Comoros,Union der Komoren,Comoras,Comores,Comore,コモロ,Comoren,Komori;-12.16666666,44.25;Comoran;;1862\nRepublic of the Congo;République du Congo;.cg;CG;178;COG;XAF;242;Brazzaville;CG,Congo-Brazzaville;0;Africa;Middle Africa;French;fr,ln;Gweriniaeth y Congo,Kongo,Congo,Congo,Congo,コンゴ共和国,Congo [Republiek],Kongo;-1,15;Congolese;AGO,CMR,CAF,COD,GAB;342000\nDemocratic Republic of the Congo;République démocratique du Congo;.cd;CD;180;COD;CDF;243;Kinshasa;CD,DR Congo,Congo-Kinshasa,DRC;0;Africa;Middle Africa;French;fr,ln,kg,sw,lu;Gweriniaeth Ddemocrataidd Congo,Kongo (Dem. Rep.),Congo (Rep. Dem.),Congo (Rép. dém.),Congo (Rep. Dem.),コンゴ民主共和国,Congo [DRC],Kongo, Demokratska Republika;0,25;Congolese;AGO,BDI,CAF,COG,RWA,SSD,TZA,UGA,ZMB;2344858\nCook Islands;Cook Islands;.ck;CK;184;COK;NZD;682;Avarua;CK,Kūki 'Āirani;0.5;Oceania;Polynesia;English,Cook Islands Māori;en;Ynysoedd Cook,Cookinseln,Islas Cook,Îles Cook,Isole Cook,クック諸島,Cookeilanden,Cookovo Otočje;-21.23333333,-159.76666666;Cook Islander;;236\nCosta Rica;Costa Rica;.cr;CR;188;CRI;CRC;506;San José;CR,Republic of Costa Rica,República de Costa Rica;0;Americas;Central America;Spanish;es;Costa Rica,Costa Rica,Costa Rica,Costa Rica,Costa Rica,コスタリカ,Costa Rica,Kostarika;10,-84;Costa Rican;NIC,PAN;51100\nCroatia;Hrvatska;.hr;HR;191;HRV;HRK;385;Zagreb;HR,Hrvatska,Republic of Croatia,Republika Hrvatska;0;Europe;Southern Europe;Croatian;hr;Croatia,Kroatien,Croacia,Croatie,Croazia,クロアチア,Kroatië,Hrvatska;45.16666666,15.5;Croatian;BIH,HUN,MNE,SRB,SVN;56594\nCuba;Cuba;.cu;CU;192;CUB;CUC,CUP;53;Havana;CU,Republic of Cuba,República de Cuba;0;Americas;Caribbean;Spanish;es;Ciwba,Kuba,Cuba,Cuba,Cuba,キューバ,Cuba,Kuba;21.5,-80;Cuban;;109884\nCuraçao;Curaçao;.cw;CW;531;CUW;ANG;5999;Willemstad;CW,Curacao,Kòrsou,Country of Curaçao,Land Curaçao,Pais Kòrsou;0;Americas;Caribbean;Dutch,Papiamentu,English;nl,pa,en;Curaçao;12.116667,-68.933333;Dutch;;444\nCyprus;Κύπρος;.cy;CY;196;CYP;EUR;357;Nicosia;CY,Kýpros,Kıbrıs,Republic of Cyprus,Κυπριακή Δημοκρατία,Kıbrıs Cumhuriyeti;0;Europe;Eastern Europe;Greek,Turkish;el,tr,hy;Cyprus,Zypern,Chipre,Chypre,Cipro,キプロス,Cyprus,Cipar;35,33;Cypriot;GBR;9251\nCzech Republic;Česká republika;.cz;CZ;203;CZE;CZK;420;Prague;CZ,Česká republika,Česko;0;Europe;Eastern Europe;Czech;cs,sk;Y Weriniaeth Tsiec,Tschechische Republik,República Checa,République tchèque,Repubblica Ceca,チェコ,Tsjechië,Češka;49.75,15.5;Czech;AUT,DEU,POL,SVK;78865\nDenmark;Danmark;.dk;DK;208;DNK;DKK;45;Copenhagen;DK,Danmark,Kingdom of Denmark,Kongeriget Danmark;1.5;Europe;Northern Europe;Danish;da;Denmarc,Dänemark,Dinamarca,Danemark,Danimarca,デンマーク,Denemarken,Danska;56,10;Danish;DEU;43094\nDjibouti;Djibouti;.dj;DJ;262;DJI;DJF;253;Djibouti;DJ,Jabuuti,Gabuuti,Republic of Djibouti,République de Djibouti,Gabuutih Ummuuno,Jamhuuriyadda Jabuuti;0;Africa;Eastern Africa;French,Arabic;fr,ar;Djibouti,Dschibuti,Yibuti,Djibouti,Gibuti,ジブチ,Djibouti,Džibuti;11.5,43;Djibouti;ERI,ETH,SOM;23200\nDominica;Dominica;.dm;DM;212;DMA;XCD;1767;Roseau;DM,Dominique,Wai‘tu kubuli,Commonwealth of Dominica;0.5;Americas;Caribbean;English;en;Dominica,Dominica,Dominica,Dominique,Dominica,ドミニカ国,Dominica,Dominika;15.41666666,-61.33333333;Dominican;;751\nDominican Republic;República Dominicana;.do;DO;214;DOM;DOP;1809,1829,1849;Santo Domingo;DO;0;Americas;Caribbean;Spanish;es;Gweriniaeth_Dominica,Dominikanische Republik,República Dominicana,République dominicaine,Repubblica Dominicana,ドミニカ共和国,Dominicaanse Republiek,Dominikanska Republika;19,-70.66666666;Dominican;HTI;48671\nEcuador;Ecuador;.ec;EC;218;ECU;USD;593;Quito;EC,Republic of Ecuador,República del Ecuador;0;Americas;South America;Spanish;es;Ecwador,Ecuador,Ecuador,Équateur,Ecuador,エクアドル,Ecuador,Ekvador;-2,-77.5;Ecuadorean;COL,PER;276841\nEgypt;مصر‎;.eg;EG;818;EGY;EGP;20;Cairo;EG,Arab Republic of Egypt;1.5;Africa;Northern Africa;Arabic;ar;Yr Aifft,Ägypten,Egipto,Égypte,Egitto,エジプト,Egypte,Egipat;27,30;Egyptian;ISR,LBY,SDN;1002450\nEl Salvador;El Salvador;.sv;SV;222;SLV;SVC,USD;503;San Salvador;SV,Republic of El Salvador,República de El Salvador;0;Americas;Central America;Castilian;es;El Salvador,El Salvador,El Salvador,Salvador,El Salvador,エルサルバドル,El Salvador,Salvador;13.83333333,-88.91666666;Salvadoran;GTM,HND;21041\nEquatorial Guinea;Guinea Ecuatorial;.gq;GQ;226;GNQ;XAF;240;Malabo;GQ,Republic of Equatorial Guinea,República de Guinea Ecuatorial,République de Guinée équatoriale,República da Guiné Equatorial;0;Africa;Middle Africa;Spanish,French,Portuguese;es,fr;Gini Gyhydeddol,Äquatorial-Guinea,Guinea Ecuatorial,Guinée-Équatoriale,Guinea Equatoriale,赤道ギニア,Equatoriaal-Guinea,Ekvatorijalna Gvineja;2,10;Equatorial Guinean;CMR,GAB;28051\nEritrea;ኤርትራ;.er;ER;232;ERI;ERN;291;Asmara;ER,State of Eritrea,ሃገረ ኤርትራ,Dawlat Iritriyá,ʾErtrā,Iritriyā,;0;Africa;Eastern Africa;Tigrinya,Arabic,English;ti,ar,en;Eritrea,Eritrea,Eritrea,Érythrée,Eritrea,エリトリア,Eritrea,Eritreja;15,39;Eritrean;DJI,ETH,SDN;117600\nEstonia;Eesti;.ee;EE;233;EST;EUR;372;Tallinn;EE,Eesti,Republic of Estonia,Eesti Vabariik;0;Europe;Northern Europe;Estonian;et;Estonia,Estland,Estonia,Estonie,Estonia,エストニア,Estland,Estonija;59,26;Estonian;LVA,RUS;45227\nEthiopia;ኢትዮጵያ;.et;ET;231;ETH;ETB;251;Addis Ababa;ET,ʾĪtyōṗṗyā,Federal Democratic Republic of Ethiopia,የኢትዮጵያ ፌዴራላዊ ዲሞክራሲያዊ ሪፐብሊክ;0;Africa;Eastern Africa;Amharic;am;Ethiopia,Äthiopien,Etiopía,Éthiopie,Etiopia,エチオピア,Ethiopië,Etiopija;8,38;Ethiopian;DJI,ERI,KEN,SOM,SSD,SDN;1104300\nFalkland Islands;Falkland Islands;.fk;FK;238;FLK;FKP;500;Stanley;FK,Islas Malvinas;0.5;Americas;South America;English;en;Falklandinseln,Islas Malvinas,Îles Malouines,Isole Falkland o Isole Malvine,フォークランド（マルビナス）諸島,Falklandeilanden [Islas Malvinas],Falklandski Otoci;-51.75,-59;Falkland Islander;;12173\nFaroe Islands;Føroyar;.fo;FO;234;FRO;DKK;298;Tórshavn;FO,Føroyar,Færøerne;0.5;Europe;Northern Europe;Faroese,Danish;fo;Färöer-Inseln,Islas Faroe,Îles Féroé,Isole Far Oer,フェロー諸島,Faeröer,Farski Otoci;62,-7;Faroese;;1393\nFiji;Fiji;.fj;FJ;242;FJI;FJD;679;Suva;FJ,Viti,Republic of Fiji,Matanitu ko Viti,Fijī Gaṇarājya;0;Oceania;Melanesia;English,Fijian,Fiji Hindi;en,fj,hi,ur;Fidschi,Fiyi,Fidji,Figi,フィジー,Fiji,Fiđi;-18,175;Fijian;;18272\nFinland;Suomi;.fi;FI;246;FIN;EUR;358;Helsinki;FI,Suomi,Republic of Finland,Suomen tasavalta,Republiken Finland;0.5;Europe;Northern Europe;Finnish,Swedish;fi,sv;Finnland,Finlandia,Finlande,Finlandia,フィンランド,Finland,Finska;64,26;Finnish;NOR,SWE,RUS;338424\nFrance;France;.fr;FR;250;FRA;EUR;33;Paris;FR,French Republic,République française;2.5;Europe;Western Europe;French;fr;Frankreich,Francia,France,Francia,フランス,Frankrijk,Francuska;46,2;French;AND,BEL,DEU,ITA,LUX,MCO,ESP,CHE;-1\nFrench Guiana;Guyane française;.gf;GF;254;GUF;EUR;594;Cayenne;GF,Guiana,Guyane;0;Americas;South America;French;fr;Französisch Guyana,Guayana Francesa,Guayane,Guyana francese,フランス領ギアナ,Frans-Guyana,Francuska Gvajana;4,-53;;BRA,SUR;-1\nFrench Polynesia;Polynésie française;.pf;PF;258;PYF;XPF;689;Papeetē;PF,Polynésie française,French Polynesia,Pōrīnetia Farāni;0;Oceania;Polynesia;French;fr;Französisch-Polynesien,Polinesia Francesa,Polynésie française,Polinesia Francese,フランス領ポリネシア,Frans-Polynesië,Francuska Polinezija;-15,-140;French Polynesian;;4167\nFrench Southern and Antarctic Lands;Territoire des Terres australes et antarctiques françaises;.tf;TF;260;ATF;EUR;;Port-aux-Français;TF;0;;;French;fr;Französische Süd- und Antarktisgebiete,Tierras Australes y Antárticas Francesas,Terres australes et antarctiques françaises,Territori Francesi del Sud,フランス領南方・南極地域,Franse Gebieden in de zuidelijke Indische Oceaan,Francuski južni i antarktički teritoriji;-49.25,69.167;French;;7747\nGabon;Gabon;.ga;GA;266;GAB;XAF;241;Libreville;GA,Gabonese Republic,République Gabonaise;0;Africa;Middle Africa;French;fr;Gabun,Gabón,Gabon,Gabon,ガボン,Gabon,Gabon;-1,11.75;Gabonese;CMR,COG,GNQ;267668\nGambia;Gambia;.gm;GM;270;GMB;GMD;220;Banjul;GM,Republic of the Gambia;0;Africa;Western Africa;English;en;Gambia,Gambia,Gambie,Gambia,ガンビア,Gambia,Gambija;13.46666666,-16.56666666;Gambian;SEN;-1\nGeorgia;საქართველო;.ge;GE;268;GEO;GEL;995;Tbilisi;GE,Sakartvelo;0;Asia;Western Asia;Georgian;ka;Georgien,Georgia,Géorgie,Georgia,グルジア,Georgië,Gruzija;42,43.5;Georgian;ARM,AZE,RUS,TUR;-1\nGermany;Deutschland;.de;DE;276;DEU;EUR;49;Berlin;DE,Federal Republic of Germany,Bundesrepublik Deutschland;3;Europe;Western Europe;German;de;Deutschland,Alemania,Allemagne,Germania,ドイツ,Duitsland,Njemačka;51,9;German;AUT,BEL,CZE,DNK,FRA,LUX,NLD,POL,CHE;357114\nGhana;Ghana;.gh;GH;288;GHA;GHS;233;Accra;GH;0;Africa;Western Africa;English;en;Ghana,Ghana,Ghana,Ghana,ガーナ,Ghana,Gana;8,-2;Ghanaian;BFA,CIV,TGO;238533\nGibraltar;Gibraltar;.gi;GI;292;GIB;GIP;350;Gibraltar;GI;0.5;Europe;Southern Europe;English;en;Gibraltar,Gibraltar,Gibraltar,Gibilterra,ジブラルタル,Gibraltar,Gibraltar;36.13333333,-5.35;Gibraltar;ESP;6\nGreece;Ελλάδα;.gr;GR;300;GRC;EUR;30;Athens;GR,Elláda,Hellenic Republic,Ελληνική Δημοκρατία;1.5;Europe;Southern Europe;Greek;el;Griechenland,Grecia,Grèce,Grecia,ギリシャ,Griekenland,Grčka;39,22;Greek;ALB,BGR,TUR,MKD;131990\nGreenland;Kalaallit Nunaat;.gl;GL;304;GRL;DKK;299;Nuuk;GL,Grønland;0.5;Americas;Northern America;Greenlandic;kl;Grönland,Groenlandia,Groenland,Groenlandia,グリーンランド,Groenland,Grenland;72,-40;Greenlandic;;2166086\nGrenada;Grenada;.gd;GD;308;GRD;XCD;1473;St. George's;GD;0;Americas;Caribbean;English;en;Grenada,Grenada,Grenade,Grenada,グレナダ,Grenada,Grenada;12.11666666,-61.66666666;Grenadian;;344\nGuadeloupe;Guadeloupe;.gp;GP;312;GLP;EUR;590;Basse-Terre;GP,Gwadloup;0;Americas;Caribbean;French;fr;Guadeloupe,Guadalupe,Guadeloupe,Guadeloupa,グアドループ,Guadeloupe,Gvadalupa;16.25,-61.583333;Guadeloupian;;-1\nGuam;Guam;.gu;GU;316;GUM;USD;1671;Hagåtña;GU,Guåhån;0;Oceania;Micronesia;English,Chamorro;en,ch,es;Guam,Guam,Guam,Guam,グアム,Guam,Guam;13.46666666,144.78333333;Guamanian;;549\nGuatemala;Guatemala;.gt;GT;320;GTM;GTQ;502;Guatemala City;GT;0;Americas;Central America;Spanish;es;Guatemala,Guatemala,Guatemala,Guatemala,グアテマラ,Guatemala,Gvatemala;15.5,-90.25;Guatemalan;BLZ,SLV,HND,MEX;108889\nGuernsey;Guernsey;.gg;GG;831;GGY;GBP;44;St. Peter Port;GG,Bailiwick of Guernsey,Bailliage de Guernesey;0.5;Europe;Northern Europe;English,French;en,fr;Guernsey,Guernsey,Guernesey,Guernsey,ガーンジー,Guernsey,Guernsey;49.46666666,-2.58333333;Channel Islander;;78\nGuinea;Guinée;.gn;GN;324;GIN;GNF;224;Conakry;GN,Republic of Guinea,République de Guinée;0;Africa;Western Africa;French;fr,ff;Guinea,Guinea,Guinée,Guinea,ギニア,Guinee,Gvineja;11,-10;Guinean;CIV,GNB,LBR,MLI,SEN,SLE;245857\nGuinea-Bissau;Guiné-Bissau;.gw;GW;624;GNB;XOF;245;Bissau;GW,Republic of Guinea-Bissau,República da Guiné-Bissau;0;Africa;Western Africa;Portuguese;pt;Guinea-Bissau,Guinea-Bisáu,Guinée-Bissau,Guinea-Bissau,ギニアビサウ,Guinee-Bissau,Gvineja Bisau;12,-15;Guinea-Bissauan;GIN,SEN;36125\nGuyana;Guyana;.gy;GY;328;GUY;GYD;592;Georgetown;GY,Co-operative Republic of Guyana;0;Americas;South America;English;en;Guyana,Guyana,Guyane,Guyana,ガイアナ,Guyana,Gvajana;5,-59;Guyanese;BRA,SUR,VEN;214969\nHaiti;Haïti;.ht;HT;332;HTI;HTG,USD;509;Port-au-Prince;HT,Republic of Haiti,République d'Haïti,Repiblik Ayiti;0;Americas;Caribbean;French,Haitian Creole;fr,ht;Haiti,Haiti,Haïti,Haiti,ハイチ,Haïti,Haiti;19,-72.41666666;Haitian;DOM;27750\nHeard Island and McDonald Islands;Heard Island and McDonald Islands;.hm,.aq;HM;334;HMD;AUD;;;HM;0;;;;en;Heard und die McDonaldinseln,Islas Heard y McDonald,Îles Heard-et-MacDonald,Isole Heard e McDonald,ハード島とマクドナルド諸島,Heard- en McDonaldeilanden,Otok Heard i otočje McDonald;-53.1,72.51666666;Heard and McDonald Islander;;412\nVatican City;Vaticano;.va;VA;336;VAT;EUR;39066,379;Vatican City;VA,Vatican City State,Stato della Città del Vaticano;0.5;Europe;Southern Europe;Italian;it,la;Vatikanstadt,Ciudad del Vaticano,Cité du Vatican,Città del Vaticano,バチカン市国,Vaticaanstad,Vatikan;41.9,12.45;Italian;ITA;0.44\nHonduras;Honduras;.hn;HN;340;HND;HNL;504;Tegucigalpa;HN,Republic of Honduras,República de Honduras;0;Americas;Central America;Spanish;es;Honduras,Honduras,Honduras,Honduras,ホンジュラス,Honduras,Honduras;15,-86.5;Honduran;GTM,SLV,NIC;112492\nHong Kong;香港;.hk;HK;344;HKG;HKD;852;City of Victoria;HK;0;Asia;Eastern Asia;Chinese,English;zh,en;Hongkong,Hong Kong,Hong Kong,Hong Kong,香港,Hongkong,Hong Kong;22.267,114.188;Hong Konger;CHN;1104\nHungary;Magyarország;.hu;HU;348;HUN;HUF;36;Budapest;HU;0;Europe;Eastern Europe;Hungarian;hu;Ungarn,Hungría,Hongrie,Ungheria,ハンガリー,Hongarije,Mađarska;47,20;Hungarian;AUT,HRV,ROU,SRB,SVK,SVN,UKR;93028\nIceland;Ísland;.is;IS;352;ISL;ISK;354;Reykjavik;IS,Island,Republic of Iceland,Lýðveldið Ísland;0;Europe;Northern Europe;Icelandic;is;Island,Islandia,Islande,Islanda,アイスランド,IJsland,Island;65,-18;Icelander;;103000\nIndia;भारत;.in;IN;356;IND;INR;91;New Delhi;IN,Bhārat,Republic of India,Bharat Ganrajya;3;Asia;Southern Asia;Hindi,English;hi,en;Indien,India,Inde,India,インド,India,Indija;20,77;Indian;AFG,BGD,BTN,MMR,CHN,NPL,PAK,LKA;3287590\nIndonesia;Indonesia;.id;ID;360;IDN;IDR;62;Jakarta;ID,Republic of Indonesia,Republik Indonesia;2;Asia;South-Eastern Asia;Indonesian;id;Indonésie,Indonesië,Indonesien,Indonesia,インドネシア,Indonesia,Indonezija;-5,120;Indonesian;TLS,MYS,PNG;1904569\nIvory Coast;Côte d'Ivoire;.ci;CI;384;CIV;XOF;225;Yamoussoukro;CI,Ivory Coast,Republic of Côte d'Ivoire,République de Côte d'Ivoire;0;Africa;Western Africa;French;fr;Elfenbeinküste,Costa de Marfil,Côte d'Ivoire,Costa D'Avorio,コートジボワール,Ivoorkust,Obala Bjelokosti;8,-5;Ivorian;BFA,GHA,GIN,LBR,MLI;322463\nIran;Irān;.ir;IR;364;IRN;IRR;98;Tehran;IR,Islamic Republic of Iran,Jomhuri-ye Eslāmi-ye Irān;0;Asia;Southern Asia;Persian;fa;Iran,Iran,Iran,イラン・イスラム共和国,Iran,Iran;32,53;Iranian;AFG,ARM,AZE,IRQ,PAK,TUR,TKM;1648195\nIraq;العراق;.iq;IQ;368;IRQ;IQD;964;Baghdad;IQ,Republic of Iraq,Jumhūriyyat al-‘Irāq;0;Asia;Western Asia;Arabic,Kurdish,Syriac;ar,ku;Irak,Irak,Irak,Iraq,イラク,Irak,Irak;33,44;Iraqi;IRN,JOR,KWT,SAU,SYR,TUR;438317\nIreland;Éire;.ie;IE;372;IRL;EUR;353;Dublin;IE,Éire,Republic of Ireland,Poblacht na hÉireann;1.2;Europe;Northern Europe;Irish,English;ga,en;Irland,Irlanda,Irlande,Irlanda,アイルランド,Ierland,Irska;53,-8;Irish;GBR;70273\nIsle of Man;Isle of Man;.im;IM;833;IMN;GBP;44;Douglas;IM,Ellan Vannin,Mann,Mannin;0.5;Europe;Northern Europe;English,Manx;en,gv;Insel Man,Isla de Man,Île de Man,Isola di Man,マン島,Isle of Man,Otok Man;54.25,-4.5;Manx;;572\nIsrael;יִשְׂרָאֵל;.il;IL;376;ISR;ILS;972;Jerusalem;IL,State of Israel,Medīnat Yisrā'el;0;Asia;Western Asia;Hebrew,Arabic;he,ar;Israel,Israel,Israël,Israele,イスラエル,Israël,Izrael;31.5,34.75;Israeli;EGY,JOR,LBN,SYR;20770\nItaly;Italia;.it;IT;380;ITA;EUR;39;Rome;IT,Italian Republic,Repubblica italiana;2;Europe;Southern Europe;Italian;it;Italien,Italia,Italie,Italia,イタリア,Italië,Italija;42.83333333,12.83333333;Italian;AUT,FRA,SMR,SVN,CHE,VAT;301336\nJamaica;Jamaica;.jm;JM;388;JAM;JMD;1876;Kingston;JM;0;Americas;Caribbean;Jamaican English;en;Jamaika,Jamaica,Jamaïque,Giamaica,ジャマイカ,Jamaica,Jamajka;18.25,-77.5;Jamaican;;10991\nJapan;日本;.jp;JP;392;JPN;JPY;81;Tokyo;JP,Nippon,Nihon;2.5;Asia;Eastern Asia;Japanese;ja;Japan,Japón,Japon,Giappone,日本,Japan,Japan;36,138;Japanese;;377930\nJersey;Jersey;.je;JE;832;JEY;GBP;44;Saint Helier;JE,Bailiwick of Jersey,Bailliage de Jersey,Bailliage dé Jèrri;0.5;Europe;Northern Europe;English,French;en,fr;Jersey,Jersey,Jersey,Isola di Jersey,ジャージー,Jersey,Jersey;49.25,-2.16666666;Channel Islander;;116\nJordan;الأردن;.jo;JO;400;JOR;JOD;962;Amman;JO,Hashemite Kingdom of Jordan,al-Mamlakah al-Urdunīyah al-Hāshimīyah;0;Asia;Western Asia;Arabic;ar;Jordanien,Jordania,Jordanie,Giordania,ヨルダン,Jordanië,Jordan;31,36;Jordanian;IRQ,ISR,SAU,SYR;89342\nKazakhstan;Қазақстан;.kz,.қаз;KZ;398;KAZ;KZT;76,77;Astana;KZ,Qazaqstan,Казахстан,Republic of Kazakhstan,Қазақстан Республикасы,Qazaqstan Respublïkası,Республика Казахстан,Respublika Kazakhstan;0;Asia;Central Asia;Kazakh,Russian;kk,ru;Kasachstan,Kazajistán,Kazakhstan,Kazakistan,カザフスタン,Kazachstan,Kazahstan;48,68;Kazakhstani;CHN,KGZ,RUS,TKM,UZB;2724900\nKenya;Kenya;.ke;KE;404;KEN;KES;254;Nairobi;KE,Republic of Kenya,Jamhuri ya Kenya;0;Africa;Eastern Africa;Swahili,English;en,sw;Kenia,Kenia,Kenya,Kenya,ケニア,Kenia,Kenija;1,38;Kenyan;ETH,SOM,SSD,TZA,UGA;580367\nKiribati;Kiribati;.ki;KI;296;KIR;AUD;686;South Tarawa;KI,Republic of Kiribati,Ribaberiki Kiribati;0;Oceania;Micronesia;English,Gilbertese;en;Kiribati,Kiribati,Kiribati,Kiribati,キリバス,Kiribati,Kiribati;1.41666666,173;I-Kiribati;;811\nKuwait;الكويت;.kw;KW;414;KWT;KWD;965;Kuwait City;KW,State of Kuwait,Dawlat al-Kuwait;0;Asia;Western Asia;Arabic;ar;Kuwait,Kuwait,Koweït,Kuwait,クウェート,Koeweit,Kuvajt;29.5,45.75;Kuwaiti;IRN,SAU;17818\nKyrgyzstan;Кыргызстан;.kg;KG;417;KGZ;KGS;996;Bishkek;KG,Киргизия,Kyrgyz Republic,Кыргыз Республикасы,Kyrgyz Respublikasy;0;Asia;Central Asia;Kyrgyz,Russian;ky,ru;Kirgisistan,Kirguizistán,Kirghizistan,Kirghizistan,キルギス,Kirgizië,Kirgistan;41,75;Kirghiz;CHN,KAZ,TJK,UZB;199951\nLaos;ສປປລາວ;.la;LA;418;LAO;LAK;856;Vientiane;LA,Lao,Lao People's Democratic Republic,Sathalanalat Paxathipatai Paxaxon Lao;0;Asia;South-Eastern Asia;Lao;lo;Laos,Laos,Laos,Laos,ラオス人民民主共和国,Laos,Laos;18,105;Laotian;MMR,KHM,CHN,THA,VNM;236800\nLatvia;Latvija;.lv;LV;428;LVA;EUR;371;Riga;LV,Republic of Latvia,Latvijas Republika;0;Europe;Northern Europe;Latvian;lv;Lettland,Letonia,Lettonie,Lettonia,ラトビア,Letland,Latvija;57,25;Latvian;BLR,EST,LTU,RUS;64559\nLebanon;لبنان;.lb;LB;422;LBN;LBP;961;Beirut;LB,Lebanese Republic,Al-Jumhūrīyah Al-Libnānīyah;0;Asia;Western Asia;Arabic,French;ar,fr;Libanon,Líbano,Liban,Libano,レバノン,Libanon,Libanon;33.83333333,35.83333333;Lebanese;ISR,SYR;10452\nLesotho;Lesotho;.ls;LS;426;LSO;LSL,ZAR;266;Maseru;LS,Kingdom of Lesotho,Muso oa Lesotho;0;Africa;Southern Africa;Sesotho,English;en,st;Lesotho,Lesotho,Lesotho,Lesotho,レソト,Lesotho,Lesoto;-29.5,28.5;Mosotho;ZAF;30355\nLiberia;Liberia;.lr;LR;430;LBR;LRD;231;Monrovia;LR,Republic of Liberia;0;Africa;Western Africa;English;en;Liberia,Liberia,Liberia,Liberia,リベリア,Liberia,Liberija;6.5,-9.5;Liberian;GIN,CIV,SLE;111369\nLibya;‏ليبيا;.ly;LY;434;LBY;LYD;218;Tripoli;LY,State of Libya,Dawlat Libya;0;Africa;Northern Africa;Arabic;ar;Libyen,Libia,Libye,Libia,リビア,Libië,Libija;25,17;Libyan;DZA,TCD,EGY,NER,SDN,TUN;1759540\nLiechtenstein;Liechtenstein;.li;LI;438;LIE;CHF;423;Vaduz;LI,Principality of Liechtenstein,Fürstentum Liechtenstein;0;Europe;Western Europe;German;de;Liechtenstein,Liechtenstein,Liechtenstein,Liechtenstein,リヒテンシュタイン,Liechtenstein,Lihtenštajn;47.26666666,9.53333333;Liechtensteiner;AUT,CHE;160\nLithuania;Lietuva;.lt;LT;440;LTU;LTL;370;Vilnius;LT,Republic of Lithuania,Lietuvos Respublika;0;Europe;Northern Europe;Lithuanian;lt;Litauen,Lituania,Lituanie,Lituania,リトアニア,Litouwen,Litva;56,24;Lithuanian;BLR,LVA,POL,RUS;65300\nLuxembourg;Luxembourg;.lu;LU;442;LUX;EUR;352;Luxembourg;LU,Grand Duchy of Luxembourg,Grand-Duché de Luxembourg,Großherzogtum Luxemburg,Groussherzogtum Lëtzebuerg;0;Europe;Western Europe;French,German,Luxembourgish;fr,de,lb;Luxemburg,Luxemburgo,Luxembourg,Lussemburgo,ルクセンブルク,Luxemburg,Luksemburg;49.75,6.16666666;Luxembourger;BEL,FRA,DEU;2586\nMacau;澳門;.mo;MO;446;MAC;MOP;853;;MO,澳门,Macao Special Administrative Region of the People's Republic of China,中華人民共和國澳門特別行政區,Região Administrativa Especial de Macau da República Popular da China;0;Asia;Eastern Asia;Traditional Chinese,Portuguese;zh,pt;Macao,Macao,Macao,Macao,マカオ,Macao,Makao;22.16666666,113.55;Chinese;CHN;30\nMacedonia;Македонија;.mk;MK;807;MKD;MKD;389;Skopje;MK,Republic of Macedonia,Република Македонија;0;Europe;Southern Europe;Macedonian;mk;Mazedonien,Macedonia,Macédoine,Macedonia,マケドニア旧ユーゴスラビア共和国,Macedonië,Makedonija;41.83333333,22;Macedonian;ALB,BGR,GRC,KOS,SRB;25713\nMadagascar;Madagasikara;.mg;MG;450;MDG;MGA;261;Antananarivo;MG,Republic of Madagascar,Repoblikan'i Madagasikara,République de Madagascar;0;Africa;Eastern Africa;Malagasy,French;fr,mg;Madagaskar,Madagascar,Madagascar,Madagascar,マダガスカル,Madagaskar,Madagaskar;-20,47;Malagasy;;587041\nMalawi;Malawi;.mw;MW;454;MWI;MWK;265;Lilongwe;MW,Republic of Malawi;0;Africa;Eastern Africa;Chichewa,English;en,ny;Malawi,Malawi,Malawi,Malawi,マラウイ,Malawi,Malavi;-13.5,34;Malawian;MOZ,TZA,ZMB;118484\nMalaysia;Malaysia;.my;MY;458;MYS;MYR;60;Kuala Lumpur;MY;0;Asia;South-Eastern Asia;Malaysian;;Malaisie,Maleisië,Malaysia,Malesia,マレーシア,Malasia,Malezija;2.5,112.5;Malaysian;BRN,IDN,THA;330803\nMaldives;Maldives;.mv;MV;462;MDV;MVR;960;Malé;MV,Maldive Islands,Republic of the Maldives,Dhivehi Raajjeyge Jumhooriyya;0;Asia;Southern Asia;Maldivian;dv;Malediven,Maldivas,Maldives,Maldive,モルディブ,Maldiven,Maldivi;3.25,73;Maldivan;;300\nMali;Mali;.ml;ML;466;MLI;XOF;223;Bamako;ML,Republic of Mali,République du Mali;0;Africa;Western Africa;French;fr;Mali,Mali,Mali,Mali,マリ,Mali,Mali;17,-4;Malian;DZA,BFA,GIN,CIV,MRT,NER,SEN;1240192\nMalta;Malta;.mt;MT;470;MLT;EUR;356;Valletta;MT,Republic of Malta,Repubblika ta' Malta;0;Europe;Southern Europe;Maltese,English;mt,en;Malta,Malta,Malte,Malta,マルタ,Malta,Malta;35.83333333,14.58333333;Maltese;;316\nMarshall Islands;M̧ajeļ;.mh;MH;584;MHL;USD;692;Majuro;MH,Republic of the Marshall Islands,Aolepān Aorōkin M̧ajeļ;0.5;Oceania;Micronesia;Marshallese,English;en,mh;Marshallinseln,Islas Marshall,Îles Marshall,Isole Marshall,マーシャル諸島,Marshalleilanden,Maršalovi Otoci;9,168;Marshallese;;181\nMartinique;Martinique;.mq;MQ;474;MTQ;EUR;596;Fort-de-France;MQ;0;Americas;Caribbean;French;fr;Martinique,Martinica,Martinique,Martinica,マルティニーク,Martinique,Martinique;14.666667,-61;French;;-1\nMauritania;موريتانيا;.mr;MR;478;MRT;MRO;222;Nouakchott;MR,Islamic Republic of Mauritania,al-Jumhūriyyah al-ʾIslāmiyyah al-Mūrītāniyyah;0;Africa;Western Africa;Arabic;ar;Mauretanien,Mauritania,Mauritanie,Mauritania,モーリタニア,Mauritanië,Mauritanija;20,-12;Mauritanian;DZA,MLI,SEN,ESH;1030700\nMauritius;Maurice;.mu;MU;480;MUS;MUR;230;Port Louis;MU,Republic of Mauritius,République de Maurice;0;Africa;Eastern Africa;French;en;Mauritius,Mauricio,Île Maurice,Mauritius,モーリシャス,Mauritius,Mauricijus;-20.28333333,57.55;Mauritian;;2040\nMayotte;Mayotte;.yt;YT;175;MYT;EUR;262;Mamoudzou;YT,Department of Mayotte,Département de Mayotte;0;Africa;Eastern Africa;French;fr;Mayotte,Mayotte,Mayotte,Mayotte,マヨット,Mayotte,Mayotte;-12.83333333,45.16666666;French;;-1\nMexico;México;.mx;MX;484;MEX;MXN;52;Mexico City;MX,Mexicanos,United Mexican States,Estados Unidos Mexicanos;1.5;Americas;Central America;Spanish;es;Mexiko,México,Mexique,Messico,メキシコ,Mexico,Meksiko;23,-102;Mexican;BLZ,GTM,USA;1964375\nMicronesia;Micronesia;.fm;FM;583;FSM;USD;691;Palikir;FM,Federated States of Micronesia;0;Oceania;Micronesia;English;en;Mikronesien,Micronesia,Micronésie,Micronesia,ミクロネシア連邦,Micronesië,Mikronezija;6.91666666,158.25;Micronesian;;702\nMoldova;Moldova;.md;MD;498;MDA;MDL;373;Chișinău;MD,Republic of Moldova,Republica Moldova;0;Europe;Eastern Europe;Moldovan;ro;Moldawie,Moldavia,Moldavie,Moldavia,モルドバ共和国,Moldavië,Moldova;47,29;Moldovan;ROU,UKR;33846\nMonaco;Monaco;.mc;MC;492;MCO;EUR;377;Monaco;MC,Principality of Monaco,Principauté de Monaco;0;Europe;Western Europe;French;fr;Monaco,Mónaco,Monaco,Principato di Monaco,モナコ,Monaco,Monako;43.73333333,7.4;Monegasque;FRA;2.02\nMongolia;Монгол улс;.mn;MN;496;MNG;MNT;976;Ulan Bator;MN;0;Asia;Eastern Asia;Mongolian;mn;Mongolei,Mongolia,Mongolie,Mongolia,モンゴル,Mongolië,Mongolija;46,105;Mongolian;CHN,RUS;1564110\nMontenegro;Црна Гора;.me;ME;499;MNE;EUR;382;Podgorica;ME,Crna Gora;0;Europe;Southern Europe;Montenegrin;sr,bs,sq,hr;Montenegro,Montenegro,Monténégro,Montenegro,モンテネグロ,Montenegro,Crna Gora;42.5,19.3;Montenegrin;ALB,BIH,HRV,KOS,SRB;13812\nMontserrat;Montserrat;.ms;MS;500;MSR;XCD;1664;Plymouth;MS;0.5;Americas;Caribbean;English;en;Montserrat,Montserrat,Montserrat,Montserrat,モントセラト,Montserrat,Montserrat;16.75,-62.2;Montserratian;;102\nMorocco;المغرب;.ma;MA;504;MAR;MAD;212;Rabat;MA,Kingdom of Morocco,Al-Mamlakah al-Maġribiyah;0;Africa;Northern Africa;Arabic,Berber;ar;Marokko,Marruecos,Maroc,Marocco,モロッコ,Marokko,Maroko;32,-5;Moroccan;DZA,ESH,ESP;446550\nMozambique;Moçambique;.mz;MZ;508;MOZ;MZN;258;Maputo;MZ,Republic of Mozambique,República de Moçambique;0;Africa;Eastern Africa;Portuguese;pt;Mosambik,Mozambique,Mozambique,Mozambico,モザンビーク,Mozambique,Mozambik;-18.25,35;Mozambican;MWI,ZAF,SWZ,TZA,ZMB,ZWE;801590\nMyanmar;Myanma;.mm;MM;104;MMR;MMK;95;Naypyidaw;MM,Burma,Republic of the Union of Myanmar,Pyidaunzu Thanmăda Myăma Nainngandaw;0;Asia;South-Eastern Asia;Burmese;my;Myanmar,Myanmar,Myanmar,Birmania,ミャンマー,Myanmar,Mijanmar;22,98;Myanmarian;BGD,CHN,IND,LAO,THA;-1\nNamibia;Namibia;.na;NA;516;NAM;NAD,ZAR;264;Windhoek;NA,Namibië,Republic of Namibia;0;Africa;Southern Africa;English;en,af;Namibia,Namibia,Namibie,Namibia,ナミビア,Namibië,Namibija;-22,17;Namibian;AGO,BWA,ZAF,ZMB;825615\nNauru;Nauru;.nr;NR;520;NRU;AUD;674;Yaren;NR,Naoero,Pleasant Island,Republic of Nauru,Ripublik Naoero;0.5;Oceania;Micronesia;Nauruan,English;en,na;Nauru,Nauru,Nauru,Nauru,ナウル,Nauru,Nauru;-0.53333333,166.91666666;Nauruan;;21\nNepal;नपल;.np;NP;524;NPL;NPR;977;Kathmandu;NP,Federal Democratic Republic of Nepal,Loktāntrik Ganatantra Nepāl;0;Asia;Southern Asia;Nepali;ne;Népal,Nepal,Népal,Nepal,ネパール,Nepal,Nepal;28,84;Nepalese;CHN,IND;147181\nNetherlands;Nederland;.nl;NL;528;NLD;EUR;31;Amsterdam;NL,Holland,Nederland;1.5;Europe;Western Europe;Dutch;nl;Niederlande,Países Bajos,Pays-Bas,Paesi Bassi,オランダ,Nederland,Nizozemska;52.5,5.75;Dutch;BEL,DEU;41850\nNew Caledonia;Nouvelle-Calédonie;.nc;NC;540;NCL;XPF;687;Nouméa;NC;0.5;Oceania;Melanesia;French;fr;Neukaledonien,Nueva Caledonia,Nouvelle-Calédonie,Nuova Caledonia,ニューカレドニア,Nieuw-Caledonië,Nova Kaledonija;-21.5,165.5;New Caledonian;;18575\nNew Zealand;New Zealand;.nz;NZ;554;NZL;NZD;64;Wellington;NZ,Aotearoa;1.0;Oceania;Australia and New Zealand;English,Māori,New Zealand Sign Language;en,mi;Nouvelle-Zélande,Nieuw-Zeeland,Neuseeland,Nuova Zelanda,ニュージーランド,Nueva Zelanda,Novi Zeland;-41,174;New Zealander;;270467\nNicaragua;Nicaragua;.ni;NI;558;NIC;NIO;505;Managua;NI,Republic of Nicaragua,República de Nicaragua;0;Americas;Central America;Spanish;es;Nicaragua,Nicaragua,Nicaragua,Nicaragua,ニカラグア,Nicaragua,Nikaragva;13,-85;Nicaraguan;CRI,HND;130373\nNiger;Niger;.ne;NE;562;NER;XOF;227;Niamey;NE,Nijar,Republic of Niger,République du Niger;0;Africa;Western Africa;French;fr;Niger,Níger,Niger,Niger,ニジェール,Niger,Niger;16,8;Nigerian;DZA,BEN,BFA,TCD,LBY,MLI,NGA;1267000\nNigeria;Nigeria;.ng;NG;566;NGA;NGN;234;Abuja;NG,Nijeriya,Naíjíríà,Federal Republic of Nigeria;1.5;Africa;Western Africa;English;en;Nigeria,Nigeria,Nigéria,Nigeria,ナイジェリア,Nigeria,Nigerija;10,8;Nigerian;BEN,CMR,TCD,NER;923768\nNiue;Niuē;.nu;NU;570;NIU;NZD;683;Alofi;NU;0.5;Oceania;Polynesia;Niuean,English;en;Niue,Niue,Niue,Niue,ニウエ,Niue,Niue;-19.03333333,-169.86666666;Niuean;;260\nNorfolk Island;Norfolk Island;.nf;NF;574;NFK;AUD;672;Kingston;NF,Territory of Norfolk Island,Teratri of Norf'k Ailen;0.5;Oceania;Australia and New Zealand;English,Norfuk;en;Île de Norfolk,Norfolkeiland,Norfolkinsel,Isola Norfolk,ノーフォーク島,Isla de Norfolk,Otok Norfolk;-29.03333333,167.95;Norfolk Islander;;36\nNorth Korea;북한;.kp;KP;408;PRK;KPW;850;Pyongyang;KP,Democratic People's Republic of Korea,조선민주주의인민공화국,Chosŏn Minjujuŭi Inmin Konghwaguk;0;Asia;Eastern Asia;Korean;ko;Nordkorea,Corea del Norte,Corée du Nord,Corea del Nord,朝鮮民主主義人民共和国,Noord-Korea,Sjeverna Koreja;40,127;North Korean;CHN,KOR,RUS;120538\nNorthern Mariana Islands;Northern Mariana Islands;.mp;MP;580;MNP;USD;1670;Saipan;MP,Commonwealth of the Northern Mariana Islands,Sankattan Siha Na Islas Mariånas;0.5;Oceania;Micronesia;English,Chamorro,Carolinian;en,ch;Nördliche Marianen,Islas Marianas del Norte,Îles Mariannes du Nord,Isole Marianne Settentrionali,北マリアナ諸島,Noordelijke Marianeneilanden,Sjevernomarijanski otoci;15.2,145.75;American;;464\nNorway;Norge;.no;NO;578;NOR;NOK;47;Oslo;NO,Norge,Noreg,Kingdom of Norway,Kongeriket Norge,Kongeriket Noreg;1.5;Europe;Northern Europe;Norwegian,Bokmål,Nynorsk;no,nb,nn;Norwegen,Noruega,Norvège,Norvegia,ノルウェー,Noorwegen,Norveška;62,10;Norwegian;FIN,SWE,RUS;323802\nOman;عمان;.om;OM;512;OMN;OMR;968;Muscat;OM,Sultanate of Oman,Salṭanat ʻUmān;0;Asia;Western Asia;Arabic;ar;Oman,Omán,Oman,oman,オマーン,Oman,Oman;21,57;Omani;SAU,ARE,YEM;309500\nPakistan;Pakistan;.pk;PK;586;PAK;PKR;92;Islamabad;PK,Pākistān,Islamic Republic of Pakistan,Islāmī Jumhūriya'eh Pākistān;2;Asia;Southern Asia;English,Urdu;en,ur;Pakistan,Pakistán,Pakistan,Pakistan,パキスタン,Pakistan,Pakistan;30,70;Pakistani;AFG,CHN,IND,IRN;881912\nPalau;Palau;.pw;PW;585;PLW;USD;680;Ngerulmud;PW,Republic of Palau,Beluu er a Belau;0.5;Oceania;Micronesia;English,Palauan;en;Palau,Palau,Palaos,Palau,パラオ,Palau,Palau;7.5,134.5;Palauan;;459\nPalestine;فلسطين;.ps;PS;275;PSE;ILS;970;Ramallah;PS,State of Palestine,Dawlat Filasṭin;0;Asia;Western Asia;Arabic;ar;Palästina,Palestina,Palestine,Palestina,パレスチナ,Palestijnse gebieden,Palestina;31.9,35.2;Palestinian;ISR,EGY,JOR;-1\nPanama;Panamá;.pa;PA;591;PAN;PAB,USD;507;Panama City;PA,Republic of Panama,República de Panamá;0;Americas;Central America;Spanish;es;Panama,Panamá,Panama,Panama,パナマ,Panama,Panama;9,-80;Panamanian;COL,CRI;75417\nPapua New Guinea;Papua Niugini;.pg;PG;598;PNG;PGK;675;Port Moresby;PG,Independent State of Papua New Guinea,Independen Stet bilong Papua Niugini;0;Oceania;Melanesia;Hiri Motu,Tok Pisin,English;en;Papua-Neuguinea,Papúa Nueva Guinea,Papouasie-Nouvelle-Guinée,Papua Nuova Guinea,パプアニューギニア,Papoea-Nieuw-Guinea,Papua Nova Gvineja;-6,147;Papua New Guinean;IDN;462840\nParaguay;Paraguay;.py;PY;600;PRY;PYG;595;Asunción;PY,Republic of Paraguay,República del Paraguay,Tetã Paraguái;0;Americas;South America;Spanish,Guaraní;es,gn;Paraguay,Paraguay,Paraguay,Paraguay,パラグアイ,Paraguay,Paragvaj;-23,-58;Paraguayan;ARG,BOL,BRA;406752\nPeru;Perú;.pe;PE;604;PER;PEN;51;Lima;PE,Republic of Peru, República del Perú;0;Americas;South America;Spanish,Quechua,Aymara;es;Peru,Perú,Pérou,Perù,ペルー,Peru,Peru;-10,-76;Peruvian;BOL,BRA,CHL,COL,ECU;1285216\nPhilippines;Pilipinas;.ph;PH;608;PHL;PHP;63;Manila;PH,Republic of the Philippines,Repúblika ng Pilipinas;1.5;Asia;South-Eastern Asia;Filipino,English;en;Philippines,Filipijnen,Philippinen,Filippine,フィリピン,Filipinas,Filipini;13,122;Filipino;;342353\nPitcairn Islands;Pitcairn Islands;.pn;PN;612;PCN;NZD;64;Adamstown;PN,Pitcairn Henderson Ducie and Oeno Islands;0.5;Oceania;Polynesia;English;en;Pitcairn,Islas Pitcairn,Îles Pitcairn,Isole Pitcairn,ピトケアン,Pitcairneilanden,Pitcairnovo otočje;-25.06666666,-130.1;Pitcairn Islander;;47\nPoland;Polska;.pl;PL;616;POL;PLN;48;Warsaw;PL,Republic of Poland,Rzeczpospolita Polska;1.25;Europe;Eastern Europe;Polish;pl;Polen,Polonia,Pologne,Polonia,ポーランド,Polen,Poljska;52,20;Polish;BLR,CZE,DEU,LTU,RUS,SVK,UKR;312679\nPortugal;Portugal;.pt;PT;620;PRT;EUR;351;Lisbon;PT,Portuguesa,Portuguese Republic,República Portuguesa;1.5;Europe;Southern Europe;Portuguese;pt;Portugal,Portugal,Portugal,Portogallo,ポルトガル,Portugal,Portugal;39.5,-8;Portuguese;ESP;92090\nPuerto Rico;Puerto Rico;.pr;PR;630;PRI;USD;1787,1939;San Juan;PR,Commonwealth of Puerto Rico,Estado Libre Asociado de Puerto Rico;0;Americas;Caribbean;Spanish,English;es,en;Puerto Rico,Puerto Rico,Porto Rico,Porto Rico,プエルトリコ,Puerto Rico,Portoriko;18.25,-66.5;Puerto Rican;;8870\nQatar;قطر;.qa;QA;634;QAT;QAR;974;Doha;QA,State of Qatar,Dawlat Qaṭar;0;Asia;Western Asia;Arabic;ar;Katar,Catar,Qatar,Qatar,カタール,Qatar,Katar;25.5,51.25;Qatari;SAU;11586\nRepublic of Kosovo;Republika e Kosovës;;XK;780;KOS;EUR;377,381,386;Pristina;XK,Република Косово;0;Europe;Eastern Europe;Albanian,Serbian;sq,sr;Kosovo,Kosovo;42.666667,21.166667;Kosovar;ALB,MKD,MNE,SRB;-1\nRéunion;La Réunion;.re;RE;638;REU;EUR;262;Saint-Denis;RE,Reunion;0;Africa;Eastern Africa;French;fr;Réunion,Reunión,Réunion,Riunione,レユニオン,Réunion,Réunion;-21.15,55.5;French;;-1\nRomania;România;.ro;RO;642;ROU;RON;40;Bucharest;RO,Rumania,Roumania,România;0;Europe;Eastern Europe;Romanian;ro;Rumänien,Rumania,Roumanie,Romania,ルーマニア,Roemenië,Rumunjska;46,25;Romanian;BGR,HUN,MDA,SRB,UKR;238391\nRussia;Россия;.ru;RU;643;RUS;RUB;7;Moscow;RU,Rossiya,Russian Federation,Российская Федерация,Rossiyskaya Federatsiya;2.5;Europe;Eastern Europe;Russian;ru;Russland,Rusia,Russie,Russia,ロシア連邦,Rusland,Rusija;60,100;Russian;AZE,BLR,CHN,EST,FIN,GEO,KAZ,PRK,LVA,LTU,MNG,NOR,POL,UKR;17098242\nRwanda;Rwanda;.rw;RW;646;RWA;RWF;250;Kigali;RW,Republic of Rwanda,Repubulika y'u Rwanda,République du Rwanda;0;Africa;Eastern Africa;Kinyarwanda,French,English;rw,en,fr;Ruanda,Ruanda,Rwanda,Ruanda,ルワンダ,Rwanda,Ruanda;-2,30;Rwandan;BDI,COD,TZA,UGA;26338\nSaint Barthélemy;Saint-Barthélemy;.bl;BL;652;BLM;EUR;590;Gustavia;BL,St. Barthelemy,Collectivity of Saint Barthélemy,Collectivité de Saint-Barthélemy;0;Americas;Caribbean;French;fr;Saint-Barthélemy,San Bartolomé,Saint-Barthélemy,Antille Francesi,サン・バルテルミー,Saint Barthélemy,Saint Barthélemy;18.5,-63.41666666;Saint Barthélemy Islander;;21\nSaint Helena;Saint Helena;.sh;SH;654;SHN;SHP;290;Jamestown;SH;0;Africa;Western Africa;English;en;Sankt Helena,Santa Helena,Sainte-Hélène,Sant'Elena,セントヘレナ・アセンションおよびトリスタンダクーニャ,Sint-Helena,Sveta Helena;-15.95,-5.7;Saint Helenian;;-1\nSaint Kitts and Nevis;Saint Kitts and Nevis;.kn;KN;659;KNA;XCD;1869;Basseterre;KN,Federation of Saint Christopher and Nevis;0;Americas;Caribbean;English;en;St. Kitts und Nevis,San Cristóbal y Nieves,Saint-Christophe-et-Niévès,Saint Kitts e Nevis,セントクリストファー・ネイビス,Saint Kitts en Nevis,Sveti Kristof i Nevis;17.33333333,-62.75;Kittian and Nevisian;;261\nSaint Lucia;Saint Lucia;.lc;LC;662;LCA;XCD;1758;Castries;LC;0;Americas;Caribbean;English;en;Saint Lucia,Santa Lucía,Saint-Lucie,Santa Lucia,セントルシア,Saint Lucia,Sveta Lucija;13.88333333,-60.96666666;Saint Lucian;;616\nSaint Martin;Saint-Martin;.mf,.fr,.gp;MF;663;MAF;EUR;590;Marigot;MF,Collectivity of Saint Martin,Collectivité de Saint-Martin;0;Americas;Caribbean;French;en,fr,nl;Saint Martin,Saint Martin,Saint-Martin,Saint Martin,サン・マルタン（フランス領）,Saint-Martin,Sveti Martin;18.08333333,-63.95;Saint Martin Islander;SXM,NLD;-1\nSaint Pierre and Miquelon;Saint-Pierre-et-Miquelon;.pm;PM;666;SPM;EUR;508;Saint-Pierre;PM,Collectivité territoriale de Saint-Pierre-et-Miquelon;0;Americas;Northern America;French;fr;Saint-Pierre und Miquelon,San Pedro y Miquelón,Saint-Pierre-et-Miquelon,Saint-Pierre e Miquelon,サンピエール島・ミクロン島,Saint Pierre en Miquelon,Sveti Petar i Mikelon;46.83333333,-56.33333333;French;;242\nSaint Vincent and the Grenadines;Saint Vincent and the Grenadines;.vc;VC;670;VCT;XCD;1784;Kingstown;VC;0;Americas;Caribbean;English;en;Saint Vincent und die Grenadinen,San Vicente y Granadinas,Saint-Vincent-et-les-Grenadines,Saint Vincent e Grenadine,セントビンセントおよびグレナディーン諸島,Saint Vincent en de Grenadines,Sveti Vincent i Grenadini;13.25,-61.2;Saint Vincentian;;389\nSamoa;Samoa;.ws;WS;882;WSM;WST;685;Apia;WS,Independent State of Samoa,Malo Saʻoloto Tutoʻatasi o Sāmoa;0;Oceania;Polynesia;Samoan,English;sm,en;Samoa,Samoa,Samoa,Samoa,サモア,Samoa,Samoa;-13.58333333,-172.33333333;Samoan;;2842\nSan Marino;San Marino;.sm;SM;674;SMR;EUR;378;City of San Marino;SM,Republic of San Marino,Repubblica di San Marino;0;Europe;Southern Europe;Italian;it;San Marino,San Marino,Saint-Marin,San Marino,サンマリノ,San Marino,San Marino;43.76666666,12.41666666;Sammarinese;ITA;61\nSão Tomé and Príncipe;São Tomé e Príncipe;.st;ST;678;STP;STD;239;São Tomé;ST,Democratic Republic of São Tomé and Príncipe,República Democrática de São Tomé e Príncipe;0;Africa;Middle Africa;Portuguese;pt;São Tomé und Príncipe,Santo Tomé y Príncipe,Sao Tomé-et-Principe,São Tomé e Príncipe,サントメ・プリンシペ,Sao Tomé en Principe,Sveti Toma i Princip;1,7;Sao Tomean;;964\nSaudi Arabia;العربية السعودية;.sa;SA;682;SAU;SAR;966;Riyadh;SA,Kingdom of Saudi Arabia,Al-Mamlakah al-‘Arabiyyah as-Su‘ūdiyyah;0;Asia;Western Asia;Arabic;ar;Saudi-Arabien,Arabia Saudí,Arabie Saoudite,Arabia Saudita,サウジアラビア,Saoedi-Arabië,Saudijska Arabija;25,45;Saudi Arabian;IRQ,JOR,KWT,OMN,QAT,ARE,YEM;2149690\nSenegal;Sénégal;.sn;SN;686;SEN;XOF;221;Dakar;SN,Republic of Senegal,République du Sénégal;0;Africa;Western Africa;French;fr;Senegal,Senegal,Sénégal,Senegal,セネガル,Senegal,Senegal;14,-14;Senegalese;The Gambia,GIN,GNB,MLI,MRT;196722\nSerbia;Србија;.rs;RS;688;SRB;RSD;381;Belgrade;RS,Srbija,Republic of Serbia,Република Србија,Republika Srbija;0;Europe;Southern Europe;Serbian;sr;Serbien,Serbia,Serbie,Serbia,セルビア,Servië,Srbija;44,21;Serbian;BIH,BGR,HRV,HUN,KOS,MKD,MNE,ROU;88361\nSeychelles;Seychelles;.sc;SC;690;SYC;SCR;248;Victoria;SC,Republic of Seychelles,Repiblik Sesel,République des Seychelles;0.5;Africa;Eastern Africa;French,English,Seychellois Creole;fr,en;Seychellen,Seychelles,Seychelles,Seychelles,セーシェル,Seychellen,Sejšeli;-4.58333333,55.66666666;Seychellois;;452\nSierra Leone;Sierra Leone;.sl;SL;694;SLE;SLL;232;Freetown;SL,Republic of Sierra Leone;0;Africa;Western Africa;English;en;Sierra Leone,Sierra Leone,Sierra Leone,Sierra Leone,シエラレオネ,Sierra Leone,Sijera Leone;8.5,-11.5;Sierra Leonean;GIN,LBR;71740\nSingapore;Singapore;.sg;SG;702;SGP;SGD;65;Singapore;SG,Singapura,Republik Singapura,新加坡共和国;0;Asia;South-Eastern Asia;English,Malay,Mandarin,Tamil;en,ms,ta,zh;Singapour,Singapore,Singapur,Singapore,シンガポール,Singapur,Singapur;1.36666666,103.8;Singaporean;;710\nSint Maarten;Sint Maarten;.sx;SX;534;SXM;ANG;1721;Philipsburg;SX;0;Americas;Caribbean;Dutch,English;nl,en;Sint Maarten;18.033333,-63.05;Dutch;MAF;34\nSlovakia;Slovensko;.sk;SK;703;SVK;EUR;421;Bratislava;SK,Slovak Republic,Slovenská republika;0;Europe;Eastern Europe;Slovak;sk;Slowakei,República Eslovaca,Slovaquie,Slovacchia,スロバキア,Slowakije,Slovačka;48.66666666,19.5;Slovak;AUT,CZE,HUN,POL,UKR;49037\nSlovenia;Slovenija;.si;SI;705;SVN;EUR;386;Ljubljana;SI,Republic of Slovenia,Republika Slovenija;0;Europe;Southern Europe;Slovene;sl;Slowenien,Eslovenia,Slovénie,Slovenia,スロベニア,Slovenië,Slovenija;46.11666666,14.81666666;Slovene;AUT,HRV,ITA,HUN;20273\nSolomon Islands;Solomon Islands;.sb;SB;090;SLB;SDB;677;Honiara;SB;0;Oceania;Melanesia;English;en;Salomonen,Islas Salomón,Îles Salomon,Isole Salomone,ソロモン諸島,Salomonseilanden,Solomonski Otoci;-8,159;Solomon Islander;;28896\nSomalia;Soomaaliya;.so;SO;706;SOM;SOS;252;Mogadishu;SO,aṣ-Ṣūmāl,Federal Republic of Somalia,Jamhuuriyadda Federaalka Soomaaliya,Jumhūriyyat aṣ-Ṣūmāl al-Fiderāliyya;0;Africa;Eastern Africa;Somali,Arabic;so,ar;Somalia,Somalia,Somalie,Somalia,ソマリア,Somalië,Somalija;10,49;Somali;DJI,ETH,KEN;637657\nSouth Africa;South Africa;.za;ZA;710;ZAF;ZAR;27;Pretoria;ZA,RSA,Suid-Afrika,Republic of South Africa;0;Africa;Southern Africa;Afrikaans,English,Southern Ndebele,Northern Sotho,Southern Sotho,Swazi,Tsonga,Tswana,Venda,Xhosa,Zulu;af,en,nr,st,ss,tn,ts,ve,xh,zu;Republik Südafrika,República de Sudáfrica,Afrique du Sud,Sud Africa,南アフリカ,Zuid-Afrika,Južnoafrička Republika;-29,24;South African;BWA,LSO,MOZ,NAM,SWZ,ZWE;1221037\nSouth Georgia;South Georgia;.gs;GS;239;SGS;GBP;500;King Edward Point;GS,South Georgia and the South Sandwich Islands;0;Americas;South America;English;en;Südgeorgien und die Südlichen Sandwichinseln,Islas Georgias del Sur y Sandwich del Sur,Géorgie du Sud-et-les Îles Sandwich du Sud,Georgia del Sud e Isole Sandwich Meridionali,サウスジョージア・サウスサンドウィッチ諸島,Zuid-Georgia en Zuidelijke Sandwicheilanden,Južna Georgija i otočje Južni Sandwich;-54.5,-37;South Georgia and the South Sandwich Islander;;-1\nSouth Korea;대한민국;.kr;KR;410;KOR;KRW;82;Seoul;KR,Republic of Korea;1.5;Asia;Eastern Asia;Korean;ko;Südkorea,Corea del Sur,Corée du Sud,Corea del Sud,大韓民国,Zuid-Korea,Južna Koreja;37,127.5;South Korean;PRK;100210\nSouth Sudan;South Sudan;.ss;SS;728;SSD;SSP;211;Juba;SS;0;Africa;Middle Africa;English;en;Soudan du Sud,Zuid-Soedan,Südsudan,Sudan del sud,南スーダン,Sudán del Sur,Južni Sudan;7,30;South Sudanese;CAF,COD,ETH,KEN,SDN,UGA;619745\nSpain;España;.es;ES;724;ESP;EUR;34;Madrid;ES,Kingdom of Spain,Reino de España;2;Europe;Southern Europe;Spanish,Basque,Catalan,Galician,Occitan;es,eu,ca,gl,oc;Spanien,España,Espagne,Spagna,スペイン,Spanje,Španjolska;40,-4;Spanish;AND,FRA,GIB,PRT,MAR;505992\nSri Lanka;śrī laṃkāva;.lk;LK;144;LKA;LKR;94;Colombo;LK,ilaṅkai,Democratic Socialist Republic of Sri Lanka;0;Asia;Southern Asia;Sinhala,Tamil;si,ta;Sri Lanka,Sri Lanka,Sri Lanka,Sri Lanka,スリランカ,Sri Lanka,Šri Lanka;7,81;Sri Lankan;IND;65610\nSudan;السودان;.sd;SD;729;SDN;SDG;249;Khartoum;SD,Republic of the Sudan,Jumhūrīyat as-Sūdān;0;Africa;Northern Africa;Arabic,English;ar,en;Sudan,Sudán,Soudan,Sudan,スーダン,Soedan,Sudan;15,30;Sudanese;CAF,TCD,EGY,ERI,ETH,LBY,SSD;1886068\nSuriname;Suriname;.sr;SR;740;SUR;SRD;597;Paramaribo;SR,Sarnam,Sranangron,Republic of Suriname,Republiek Suriname;0;Americas;South America;Dutch;nl;Suriname,Surinam,Surinam,Suriname,スリナム,Suriname,Surinam;4,-56;Surinamer;BRA,GUF,FRA,GUY;163820\nSvalbard and Jan Mayen;Svalbard og Jan Mayen;.sj;SJ;744;SJM;NOK;4779;Longyearbyen;SJ,Svalbard and Jan Mayen Islands;0.5;Europe;Northern Europe;Norwegian;no;Svalbard und Jan Mayen,Islas Svalbard y Jan Mayen,Svalbard et Jan Mayen,Svalbard e Jan Mayen,スヴァールバル諸島およびヤンマイエン島,Svalbard en Jan Mayen,Svalbard i Jan Mayen;78,20;Norwegian;;-1\nSwaziland;Swaziland;.sz;SZ;748;SWZ;SZL;268;Lobamba;SZ,weSwatini,Swatini,Ngwane,Kingdom of Swaziland,Umbuso waseSwatini;0;Africa;Southern Africa;Swazi,English;en,ss;Swasiland,Suazilandia,Swaziland,Swaziland,スワジランド,Swaziland,Svazi;-26.5,31.5;Swazi;MOZ,ZAF;17364\nSweden;Sverige;.se;SE;752;SWE;SEK;46;Stockholm;SE,Kingdom of Sweden,Konungariket Sverige;1.5;Europe;Northern Europe;Swedish;sv;Schweden,Suecia,Suède,Svezia,スウェーデン,Zweden,Švedska;62,15;Swedish;FIN,NOR;450295\nSwitzerland;Schweiz;.ch;CH;756;CHE;CHE,CHF,CHW;41;Bern;CH,Swiss Confederation,Schweiz,Suisse,Svizzera,Svizra;1.5;Europe;Western Europe;German,French,Italian,Romansh;de,fr,it;Schweiz,Suiza,Suisse,Svizzera,スイス,Zwitserland,Švicarska;47,8;Swiss;AUT,FRA,ITA,LIE,DEU;41284\nSyria;سوريا;.sy;SY;760;SYR;SYP;963;Damascus;SY,Syrian Arab Republic,Al-Jumhūrīyah Al-ʻArabīyah As-Sūrīyah;0;Asia;Western Asia;Arabic;ar;Syrien,Siria,Syrie,Siria,シリア・アラブ共和国,Syrië,Sirija;35,38;Syrian;IRQ,ISR,JOR,LBN,TUR;185180\nTaiwan;臺灣;.tw;TW;158;TWN;TWD;886;Taipei;TW,Táiwān,Republic of China,中華民國,Zhōnghuá Mínguó;0;Asia;Eastern Asia;Standard Chinese;zh;Taiwan,Taiwán,Taïwan,Taiwan,台湾（台湾省/中華民国）,Taiwan,Tajvan;23.5,121;Taiwanese;;36193\nTajikistan;Тоҷикистон;.tj;TJ;762;TJK;TJS;992;Dushanbe;TJ,Toçikiston,Republic of Tajikistan,Ҷумҳурии Тоҷикистон,Çumhuriyi Toçikiston;0;Asia;Central Asia;Tajik;tg,ru;Tadschikistan,Tayikistán,Tadjikistan,Tagikistan,タジキスタン,Tadzjikistan,Tađikistan;39,71;Tadzhik;AFG,CHN,KGZ,UZB;143100\nTanzania;Tanzania;.tz;TZ;834;TZA;TZS;255;Dodoma;TZ,United Republic of Tanzania,Jamhuri ya Muungano wa Tanzania;0;Africa;Eastern Africa;Swahili,English;sw,en;Tansania,Tanzania,Tanzanie,Tanzania,タンザニア,Tanzania,Tanzanija;-6,35;Tanzanian;BDI,COD,KEN,MWI,MOZ,RWA,UGA,ZMB;945087\nThailand;ประเทศไทย;.th;TH;764;THA;THB;66;Bangkok;TH,Prathet,Thai,Kingdom of Thailand,ราชอาณาจักรไทย,Ratcha Anachak Thai;0;Asia;South-Eastern Asia;Thai;th;Thaïlande,Thailand,Thailand,Tailandia,タイ,Tailandia,Tajland;15,100;Thai;Burma,KHM,LAO,MYS;513120\nTimor-Leste;Timor-Leste;.tl;TL;626;TLS;USD;670;Dili;TL,East Timor,Democratic Republic of Timor-Leste,República Democrática de Timor-Leste,Repúblika Demokrátika Timór-Leste;0;Asia;South-Eastern Asia;Portuguese,Tetum;pt;Timor oriental,Oost-Timor,Timor-Leste,Timor Est,東ティモール,Timor Oriental,Istočni Timor;-8.83333333,125.91666666;East Timorese;IDN;14874\nTogo;Togo;.tg;TG;768;TGO;XOF;228;Lomé;TG,Togolese,Togolese Republic,République Togolaise;0;Africa;Western Africa;French;fr;Togo,Togo,Togo,Togo,トーゴ,Togo,Togo;8,1.16666666;Togolese;BEN,BFA,GHA;56785\nTokelau;Tokelau;.tk;TK;772;TKL;NZD;690;Fakaofo;TK;0.5;Oceania;Polynesia;Tokelauan,English,Samoan;en;Tokelau,Islas Tokelau,Tokelau,Isole Tokelau,トケラウ,Tokelau,Tokelau;-9,-172;Tokelauan;;12\nTonga;Tonga;.to;TO;776;TON;TOP;676;Nuku'alofa;TO;0;Oceania;Polynesia;Tongan,English;en,to;Tonga,Tonga,Tonga,Tonga,トンガ,Tonga,Tonga;-20,-175;Tongan;;747\nTrinidad and Tobago;Trinidad and Tobago;.tt;TT;780;TTO;TTD;1868;Port of Spain;TT,Republic of Trinidad and Tobago;0;Americas;Caribbean;English;en;Trinidad und Tobago,Trinidad y Tobago,Trinité et Tobago,Trinidad e Tobago,トリニダード・トバゴ,Trinidad en Tobago,Trinidad i Tobago;11,-61;Trinidadian;;5130\nTunisia;تونس;.tn;TN;788;TUN;TND;216;Tunis;TN,Republic of Tunisia,al-Jumhūriyyah at-Tūnisiyyah;0;Africa;Northern Africa;Arabic;ar;Tunesien,Túnez,Tunisie,Tunisia,チュニジア,Tunesië,Tunis;34,9;Tunisian;DZA,LBY;163610\nTurkey;Türkiye;.tr;TR;792;TUR;TRY;90;Ankara;TR,Turkiye,Republic of Turkey,Türkiye Cumhuriyeti;0;Asia;Western Asia;Turkish;tr;Türkei,Turquía,Turquie,Turchia,トルコ,Turkije,Turska;39,35;Turkish;ARM,AZE,BGR,GEO,GRC,IRN,IRQ,SYR;783562\nTurkmenistan;Türkmenistan;.tm;TM;795;TKM;TMT;993;Ashgabat;TM;0;Asia;Central Asia;Turkmen;tk,ru;Turkmenistan,Turkmenistán,Turkménistan,Turkmenistan,トルクメニスタン,Turkmenistan,Turkmenistan;40,60;Turkmen;AFG,IRN,KAZ,UZB;488100\nTurks and Caicos Islands;Turks and Caicos Islands;.tc;TC;796;TCA;USD;1649;Cockburn Town;TC;0.5;Americas;Caribbean;English;en;Turks- und Caicosinseln,Islas Turks y Caicos,Îles Turques-et-Caïques,Isole Turks e Caicos,タークス・カイコス諸島,Turks- en Caicoseilanden,Otoci Turks i Caicos;21.75,-71.58333333;Turks and Caicos Islander;;948\nTuvalu;Tuvalu;.tv;TV;798;TUV;AUD;688;Funafuti;TV;0.5;Oceania;Polynesia;Tuvaluan,English;en;Tuvalu,Tuvalu,Tuvalu,Tuvalu,ツバル,Tuvalu,Tuvalu;-8,178;Tuvaluan;;26\nUganda;Uganda;.ug;UG;800;UGA;UGX;256;Kampala;UG,Republic of Uganda,Jamhuri ya Uganda;0;Africa;Eastern Africa;English,Swahili;en,sw;Uganda,Uganda,Uganda,Uganda,ウガンダ,Oeganda,Uganda;1,32;Ugandan;COD,KEN,RWA,SSD,TZA;241550\nUkraine;Україна;.ua;UA;804;UKR;UAH;380;Kiev;UA,Ukrayina;0;Europe;Eastern Europe;Ukrainian;uk;Ukraine,Ucrania,Ukraine,Ucraina,ウクライナ,Oekraïne,Ukrajina;49,32;Ukrainian;BLR,HUN,MDA,POL,ROU,RUS,SVK;603500\nUnited Arab Emirates;دولة الإمارات العربية المتحدة;.ae;AE;784;ARE;AED;971;Abu Dhabi;AE,UAE;0;Asia;Western Asia;Arabic;ar;Vereinigte Arabische Emirate,Emiratos Árabes Unidos,Émirats arabes unis,Emirati Arabi Uniti,アラブ首長国連邦,Verenigde Arabische Emiraten,Ujedinjeni Arapski Emirati;24,54;Emirati;OMN,SAU;83600\nUnited Kingdom;United Kingdom;.uk;GB;826;GBR;GBP;44;London;GB,UK,Great Britain;2.5;Europe;Northern Europe;English;en;Vereinigtes Königreich,Reino Unido,Royaume-Uni,Regno Unito,イギリス,Verenigd Koninkrijk,Ujedinjeno Kraljevstvo;54,-2;British;IRL;242900\nUnited States;United States;.us;US;840;USA;USD,USN,USS;1;Washington D.C.;US,USA,United States of America;3.5;Americas;Northern America;English;en;Vereinigte Staaten von Amerika,Estados Unidos,États-Unis,Stati Uniti D'America,アメリカ合衆国,Verenigde Staten,Sjedinjene Američke Države;38,-97;American;CAN,MEX;9372610\nUnited States Minor Outlying Islands;United States Minor Outlying Islands;.us;UM;581;UMI;USD;;;UM;0;Americas;Northern America;English;en;Kleinere Inselbesitzungen der Vereinigten Staaten,Islas Ultramarinas Menores de Estados Unidos,Îles mineures éloignées des États-Unis,Isole minori esterne degli Stati Uniti d'America,合衆国領有小離島,Kleine afgelegen eilanden van de Verenigde Staten,Mali udaljeni otoci SAD-a;;American;;-1\nUnited States Virgin Islands;United States Virgin Islands;.vi;VI;850;VIR;USD;1340;Charlotte Amalie;VI;0.5;Americas;Caribbean;English;en;Amerikanische Jungferninseln,Islas Vírgenes de los Estados Unidos,Îles Vierges des États-Unis,Isole Vergini americane,アメリカ領ヴァージン諸島,Amerikaanse Maagdeneilanden,Američki Djevičanski Otoci;18.35,-64.933333;Virgin Islander;;347\nUruguay;Uruguay;.uy;UY;858;URY;UYI,UYU;598;Montevideo;UY,Oriental Republic of Uruguay,República Oriental del Uruguay;0;Americas;South America;Spanish;es;Uruguay,Uruguay,Uruguay,Uruguay,ウルグアイ,Uruguay,Urugvaj;-33,-56;Uruguayan;ARG,BRA;181034\nUzbekistan;O‘zbekiston;.uz;UZ;860;UZB;UZS;998;Tashkent;UZ,Republic of Uzbekistan,O‘zbekiston Respublikasi,Ўзбекистон Республикаси;0;Asia;Central Asia;Uzbek;uz,ru;Usbekistan,Uzbekistán,Ouzbékistan,Uzbekistan,ウズベキスタン,Oezbekistan,Uzbekistan;41,64;Uzbekistani;AFG,KAZ,KGZ,TJK,TKM;447400\nVanuatu;Vanuatu;.vu;VU;548;VUT;VUV;678;Port Vila;VU,Republic of Vanuatu,Ripablik blong Vanuatu,République de Vanuatu;0;Oceania;Melanesia;Bislama,French,English;bi,en,fr;Vanuatu,Vanuatu,Vanuatu,Vanuatu,バヌアツ,Vanuatu,Vanuatu;-16,167;Ni-Vanuatu;;12189\nVenezuela;Venezuela;.ve;VE;862;VEN;VEF;58;Caracas;VE,Bolivarian Republic of Venezuela,República Bolivariana de Venezuela;0;Americas;South America;Spanish;es;Venezuela,Venezuela,Venezuela,Venezuela,ベネズエラ・ボリバル共和国,Venezuela,Venezuela;8,-66;Venezuelan;BRA,COL,GUY;916445\nVietnam;Việt Nam;.vn;VN;704;VNM;VND;84;Hanoi;VN,Socialist Republic of Vietnam,Cộng hòa Xã hội chủ nghĩa Việt Nam;1.5;Asia;South-Eastern Asia;Vietnamese;vi;Viêt Nam,Vietnam,Vietnam,Vietnam,ベトナム,Vietnam,Vijetnam;16.16666666,107.83333333;Vietnamese;KHM,CHN,LAO;331212\nWallis and Futuna;Wallis et Futuna;.wf;WF;876;WLF;XPF;681;Mata-Utu;WF,Territory of the Wallis and Futuna Islands,Territoire des îles Wallis et Futuna;0.5;Oceania;Polynesia;French;fr;Wallis und Futuna,Wallis y Futuna,Wallis-et-Futuna,Wallis e Futuna,ウォリス・フツナ,Wallis en Futuna,Wallis i Fortuna;-13.3,-176.2;Wallis and Futuna Islander;;142\nWestern Sahara;الصحراء الغربية;.eh;EH;732;ESH;MAD,DZD,MRO;212;El Aaiún;EH,Taneẓroft Tutrimt;0;Africa;Northern Africa;Berber,Hassaniya,Spanish;es;Westsahara,Sahara Occidental,Sahara Occidental,Sahara Occidentale,西サハラ,Westelijke Sahara,Zapadna Sahara;24.5,-13;Sahrawi;DZA,MRT,MAR;266000\nYemen;اليَمَن;.ye;YE;887;YEM;YER;967;Sana'a;YE,Yemeni Republic,al-Jumhūriyyah al-Yamaniyyah;0;Asia;Western Asia;Arabic;ar;Jemen,Yemen,Yémen,Yemen,イエメン,Jemen,Jemen;15,48;Yemeni;OMN,SAU;527968\nZambia;Zambia;.zm;ZM;894;ZMB;ZMK;260;Lusaka;ZM,Republic of Zambia;0;Africa;Eastern Africa;English;en;Sambia,Zambia,Zambie,Zambia,ザンビア,Zambia,Zambija;-15,30;Zambian;AGO,BWA,COD,MWI,MOZ,NAM,TZA,ZWE;752612\nZimbabwe;Zimbabwe;.zw;ZW;716;ZWE;ZWL;263;Harare;ZW,Republic of Zimbabwe;0;Africa;Eastern Africa;Chewa,Chibarwe,English,Kalanga,Koisan,Nambya,Ndau,Ndebele,Shangani,Shona,Zimbabwean sign language,Sotho,Tonga,Tswana,Venda,Xhosa;en,sn,nd;Simbabwe,Zimbabue,Zimbabwe,Zimbabwe,ジンバブエ,Zimbabwe,Zimbabve;-20,30;Zimbabwean;BWA,MOZ,ZAF,ZMB;390757\n"
  },
  {
    "path": "src/core/private/serpent_sbox.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/* THIS IS serpent_sbox.h\n * #include it in simpleqtcryptor.c for faster serpent\n */\n\n#include <QtGlobal>\n\n#define WITH_SERPENT_FAST_SBOX\n\nconst quint16 serpent_sbox_fast_data[] = {\n\n// SBOX: 0 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x0008,0x0400,0x0408,0x0200,0x0208,0x0600,0x0608,\n0x0020,0x0028,0x0420,0x0428,0x0220,0x0228,0x0620,0x0628,\n0x8000,0x8008,0x8400,0x8408,0x8200,0x8208,0x8600,0x8608,\n0x8020,0x8028,0x8420,0x8428,0x8220,0x8228,0x8620,0x8628,\n0x0010,0x0018,0x0410,0x0418,0x0210,0x0218,0x0610,0x0618,\n0x0030,0x0038,0x0430,0x0438,0x0230,0x0238,0x0630,0x0638,\n0x8010,0x8018,0x8410,0x8418,0x8210,0x8218,0x8610,0x8618,\n0x8030,0x8038,0x8430,0x8438,0x8230,0x8238,0x8630,0x8638,\n  /* *** 64 - 127 *** */\n0x1000,0x1008,0x1400,0x1408,0x1200,0x1208,0x1600,0x1608,\n0x1020,0x1028,0x1420,0x1428,0x1220,0x1228,0x1620,0x1628,\n0x9000,0x9008,0x9400,0x9408,0x9200,0x9208,0x9600,0x9608,\n0x9020,0x9028,0x9420,0x9428,0x9220,0x9228,0x9620,0x9628,\n0x1010,0x1018,0x1410,0x1418,0x1210,0x1218,0x1610,0x1618,\n0x1030,0x1038,0x1430,0x1438,0x1230,0x1238,0x1630,0x1638,\n0x9010,0x9018,0x9410,0x9418,0x9210,0x9218,0x9610,0x9618,\n0x9030,0x9038,0x9430,0x9438,0x9230,0x9238,0x9630,0x9638,\n  /* *** 128 - 191 *** */\n0x0004,0x000c,0x0404,0x040c,0x0204,0x020c,0x0604,0x060c,\n0x0024,0x002c,0x0424,0x042c,0x0224,0x022c,0x0624,0x062c,\n0x8004,0x800c,0x8404,0x840c,0x8204,0x820c,0x8604,0x860c,\n0x8024,0x802c,0x8424,0x842c,0x8224,0x822c,0x8624,0x862c,\n0x0014,0x001c,0x0414,0x041c,0x0214,0x021c,0x0614,0x061c,\n0x0034,0x003c,0x0434,0x043c,0x0234,0x023c,0x0634,0x063c,\n0x8014,0x801c,0x8414,0x841c,0x8214,0x821c,0x8614,0x861c,\n0x8034,0x803c,0x8434,0x843c,0x8234,0x823c,0x8634,0x863c,\n  /* *** 192 - 255 *** */\n0x1004,0x100c,0x1404,0x140c,0x1204,0x120c,0x1604,0x160c,\n0x1024,0x102c,0x1424,0x142c,0x1224,0x122c,0x1624,0x162c,\n0x9004,0x900c,0x9404,0x940c,0x9204,0x920c,0x9604,0x960c,\n0x9024,0x902c,0x9424,0x942c,0x9224,0x922c,0x9624,0x962c,\n0x1014,0x101c,0x1414,0x141c,0x1214,0x121c,0x1614,0x161c,\n0x1034,0x103c,0x1434,0x143c,0x1234,0x123c,0x1634,0x163c,\n0x9014,0x901c,0x9414,0x941c,0x9214,0x921c,0x9614,0x961c,\n0x9034,0x903c,0x9434,0x943c,0x9234,0x923c,0x9634,0x963c,\n// SBOX: 0 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x2000,0x0080,0x2080,0x0040,0x2040,0x00c0,0x20c0,\n0x0001,0x2001,0x0081,0x2081,0x0041,0x2041,0x00c1,0x20c1,\n0x0100,0x2100,0x0180,0x2180,0x0140,0x2140,0x01c0,0x21c0,\n0x0101,0x2101,0x0181,0x2181,0x0141,0x2141,0x01c1,0x21c1,\n0x0800,0x2800,0x0880,0x2880,0x0840,0x2840,0x08c0,0x28c0,\n0x0801,0x2801,0x0881,0x2881,0x0841,0x2841,0x08c1,0x28c1,\n0x0900,0x2900,0x0980,0x2980,0x0940,0x2940,0x09c0,0x29c0,\n0x0901,0x2901,0x0981,0x2981,0x0941,0x2941,0x09c1,0x29c1,\n  /* *** 64 - 127 *** */\n0x0002,0x2002,0x0082,0x2082,0x0042,0x2042,0x00c2,0x20c2,\n0x0003,0x2003,0x0083,0x2083,0x0043,0x2043,0x00c3,0x20c3,\n0x0102,0x2102,0x0182,0x2182,0x0142,0x2142,0x01c2,0x21c2,\n0x0103,0x2103,0x0183,0x2183,0x0143,0x2143,0x01c3,0x21c3,\n0x0802,0x2802,0x0882,0x2882,0x0842,0x2842,0x08c2,0x28c2,\n0x0803,0x2803,0x0883,0x2883,0x0843,0x2843,0x08c3,0x28c3,\n0x0902,0x2902,0x0982,0x2982,0x0942,0x2942,0x09c2,0x29c2,\n0x0903,0x2903,0x0983,0x2983,0x0943,0x2943,0x09c3,0x29c3,\n  /* *** 128 - 191 *** */\n0x4000,0x6000,0x4080,0x6080,0x4040,0x6040,0x40c0,0x60c0,\n0x4001,0x6001,0x4081,0x6081,0x4041,0x6041,0x40c1,0x60c1,\n0x4100,0x6100,0x4180,0x6180,0x4140,0x6140,0x41c0,0x61c0,\n0x4101,0x6101,0x4181,0x6181,0x4141,0x6141,0x41c1,0x61c1,\n0x4800,0x6800,0x4880,0x6880,0x4840,0x6840,0x48c0,0x68c0,\n0x4801,0x6801,0x4881,0x6881,0x4841,0x6841,0x48c1,0x68c1,\n0x4900,0x6900,0x4980,0x6980,0x4940,0x6940,0x49c0,0x69c0,\n0x4901,0x6901,0x4981,0x6981,0x4941,0x6941,0x49c1,0x69c1,\n  /* *** 192 - 255 *** */\n0x4002,0x6002,0x4082,0x6082,0x4042,0x6042,0x40c2,0x60c2,\n0x4003,0x6003,0x4083,0x6083,0x4043,0x6043,0x40c3,0x60c3,\n0x4102,0x6102,0x4182,0x6182,0x4142,0x6142,0x41c2,0x61c2,\n0x4103,0x6103,0x4183,0x6183,0x4143,0x6143,0x41c3,0x61c3,\n0x4802,0x6802,0x4882,0x6882,0x4842,0x6842,0x48c2,0x68c2,\n0x4803,0x6803,0x4883,0x6883,0x4843,0x6843,0x48c3,0x68c3,\n0x4902,0x6902,0x4982,0x6982,0x4942,0x6942,0x49c2,0x69c2,\n0x4903,0x6903,0x4983,0x6983,0x4943,0x6943,0x49c3,0x69c3,\n// SBOX: 1 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x1000,0x0008,0x1008,0x0200,0x1200,0x0208,0x1208,\n0x0001,0x1001,0x0009,0x1009,0x0201,0x1201,0x0209,0x1209,\n0x0002,0x1002,0x000a,0x100a,0x0202,0x1202,0x020a,0x120a,\n0x0003,0x1003,0x000b,0x100b,0x0203,0x1203,0x020b,0x120b,\n0x2000,0x3000,0x2008,0x3008,0x2200,0x3200,0x2208,0x3208,\n0x2001,0x3001,0x2009,0x3009,0x2201,0x3201,0x2209,0x3209,\n0x2002,0x3002,0x200a,0x300a,0x2202,0x3202,0x220a,0x320a,\n0x2003,0x3003,0x200b,0x300b,0x2203,0x3203,0x220b,0x320b,\n  /* *** 64 - 127 *** */\n0x0080,0x1080,0x0088,0x1088,0x0280,0x1280,0x0288,0x1288,\n0x0081,0x1081,0x0089,0x1089,0x0281,0x1281,0x0289,0x1289,\n0x0082,0x1082,0x008a,0x108a,0x0282,0x1282,0x028a,0x128a,\n0x0083,0x1083,0x008b,0x108b,0x0283,0x1283,0x028b,0x128b,\n0x2080,0x3080,0x2088,0x3088,0x2280,0x3280,0x2288,0x3288,\n0x2081,0x3081,0x2089,0x3089,0x2281,0x3281,0x2289,0x3289,\n0x2082,0x3082,0x208a,0x308a,0x2282,0x3282,0x228a,0x328a,\n0x2083,0x3083,0x208b,0x308b,0x2283,0x3283,0x228b,0x328b,\n  /* *** 128 - 191 *** */\n0x0400,0x1400,0x0408,0x1408,0x0600,0x1600,0x0608,0x1608,\n0x0401,0x1401,0x0409,0x1409,0x0601,0x1601,0x0609,0x1609,\n0x0402,0x1402,0x040a,0x140a,0x0602,0x1602,0x060a,0x160a,\n0x0403,0x1403,0x040b,0x140b,0x0603,0x1603,0x060b,0x160b,\n0x2400,0x3400,0x2408,0x3408,0x2600,0x3600,0x2608,0x3608,\n0x2401,0x3401,0x2409,0x3409,0x2601,0x3601,0x2609,0x3609,\n0x2402,0x3402,0x240a,0x340a,0x2602,0x3602,0x260a,0x360a,\n0x2403,0x3403,0x240b,0x340b,0x2603,0x3603,0x260b,0x360b,\n  /* *** 192 - 255 *** */\n0x0480,0x1480,0x0488,0x1488,0x0680,0x1680,0x0688,0x1688,\n0x0481,0x1481,0x0489,0x1489,0x0681,0x1681,0x0689,0x1689,\n0x0482,0x1482,0x048a,0x148a,0x0682,0x1682,0x068a,0x168a,\n0x0483,0x1483,0x048b,0x148b,0x0683,0x1683,0x068b,0x168b,\n0x2480,0x3480,0x2488,0x3488,0x2680,0x3680,0x2688,0x3688,\n0x2481,0x3481,0x2489,0x3489,0x2681,0x3681,0x2689,0x3689,\n0x2482,0x3482,0x248a,0x348a,0x2682,0x3682,0x268a,0x368a,\n0x2483,0x3483,0x248b,0x348b,0x2683,0x3683,0x268b,0x368b,\n// SBOX: 1 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x8000,0x0020,0x8020,0x0004,0x8004,0x0024,0x8024,\n0x4000,0xc000,0x4020,0xc020,0x4004,0xc004,0x4024,0xc024,\n0x0040,0x8040,0x0060,0x8060,0x0044,0x8044,0x0064,0x8064,\n0x4040,0xc040,0x4060,0xc060,0x4044,0xc044,0x4064,0xc064,\n0x0100,0x8100,0x0120,0x8120,0x0104,0x8104,0x0124,0x8124,\n0x4100,0xc100,0x4120,0xc120,0x4104,0xc104,0x4124,0xc124,\n0x0140,0x8140,0x0160,0x8160,0x0144,0x8144,0x0164,0x8164,\n0x4140,0xc140,0x4160,0xc160,0x4144,0xc144,0x4164,0xc164,\n  /* *** 64 - 127 *** */\n0x0800,0x8800,0x0820,0x8820,0x0804,0x8804,0x0824,0x8824,\n0x4800,0xc800,0x4820,0xc820,0x4804,0xc804,0x4824,0xc824,\n0x0840,0x8840,0x0860,0x8860,0x0844,0x8844,0x0864,0x8864,\n0x4840,0xc840,0x4860,0xc860,0x4844,0xc844,0x4864,0xc864,\n0x0900,0x8900,0x0920,0x8920,0x0904,0x8904,0x0924,0x8924,\n0x4900,0xc900,0x4920,0xc920,0x4904,0xc904,0x4924,0xc924,\n0x0940,0x8940,0x0960,0x8960,0x0944,0x8944,0x0964,0x8964,\n0x4940,0xc940,0x4960,0xc960,0x4944,0xc944,0x4964,0xc964,\n  /* *** 128 - 191 *** */\n0x0010,0x8010,0x0030,0x8030,0x0014,0x8014,0x0034,0x8034,\n0x4010,0xc010,0x4030,0xc030,0x4014,0xc014,0x4034,0xc034,\n0x0050,0x8050,0x0070,0x8070,0x0054,0x8054,0x0074,0x8074,\n0x4050,0xc050,0x4070,0xc070,0x4054,0xc054,0x4074,0xc074,\n0x0110,0x8110,0x0130,0x8130,0x0114,0x8114,0x0134,0x8134,\n0x4110,0xc110,0x4130,0xc130,0x4114,0xc114,0x4134,0xc134,\n0x0150,0x8150,0x0170,0x8170,0x0154,0x8154,0x0174,0x8174,\n0x4150,0xc150,0x4170,0xc170,0x4154,0xc154,0x4174,0xc174,\n  /* *** 192 - 255 *** */\n0x0810,0x8810,0x0830,0x8830,0x0814,0x8814,0x0834,0x8834,\n0x4810,0xc810,0x4830,0xc830,0x4814,0xc814,0x4834,0xc834,\n0x0850,0x8850,0x0870,0x8870,0x0854,0x8854,0x0874,0x8874,\n0x4850,0xc850,0x4870,0xc870,0x4854,0xc854,0x4874,0xc874,\n0x0910,0x8910,0x0930,0x8930,0x0914,0x8914,0x0934,0x8934,\n0x4910,0xc910,0x4930,0xc930,0x4914,0xc914,0x4934,0xc934,\n0x0950,0x8950,0x0970,0x8970,0x0954,0x8954,0x0974,0x8974,\n0x4950,0xc950,0x4970,0xc970,0x4954,0xc954,0x4974,0xc974,\n// SBOX: 2 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x2000,0x4000,0x6000,0x0002,0x2002,0x4002,0x6002,\n0x0010,0x2010,0x4010,0x6010,0x0012,0x2012,0x4012,0x6012,\n0x0800,0x2800,0x4800,0x6800,0x0802,0x2802,0x4802,0x6802,\n0x0810,0x2810,0x4810,0x6810,0x0812,0x2812,0x4812,0x6812,\n0x0001,0x2001,0x4001,0x6001,0x0003,0x2003,0x4003,0x6003,\n0x0011,0x2011,0x4011,0x6011,0x0013,0x2013,0x4013,0x6013,\n0x0801,0x2801,0x4801,0x6801,0x0803,0x2803,0x4803,0x6803,\n0x0811,0x2811,0x4811,0x6811,0x0813,0x2813,0x4813,0x6813,\n  /* *** 64 - 127 *** */\n0x0040,0x2040,0x4040,0x6040,0x0042,0x2042,0x4042,0x6042,\n0x0050,0x2050,0x4050,0x6050,0x0052,0x2052,0x4052,0x6052,\n0x0840,0x2840,0x4840,0x6840,0x0842,0x2842,0x4842,0x6842,\n0x0850,0x2850,0x4850,0x6850,0x0852,0x2852,0x4852,0x6852,\n0x0041,0x2041,0x4041,0x6041,0x0043,0x2043,0x4043,0x6043,\n0x0051,0x2051,0x4051,0x6051,0x0053,0x2053,0x4053,0x6053,\n0x0841,0x2841,0x4841,0x6841,0x0843,0x2843,0x4843,0x6843,\n0x0851,0x2851,0x4851,0x6851,0x0853,0x2853,0x4853,0x6853,\n  /* *** 128 - 191 *** */\n0x0008,0x2008,0x4008,0x6008,0x000a,0x200a,0x400a,0x600a,\n0x0018,0x2018,0x4018,0x6018,0x001a,0x201a,0x401a,0x601a,\n0x0808,0x2808,0x4808,0x6808,0x080a,0x280a,0x480a,0x680a,\n0x0818,0x2818,0x4818,0x6818,0x081a,0x281a,0x481a,0x681a,\n0x0009,0x2009,0x4009,0x6009,0x000b,0x200b,0x400b,0x600b,\n0x0019,0x2019,0x4019,0x6019,0x001b,0x201b,0x401b,0x601b,\n0x0809,0x2809,0x4809,0x6809,0x080b,0x280b,0x480b,0x680b,\n0x0819,0x2819,0x4819,0x6819,0x081b,0x281b,0x481b,0x681b,\n  /* *** 192 - 255 *** */\n0x0048,0x2048,0x4048,0x6048,0x004a,0x204a,0x404a,0x604a,\n0x0058,0x2058,0x4058,0x6058,0x005a,0x205a,0x405a,0x605a,\n0x0848,0x2848,0x4848,0x6848,0x084a,0x284a,0x484a,0x684a,\n0x0858,0x2858,0x4858,0x6858,0x085a,0x285a,0x485a,0x685a,\n0x0049,0x2049,0x4049,0x6049,0x004b,0x204b,0x404b,0x604b,\n0x0059,0x2059,0x4059,0x6059,0x005b,0x205b,0x405b,0x605b,\n0x0849,0x2849,0x4849,0x6849,0x084b,0x284b,0x484b,0x684b,\n0x0859,0x2859,0x4859,0x6859,0x085b,0x285b,0x485b,0x685b,\n// SBOX: 2 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x0100,0x0020,0x0120,0x0080,0x0180,0x00a0,0x01a0,\n0x0400,0x0500,0x0420,0x0520,0x0480,0x0580,0x04a0,0x05a0,\n0x0004,0x0104,0x0024,0x0124,0x0084,0x0184,0x00a4,0x01a4,\n0x0404,0x0504,0x0424,0x0524,0x0484,0x0584,0x04a4,0x05a4,\n0x0200,0x0300,0x0220,0x0320,0x0280,0x0380,0x02a0,0x03a0,\n0x0600,0x0700,0x0620,0x0720,0x0680,0x0780,0x06a0,0x07a0,\n0x0204,0x0304,0x0224,0x0324,0x0284,0x0384,0x02a4,0x03a4,\n0x0604,0x0704,0x0624,0x0724,0x0684,0x0784,0x06a4,0x07a4,\n  /* *** 64 - 127 *** */\n0x1000,0x1100,0x1020,0x1120,0x1080,0x1180,0x10a0,0x11a0,\n0x1400,0x1500,0x1420,0x1520,0x1480,0x1580,0x14a0,0x15a0,\n0x1004,0x1104,0x1024,0x1124,0x1084,0x1184,0x10a4,0x11a4,\n0x1404,0x1504,0x1424,0x1524,0x1484,0x1584,0x14a4,0x15a4,\n0x1200,0x1300,0x1220,0x1320,0x1280,0x1380,0x12a0,0x13a0,\n0x1600,0x1700,0x1620,0x1720,0x1680,0x1780,0x16a0,0x17a0,\n0x1204,0x1304,0x1224,0x1324,0x1284,0x1384,0x12a4,0x13a4,\n0x1604,0x1704,0x1624,0x1724,0x1684,0x1784,0x16a4,0x17a4,\n  /* *** 128 - 191 *** */\n0x8000,0x8100,0x8020,0x8120,0x8080,0x8180,0x80a0,0x81a0,\n0x8400,0x8500,0x8420,0x8520,0x8480,0x8580,0x84a0,0x85a0,\n0x8004,0x8104,0x8024,0x8124,0x8084,0x8184,0x80a4,0x81a4,\n0x8404,0x8504,0x8424,0x8524,0x8484,0x8584,0x84a4,0x85a4,\n0x8200,0x8300,0x8220,0x8320,0x8280,0x8380,0x82a0,0x83a0,\n0x8600,0x8700,0x8620,0x8720,0x8680,0x8780,0x86a0,0x87a0,\n0x8204,0x8304,0x8224,0x8324,0x8284,0x8384,0x82a4,0x83a4,\n0x8604,0x8704,0x8624,0x8724,0x8684,0x8784,0x86a4,0x87a4,\n  /* *** 192 - 255 *** */\n0x9000,0x9100,0x9020,0x9120,0x9080,0x9180,0x90a0,0x91a0,\n0x9400,0x9500,0x9420,0x9520,0x9480,0x9580,0x94a0,0x95a0,\n0x9004,0x9104,0x9024,0x9124,0x9084,0x9184,0x90a4,0x91a4,\n0x9404,0x9504,0x9424,0x9524,0x9484,0x9584,0x94a4,0x95a4,\n0x9200,0x9300,0x9220,0x9320,0x9280,0x9380,0x92a0,0x93a0,\n0x9600,0x9700,0x9620,0x9720,0x9680,0x9780,0x96a0,0x97a0,\n0x9204,0x9304,0x9224,0x9324,0x9284,0x9384,0x92a4,0x93a4,\n0x9604,0x9704,0x9624,0x9724,0x9684,0x9784,0x96a4,0x97a4,\n// SBOX: 3 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x0004,0x0200,0x0204,0x0002,0x0006,0x0202,0x0206,\n0x0010,0x0014,0x0210,0x0214,0x0012,0x0016,0x0212,0x0216,\n0x0100,0x0104,0x0300,0x0304,0x0102,0x0106,0x0302,0x0306,\n0x0110,0x0114,0x0310,0x0314,0x0112,0x0116,0x0312,0x0316,\n0x0020,0x0024,0x0220,0x0224,0x0022,0x0026,0x0222,0x0226,\n0x0030,0x0034,0x0230,0x0234,0x0032,0x0036,0x0232,0x0236,\n0x0120,0x0124,0x0320,0x0324,0x0122,0x0126,0x0322,0x0326,\n0x0130,0x0134,0x0330,0x0334,0x0132,0x0136,0x0332,0x0336,\n  /* *** 64 - 127 *** */\n0x0040,0x0044,0x0240,0x0244,0x0042,0x0046,0x0242,0x0246,\n0x0050,0x0054,0x0250,0x0254,0x0052,0x0056,0x0252,0x0256,\n0x0140,0x0144,0x0340,0x0344,0x0142,0x0146,0x0342,0x0346,\n0x0150,0x0154,0x0350,0x0354,0x0152,0x0156,0x0352,0x0356,\n0x0060,0x0064,0x0260,0x0264,0x0062,0x0066,0x0262,0x0266,\n0x0070,0x0074,0x0270,0x0274,0x0072,0x0076,0x0272,0x0276,\n0x0160,0x0164,0x0360,0x0364,0x0162,0x0166,0x0362,0x0366,\n0x0170,0x0174,0x0370,0x0374,0x0172,0x0176,0x0372,0x0376,\n  /* *** 128 - 191 *** */\n0x8000,0x8004,0x8200,0x8204,0x8002,0x8006,0x8202,0x8206,\n0x8010,0x8014,0x8210,0x8214,0x8012,0x8016,0x8212,0x8216,\n0x8100,0x8104,0x8300,0x8304,0x8102,0x8106,0x8302,0x8306,\n0x8110,0x8114,0x8310,0x8314,0x8112,0x8116,0x8312,0x8316,\n0x8020,0x8024,0x8220,0x8224,0x8022,0x8026,0x8222,0x8226,\n0x8030,0x8034,0x8230,0x8234,0x8032,0x8036,0x8232,0x8236,\n0x8120,0x8124,0x8320,0x8324,0x8122,0x8126,0x8322,0x8326,\n0x8130,0x8134,0x8330,0x8334,0x8132,0x8136,0x8332,0x8336,\n  /* *** 192 - 255 *** */\n0x8040,0x8044,0x8240,0x8244,0x8042,0x8046,0x8242,0x8246,\n0x8050,0x8054,0x8250,0x8254,0x8052,0x8056,0x8252,0x8256,\n0x8140,0x8144,0x8340,0x8344,0x8142,0x8146,0x8342,0x8346,\n0x8150,0x8154,0x8350,0x8354,0x8152,0x8156,0x8352,0x8356,\n0x8060,0x8064,0x8260,0x8264,0x8062,0x8066,0x8262,0x8266,\n0x8070,0x8074,0x8270,0x8274,0x8072,0x8076,0x8272,0x8276,\n0x8160,0x8164,0x8360,0x8364,0x8162,0x8166,0x8362,0x8366,\n0x8170,0x8174,0x8370,0x8374,0x8172,0x8176,0x8372,0x8376,\n// SBOX: 3 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x4000,0x0001,0x4001,0x0080,0x4080,0x0081,0x4081,\n0x0800,0x4800,0x0801,0x4801,0x0880,0x4880,0x0881,0x4881,\n0x2000,0x6000,0x2001,0x6001,0x2080,0x6080,0x2081,0x6081,\n0x2800,0x6800,0x2801,0x6801,0x2880,0x6880,0x2881,0x6881,\n0x0008,0x4008,0x0009,0x4009,0x0088,0x4088,0x0089,0x4089,\n0x0808,0x4808,0x0809,0x4809,0x0888,0x4888,0x0889,0x4889,\n0x2008,0x6008,0x2009,0x6009,0x2088,0x6088,0x2089,0x6089,\n0x2808,0x6808,0x2809,0x6809,0x2888,0x6888,0x2889,0x6889,\n  /* *** 64 - 127 *** */\n0x0400,0x4400,0x0401,0x4401,0x0480,0x4480,0x0481,0x4481,\n0x0c00,0x4c00,0x0c01,0x4c01,0x0c80,0x4c80,0x0c81,0x4c81,\n0x2400,0x6400,0x2401,0x6401,0x2480,0x6480,0x2481,0x6481,\n0x2c00,0x6c00,0x2c01,0x6c01,0x2c80,0x6c80,0x2c81,0x6c81,\n0x0408,0x4408,0x0409,0x4409,0x0488,0x4488,0x0489,0x4489,\n0x0c08,0x4c08,0x0c09,0x4c09,0x0c88,0x4c88,0x0c89,0x4c89,\n0x2408,0x6408,0x2409,0x6409,0x2488,0x6488,0x2489,0x6489,\n0x2c08,0x6c08,0x2c09,0x6c09,0x2c88,0x6c88,0x2c89,0x6c89,\n  /* *** 128 - 191 *** */\n0x1000,0x5000,0x1001,0x5001,0x1080,0x5080,0x1081,0x5081,\n0x1800,0x5800,0x1801,0x5801,0x1880,0x5880,0x1881,0x5881,\n0x3000,0x7000,0x3001,0x7001,0x3080,0x7080,0x3081,0x7081,\n0x3800,0x7800,0x3801,0x7801,0x3880,0x7880,0x3881,0x7881,\n0x1008,0x5008,0x1009,0x5009,0x1088,0x5088,0x1089,0x5089,\n0x1808,0x5808,0x1809,0x5809,0x1888,0x5888,0x1889,0x5889,\n0x3008,0x7008,0x3009,0x7009,0x3088,0x7088,0x3089,0x7089,\n0x3808,0x7808,0x3809,0x7809,0x3888,0x7888,0x3889,0x7889,\n  /* *** 192 - 255 *** */\n0x1400,0x5400,0x1401,0x5401,0x1480,0x5480,0x1481,0x5481,\n0x1c00,0x5c00,0x1c01,0x5c01,0x1c80,0x5c80,0x1c81,0x5c81,\n0x3400,0x7400,0x3401,0x7401,0x3480,0x7480,0x3481,0x7481,\n0x3c00,0x7c00,0x3c01,0x7c01,0x3c80,0x7c80,0x3c81,0x7c81,\n0x1408,0x5408,0x1409,0x5409,0x1488,0x5488,0x1489,0x5489,\n0x1c08,0x5c08,0x1c09,0x5c09,0x1c88,0x5c88,0x1c89,0x5c89,\n0x3408,0x7408,0x3409,0x7409,0x3488,0x7488,0x3489,0x7489,\n0x3c08,0x7c08,0x3c09,0x7c09,0x3c88,0x7c88,0x3c89,0x7c89,\n// SBOX: 4 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x0002,0x0100,0x0102,0x0040,0x0042,0x0140,0x0142,\n0x0020,0x0022,0x0120,0x0122,0x0060,0x0062,0x0160,0x0162,\n0x1000,0x1002,0x1100,0x1102,0x1040,0x1042,0x1140,0x1142,\n0x1020,0x1022,0x1120,0x1122,0x1060,0x1062,0x1160,0x1162,\n0x0080,0x0082,0x0180,0x0182,0x00c0,0x00c2,0x01c0,0x01c2,\n0x00a0,0x00a2,0x01a0,0x01a2,0x00e0,0x00e2,0x01e0,0x01e2,\n0x1080,0x1082,0x1180,0x1182,0x10c0,0x10c2,0x11c0,0x11c2,\n0x10a0,0x10a2,0x11a0,0x11a2,0x10e0,0x10e2,0x11e0,0x11e2,\n  /* *** 64 - 127 *** */\n0x8000,0x8002,0x8100,0x8102,0x8040,0x8042,0x8140,0x8142,\n0x8020,0x8022,0x8120,0x8122,0x8060,0x8062,0x8160,0x8162,\n0x9000,0x9002,0x9100,0x9102,0x9040,0x9042,0x9140,0x9142,\n0x9020,0x9022,0x9120,0x9122,0x9060,0x9062,0x9160,0x9162,\n0x8080,0x8082,0x8180,0x8182,0x80c0,0x80c2,0x81c0,0x81c2,\n0x80a0,0x80a2,0x81a0,0x81a2,0x80e0,0x80e2,0x81e0,0x81e2,\n0x9080,0x9082,0x9180,0x9182,0x90c0,0x90c2,0x91c0,0x91c2,\n0x90a0,0x90a2,0x91a0,0x91a2,0x90e0,0x90e2,0x91e0,0x91e2,\n  /* *** 128 - 191 *** */\n0x0400,0x0402,0x0500,0x0502,0x0440,0x0442,0x0540,0x0542,\n0x0420,0x0422,0x0520,0x0522,0x0460,0x0462,0x0560,0x0562,\n0x1400,0x1402,0x1500,0x1502,0x1440,0x1442,0x1540,0x1542,\n0x1420,0x1422,0x1520,0x1522,0x1460,0x1462,0x1560,0x1562,\n0x0480,0x0482,0x0580,0x0582,0x04c0,0x04c2,0x05c0,0x05c2,\n0x04a0,0x04a2,0x05a0,0x05a2,0x04e0,0x04e2,0x05e0,0x05e2,\n0x1480,0x1482,0x1580,0x1582,0x14c0,0x14c2,0x15c0,0x15c2,\n0x14a0,0x14a2,0x15a0,0x15a2,0x14e0,0x14e2,0x15e0,0x15e2,\n  /* *** 192 - 255 *** */\n0x8400,0x8402,0x8500,0x8502,0x8440,0x8442,0x8540,0x8542,\n0x8420,0x8422,0x8520,0x8522,0x8460,0x8462,0x8560,0x8562,\n0x9400,0x9402,0x9500,0x9502,0x9440,0x9442,0x9540,0x9542,\n0x9420,0x9422,0x9520,0x9522,0x9460,0x9462,0x9560,0x9562,\n0x8480,0x8482,0x8580,0x8582,0x84c0,0x84c2,0x85c0,0x85c2,\n0x84a0,0x84a2,0x85a0,0x85a2,0x84e0,0x84e2,0x85e0,0x85e2,\n0x9480,0x9482,0x9580,0x9582,0x94c0,0x94c2,0x95c0,0x95c2,\n0x94a0,0x94a2,0x95a0,0x95a2,0x94e0,0x94e2,0x95e0,0x95e2,\n// SBOX: 4 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x4000,0x0004,0x4004,0x0001,0x4001,0x0005,0x4005,\n0x0800,0x4800,0x0804,0x4804,0x0801,0x4801,0x0805,0x4805,\n0x0200,0x4200,0x0204,0x4204,0x0201,0x4201,0x0205,0x4205,\n0x0a00,0x4a00,0x0a04,0x4a04,0x0a01,0x4a01,0x0a05,0x4a05,\n0x0010,0x4010,0x0014,0x4014,0x0011,0x4011,0x0015,0x4015,\n0x0810,0x4810,0x0814,0x4814,0x0811,0x4811,0x0815,0x4815,\n0x0210,0x4210,0x0214,0x4214,0x0211,0x4211,0x0215,0x4215,\n0x0a10,0x4a10,0x0a14,0x4a14,0x0a11,0x4a11,0x0a15,0x4a15,\n  /* *** 64 - 127 *** */\n0x0008,0x4008,0x000c,0x400c,0x0009,0x4009,0x000d,0x400d,\n0x0808,0x4808,0x080c,0x480c,0x0809,0x4809,0x080d,0x480d,\n0x0208,0x4208,0x020c,0x420c,0x0209,0x4209,0x020d,0x420d,\n0x0a08,0x4a08,0x0a0c,0x4a0c,0x0a09,0x4a09,0x0a0d,0x4a0d,\n0x0018,0x4018,0x001c,0x401c,0x0019,0x4019,0x001d,0x401d,\n0x0818,0x4818,0x081c,0x481c,0x0819,0x4819,0x081d,0x481d,\n0x0218,0x4218,0x021c,0x421c,0x0219,0x4219,0x021d,0x421d,\n0x0a18,0x4a18,0x0a1c,0x4a1c,0x0a19,0x4a19,0x0a1d,0x4a1d,\n  /* *** 128 - 191 *** */\n0x2000,0x6000,0x2004,0x6004,0x2001,0x6001,0x2005,0x6005,\n0x2800,0x6800,0x2804,0x6804,0x2801,0x6801,0x2805,0x6805,\n0x2200,0x6200,0x2204,0x6204,0x2201,0x6201,0x2205,0x6205,\n0x2a00,0x6a00,0x2a04,0x6a04,0x2a01,0x6a01,0x2a05,0x6a05,\n0x2010,0x6010,0x2014,0x6014,0x2011,0x6011,0x2015,0x6015,\n0x2810,0x6810,0x2814,0x6814,0x2811,0x6811,0x2815,0x6815,\n0x2210,0x6210,0x2214,0x6214,0x2211,0x6211,0x2215,0x6215,\n0x2a10,0x6a10,0x2a14,0x6a14,0x2a11,0x6a11,0x2a15,0x6a15,\n  /* *** 192 - 255 *** */\n0x2008,0x6008,0x200c,0x600c,0x2009,0x6009,0x200d,0x600d,\n0x2808,0x6808,0x280c,0x680c,0x2809,0x6809,0x280d,0x680d,\n0x2208,0x6208,0x220c,0x620c,0x2209,0x6209,0x220d,0x620d,\n0x2a08,0x6a08,0x2a0c,0x6a0c,0x2a09,0x6a09,0x2a0d,0x6a0d,\n0x2018,0x6018,0x201c,0x601c,0x2019,0x6019,0x201d,0x601d,\n0x2818,0x6818,0x281c,0x681c,0x2819,0x6819,0x281d,0x681d,\n0x2218,0x6218,0x221c,0x621c,0x2219,0x6219,0x221d,0x621d,\n0x2a18,0x6a18,0x2a1c,0x6a1c,0x2a19,0x6a19,0x2a1d,0x6a1d,\n// SBOX: 5 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x0002,0x0004,0x0006,0x4000,0x4002,0x4004,0x4006,\n0x0800,0x0802,0x0804,0x0806,0x4800,0x4802,0x4804,0x4806,\n0x0040,0x0042,0x0044,0x0046,0x4040,0x4042,0x4044,0x4046,\n0x0840,0x0842,0x0844,0x0846,0x4840,0x4842,0x4844,0x4846,\n0x2000,0x2002,0x2004,0x2006,0x6000,0x6002,0x6004,0x6006,\n0x2800,0x2802,0x2804,0x2806,0x6800,0x6802,0x6804,0x6806,\n0x2040,0x2042,0x2044,0x2046,0x6040,0x6042,0x6044,0x6046,\n0x2840,0x2842,0x2844,0x2846,0x6840,0x6842,0x6844,0x6846,\n  /* *** 64 - 127 *** */\n0x0001,0x0003,0x0005,0x0007,0x4001,0x4003,0x4005,0x4007,\n0x0801,0x0803,0x0805,0x0807,0x4801,0x4803,0x4805,0x4807,\n0x0041,0x0043,0x0045,0x0047,0x4041,0x4043,0x4045,0x4047,\n0x0841,0x0843,0x0845,0x0847,0x4841,0x4843,0x4845,0x4847,\n0x2001,0x2003,0x2005,0x2007,0x6001,0x6003,0x6005,0x6007,\n0x2801,0x2803,0x2805,0x2807,0x6801,0x6803,0x6805,0x6807,\n0x2041,0x2043,0x2045,0x2047,0x6041,0x6043,0x6045,0x6047,\n0x2841,0x2843,0x2845,0x2847,0x6841,0x6843,0x6845,0x6847,\n  /* *** 128 - 191 *** */\n0x0080,0x0082,0x0084,0x0086,0x4080,0x4082,0x4084,0x4086,\n0x0880,0x0882,0x0884,0x0886,0x4880,0x4882,0x4884,0x4886,\n0x00c0,0x00c2,0x00c4,0x00c6,0x40c0,0x40c2,0x40c4,0x40c6,\n0x08c0,0x08c2,0x08c4,0x08c6,0x48c0,0x48c2,0x48c4,0x48c6,\n0x2080,0x2082,0x2084,0x2086,0x6080,0x6082,0x6084,0x6086,\n0x2880,0x2882,0x2884,0x2886,0x6880,0x6882,0x6884,0x6886,\n0x20c0,0x20c2,0x20c4,0x20c6,0x60c0,0x60c2,0x60c4,0x60c6,\n0x28c0,0x28c2,0x28c4,0x28c6,0x68c0,0x68c2,0x68c4,0x68c6,\n  /* *** 192 - 255 *** */\n0x0081,0x0083,0x0085,0x0087,0x4081,0x4083,0x4085,0x4087,\n0x0881,0x0883,0x0885,0x0887,0x4881,0x4883,0x4885,0x4887,\n0x00c1,0x00c3,0x00c5,0x00c7,0x40c1,0x40c3,0x40c5,0x40c7,\n0x08c1,0x08c3,0x08c5,0x08c7,0x48c1,0x48c3,0x48c5,0x48c7,\n0x2081,0x2083,0x2085,0x2087,0x6081,0x6083,0x6085,0x6087,\n0x2881,0x2883,0x2885,0x2887,0x6881,0x6883,0x6885,0x6887,\n0x20c1,0x20c3,0x20c5,0x20c7,0x60c1,0x60c3,0x60c5,0x60c7,\n0x28c1,0x28c3,0x28c5,0x28c7,0x68c1,0x68c3,0x68c5,0x68c7,\n// SBOX: 5 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x8000,0x0020,0x8020,0x0008,0x8008,0x0028,0x8028,\n0x0100,0x8100,0x0120,0x8120,0x0108,0x8108,0x0128,0x8128,\n0x1000,0x9000,0x1020,0x9020,0x1008,0x9008,0x1028,0x9028,\n0x1100,0x9100,0x1120,0x9120,0x1108,0x9108,0x1128,0x9128,\n0x0400,0x8400,0x0420,0x8420,0x0408,0x8408,0x0428,0x8428,\n0x0500,0x8500,0x0520,0x8520,0x0508,0x8508,0x0528,0x8528,\n0x1400,0x9400,0x1420,0x9420,0x1408,0x9408,0x1428,0x9428,\n0x1500,0x9500,0x1520,0x9520,0x1508,0x9508,0x1528,0x9528,\n  /* *** 64 - 127 *** */\n0x0200,0x8200,0x0220,0x8220,0x0208,0x8208,0x0228,0x8228,\n0x0300,0x8300,0x0320,0x8320,0x0308,0x8308,0x0328,0x8328,\n0x1200,0x9200,0x1220,0x9220,0x1208,0x9208,0x1228,0x9228,\n0x1300,0x9300,0x1320,0x9320,0x1308,0x9308,0x1328,0x9328,\n0x0600,0x8600,0x0620,0x8620,0x0608,0x8608,0x0628,0x8628,\n0x0700,0x8700,0x0720,0x8720,0x0708,0x8708,0x0728,0x8728,\n0x1600,0x9600,0x1620,0x9620,0x1608,0x9608,0x1628,0x9628,\n0x1700,0x9700,0x1720,0x9720,0x1708,0x9708,0x1728,0x9728,\n  /* *** 128 - 191 *** */\n0x0010,0x8010,0x0030,0x8030,0x0018,0x8018,0x0038,0x8038,\n0x0110,0x8110,0x0130,0x8130,0x0118,0x8118,0x0138,0x8138,\n0x1010,0x9010,0x1030,0x9030,0x1018,0x9018,0x1038,0x9038,\n0x1110,0x9110,0x1130,0x9130,0x1118,0x9118,0x1138,0x9138,\n0x0410,0x8410,0x0430,0x8430,0x0418,0x8418,0x0438,0x8438,\n0x0510,0x8510,0x0530,0x8530,0x0518,0x8518,0x0538,0x8538,\n0x1410,0x9410,0x1430,0x9430,0x1418,0x9418,0x1438,0x9438,\n0x1510,0x9510,0x1530,0x9530,0x1518,0x9518,0x1538,0x9538,\n  /* *** 192 - 255 *** */\n0x0210,0x8210,0x0230,0x8230,0x0218,0x8218,0x0238,0x8238,\n0x0310,0x8310,0x0330,0x8330,0x0318,0x8318,0x0338,0x8338,\n0x1210,0x9210,0x1230,0x9230,0x1218,0x9218,0x1238,0x9238,\n0x1310,0x9310,0x1330,0x9330,0x1318,0x9318,0x1338,0x9338,\n0x0610,0x8610,0x0630,0x8630,0x0618,0x8618,0x0638,0x8638,\n0x0710,0x8710,0x0730,0x8730,0x0718,0x8718,0x0738,0x8738,\n0x1610,0x9610,0x1630,0x9630,0x1618,0x9618,0x1638,0x9638,\n0x1710,0x9710,0x1730,0x9730,0x1718,0x9718,0x1738,0x9738,\n// SBOX: 6 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x8000,0x0200,0x8200,0x1000,0x9000,0x1200,0x9200,\n0x0400,0x8400,0x0600,0x8600,0x1400,0x9400,0x1600,0x9600,\n0x0004,0x8004,0x0204,0x8204,0x1004,0x9004,0x1204,0x9204,\n0x0404,0x8404,0x0604,0x8604,0x1404,0x9404,0x1604,0x9604,\n0x4000,0xc000,0x4200,0xc200,0x5000,0xd000,0x5200,0xd200,\n0x4400,0xc400,0x4600,0xc600,0x5400,0xd400,0x5600,0xd600,\n0x4004,0xc004,0x4204,0xc204,0x5004,0xd004,0x5204,0xd204,\n0x4404,0xc404,0x4604,0xc604,0x5404,0xd404,0x5604,0xd604,\n  /* *** 64 - 127 *** */\n0x0020,0x8020,0x0220,0x8220,0x1020,0x9020,0x1220,0x9220,\n0x0420,0x8420,0x0620,0x8620,0x1420,0x9420,0x1620,0x9620,\n0x0024,0x8024,0x0224,0x8224,0x1024,0x9024,0x1224,0x9224,\n0x0424,0x8424,0x0624,0x8624,0x1424,0x9424,0x1624,0x9624,\n0x4020,0xc020,0x4220,0xc220,0x5020,0xd020,0x5220,0xd220,\n0x4420,0xc420,0x4620,0xc620,0x5420,0xd420,0x5620,0xd620,\n0x4024,0xc024,0x4224,0xc224,0x5024,0xd024,0x5224,0xd224,\n0x4424,0xc424,0x4624,0xc624,0x5424,0xd424,0x5624,0xd624,\n  /* *** 128 - 191 *** */\n0x0001,0x8001,0x0201,0x8201,0x1001,0x9001,0x1201,0x9201,\n0x0401,0x8401,0x0601,0x8601,0x1401,0x9401,0x1601,0x9601,\n0x0005,0x8005,0x0205,0x8205,0x1005,0x9005,0x1205,0x9205,\n0x0405,0x8405,0x0605,0x8605,0x1405,0x9405,0x1605,0x9605,\n0x4001,0xc001,0x4201,0xc201,0x5001,0xd001,0x5201,0xd201,\n0x4401,0xc401,0x4601,0xc601,0x5401,0xd401,0x5601,0xd601,\n0x4005,0xc005,0x4205,0xc205,0x5005,0xd005,0x5205,0xd205,\n0x4405,0xc405,0x4605,0xc605,0x5405,0xd405,0x5605,0xd605,\n  /* *** 192 - 255 *** */\n0x0021,0x8021,0x0221,0x8221,0x1021,0x9021,0x1221,0x9221,\n0x0421,0x8421,0x0621,0x8621,0x1421,0x9421,0x1621,0x9621,\n0x0025,0x8025,0x0225,0x8225,0x1025,0x9025,0x1225,0x9225,\n0x0425,0x8425,0x0625,0x8625,0x1425,0x9425,0x1625,0x9625,\n0x4021,0xc021,0x4221,0xc221,0x5021,0xd021,0x5221,0xd221,\n0x4421,0xc421,0x4621,0xc621,0x5421,0xd421,0x5621,0xd621,\n0x4025,0xc025,0x4225,0xc225,0x5025,0xd025,0x5225,0xd225,\n0x4425,0xc425,0x4625,0xc625,0x5425,0xd425,0x5625,0xd625,\n// SBOX: 6 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x0010,0x0080,0x0090,0x0008,0x0018,0x0088,0x0098,\n0x2000,0x2010,0x2080,0x2090,0x2008,0x2018,0x2088,0x2098,\n0x0100,0x0110,0x0180,0x0190,0x0108,0x0118,0x0188,0x0198,\n0x2100,0x2110,0x2180,0x2190,0x2108,0x2118,0x2188,0x2198,\n0x0002,0x0012,0x0082,0x0092,0x000a,0x001a,0x008a,0x009a,\n0x2002,0x2012,0x2082,0x2092,0x200a,0x201a,0x208a,0x209a,\n0x0102,0x0112,0x0182,0x0192,0x010a,0x011a,0x018a,0x019a,\n0x2102,0x2112,0x2182,0x2192,0x210a,0x211a,0x218a,0x219a,\n  /* *** 64 - 127 *** */\n0x0040,0x0050,0x00c0,0x00d0,0x0048,0x0058,0x00c8,0x00d8,\n0x2040,0x2050,0x20c0,0x20d0,0x2048,0x2058,0x20c8,0x20d8,\n0x0140,0x0150,0x01c0,0x01d0,0x0148,0x0158,0x01c8,0x01d8,\n0x2140,0x2150,0x21c0,0x21d0,0x2148,0x2158,0x21c8,0x21d8,\n0x0042,0x0052,0x00c2,0x00d2,0x004a,0x005a,0x00ca,0x00da,\n0x2042,0x2052,0x20c2,0x20d2,0x204a,0x205a,0x20ca,0x20da,\n0x0142,0x0152,0x01c2,0x01d2,0x014a,0x015a,0x01ca,0x01da,\n0x2142,0x2152,0x21c2,0x21d2,0x214a,0x215a,0x21ca,0x21da,\n  /* *** 128 - 191 *** */\n0x0800,0x0810,0x0880,0x0890,0x0808,0x0818,0x0888,0x0898,\n0x2800,0x2810,0x2880,0x2890,0x2808,0x2818,0x2888,0x2898,\n0x0900,0x0910,0x0980,0x0990,0x0908,0x0918,0x0988,0x0998,\n0x2900,0x2910,0x2980,0x2990,0x2908,0x2918,0x2988,0x2998,\n0x0802,0x0812,0x0882,0x0892,0x080a,0x081a,0x088a,0x089a,\n0x2802,0x2812,0x2882,0x2892,0x280a,0x281a,0x288a,0x289a,\n0x0902,0x0912,0x0982,0x0992,0x090a,0x091a,0x098a,0x099a,\n0x2902,0x2912,0x2982,0x2992,0x290a,0x291a,0x298a,0x299a,\n  /* *** 192 - 255 *** */\n0x0840,0x0850,0x08c0,0x08d0,0x0848,0x0858,0x08c8,0x08d8,\n0x2840,0x2850,0x28c0,0x28d0,0x2848,0x2858,0x28c8,0x28d8,\n0x0940,0x0950,0x09c0,0x09d0,0x0948,0x0958,0x09c8,0x09d8,\n0x2940,0x2950,0x29c0,0x29d0,0x2948,0x2958,0x29c8,0x29d8,\n0x0842,0x0852,0x08c2,0x08d2,0x084a,0x085a,0x08ca,0x08da,\n0x2842,0x2852,0x28c2,0x28d2,0x284a,0x285a,0x28ca,0x28da,\n0x0942,0x0952,0x09c2,0x09d2,0x094a,0x095a,0x09ca,0x09da,\n0x2942,0x2952,0x29c2,0x29d2,0x294a,0x295a,0x29ca,0x29da,\n// SBOX: 7 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x0080,0x0001,0x0081,0x0002,0x0082,0x0003,0x0083,\n0x0040,0x00c0,0x0041,0x00c1,0x0042,0x00c2,0x0043,0x00c3,\n0x0004,0x0084,0x0005,0x0085,0x0006,0x0086,0x0007,0x0087,\n0x0044,0x00c4,0x0045,0x00c5,0x0046,0x00c6,0x0047,0x00c7,\n0x0200,0x0280,0x0201,0x0281,0x0202,0x0282,0x0203,0x0283,\n0x0240,0x02c0,0x0241,0x02c1,0x0242,0x02c2,0x0243,0x02c3,\n0x0204,0x0284,0x0205,0x0285,0x0206,0x0286,0x0207,0x0287,\n0x0244,0x02c4,0x0245,0x02c5,0x0246,0x02c6,0x0247,0x02c7,\n  /* *** 64 - 127 *** */\n0x8000,0x8080,0x8001,0x8081,0x8002,0x8082,0x8003,0x8083,\n0x8040,0x80c0,0x8041,0x80c1,0x8042,0x80c2,0x8043,0x80c3,\n0x8004,0x8084,0x8005,0x8085,0x8006,0x8086,0x8007,0x8087,\n0x8044,0x80c4,0x8045,0x80c5,0x8046,0x80c6,0x8047,0x80c7,\n0x8200,0x8280,0x8201,0x8281,0x8202,0x8282,0x8203,0x8283,\n0x8240,0x82c0,0x8241,0x82c1,0x8242,0x82c2,0x8243,0x82c3,\n0x8204,0x8284,0x8205,0x8285,0x8206,0x8286,0x8207,0x8287,\n0x8244,0x82c4,0x8245,0x82c5,0x8246,0x82c6,0x8247,0x82c7,\n  /* *** 128 - 191 *** */\n0x1000,0x1080,0x1001,0x1081,0x1002,0x1082,0x1003,0x1083,\n0x1040,0x10c0,0x1041,0x10c1,0x1042,0x10c2,0x1043,0x10c3,\n0x1004,0x1084,0x1005,0x1085,0x1006,0x1086,0x1007,0x1087,\n0x1044,0x10c4,0x1045,0x10c5,0x1046,0x10c6,0x1047,0x10c7,\n0x1200,0x1280,0x1201,0x1281,0x1202,0x1282,0x1203,0x1283,\n0x1240,0x12c0,0x1241,0x12c1,0x1242,0x12c2,0x1243,0x12c3,\n0x1204,0x1284,0x1205,0x1285,0x1206,0x1286,0x1207,0x1287,\n0x1244,0x12c4,0x1245,0x12c5,0x1246,0x12c6,0x1247,0x12c7,\n  /* *** 192 - 255 *** */\n0x9000,0x9080,0x9001,0x9081,0x9002,0x9082,0x9003,0x9083,\n0x9040,0x90c0,0x9041,0x90c1,0x9042,0x90c2,0x9043,0x90c3,\n0x9004,0x9084,0x9005,0x9085,0x9006,0x9086,0x9007,0x9087,\n0x9044,0x90c4,0x9045,0x90c5,0x9046,0x90c6,0x9047,0x90c7,\n0x9200,0x9280,0x9201,0x9281,0x9202,0x9282,0x9203,0x9283,\n0x9240,0x92c0,0x9241,0x92c1,0x9242,0x92c2,0x9243,0x92c3,\n0x9204,0x9284,0x9205,0x9285,0x9206,0x9286,0x9207,0x9287,\n0x9244,0x92c4,0x9245,0x92c5,0x9246,0x92c6,0x9247,0x92c7,\n// SBOX: 7 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x2000,0x0800,0x2800,0x4000,0x6000,0x4800,0x6800,\n0x0020,0x2020,0x0820,0x2820,0x4020,0x6020,0x4820,0x6820,\n0x0100,0x2100,0x0900,0x2900,0x4100,0x6100,0x4900,0x6900,\n0x0120,0x2120,0x0920,0x2920,0x4120,0x6120,0x4920,0x6920,\n0x0010,0x2010,0x0810,0x2810,0x4010,0x6010,0x4810,0x6810,\n0x0030,0x2030,0x0830,0x2830,0x4030,0x6030,0x4830,0x6830,\n0x0110,0x2110,0x0910,0x2910,0x4110,0x6110,0x4910,0x6910,\n0x0130,0x2130,0x0930,0x2930,0x4130,0x6130,0x4930,0x6930,\n  /* *** 64 - 127 *** */\n0x0008,0x2008,0x0808,0x2808,0x4008,0x6008,0x4808,0x6808,\n0x0028,0x2028,0x0828,0x2828,0x4028,0x6028,0x4828,0x6828,\n0x0108,0x2108,0x0908,0x2908,0x4108,0x6108,0x4908,0x6908,\n0x0128,0x2128,0x0928,0x2928,0x4128,0x6128,0x4928,0x6928,\n0x0018,0x2018,0x0818,0x2818,0x4018,0x6018,0x4818,0x6818,\n0x0038,0x2038,0x0838,0x2838,0x4038,0x6038,0x4838,0x6838,\n0x0118,0x2118,0x0918,0x2918,0x4118,0x6118,0x4918,0x6918,\n0x0138,0x2138,0x0938,0x2938,0x4138,0x6138,0x4938,0x6938,\n  /* *** 128 - 191 *** */\n0x0400,0x2400,0x0c00,0x2c00,0x4400,0x6400,0x4c00,0x6c00,\n0x0420,0x2420,0x0c20,0x2c20,0x4420,0x6420,0x4c20,0x6c20,\n0x0500,0x2500,0x0d00,0x2d00,0x4500,0x6500,0x4d00,0x6d00,\n0x0520,0x2520,0x0d20,0x2d20,0x4520,0x6520,0x4d20,0x6d20,\n0x0410,0x2410,0x0c10,0x2c10,0x4410,0x6410,0x4c10,0x6c10,\n0x0430,0x2430,0x0c30,0x2c30,0x4430,0x6430,0x4c30,0x6c30,\n0x0510,0x2510,0x0d10,0x2d10,0x4510,0x6510,0x4d10,0x6d10,\n0x0530,0x2530,0x0d30,0x2d30,0x4530,0x6530,0x4d30,0x6d30,\n  /* *** 192 - 255 *** */\n0x0408,0x2408,0x0c08,0x2c08,0x4408,0x6408,0x4c08,0x6c08,\n0x0428,0x2428,0x0c28,0x2c28,0x4428,0x6428,0x4c28,0x6c28,\n0x0508,0x2508,0x0d08,0x2d08,0x4508,0x6508,0x4d08,0x6d08,\n0x0528,0x2528,0x0d28,0x2d28,0x4528,0x6528,0x4d28,0x6d28,\n0x0418,0x2418,0x0c18,0x2c18,0x4418,0x6418,0x4c18,0x6c18,\n0x0438,0x2438,0x0c38,0x2c38,0x4438,0x6438,0x4c38,0x6c38,\n0x0518,0x2518,0x0d18,0x2d18,0x4518,0x6518,0x4d18,0x6d18,\n0x0538,0x2538,0x0d38,0x2d38,0x4538,0x6538,0x4d38,0x6d38,\n// SBOX: 8 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x0010,0x0400,0x0410,0x0200,0x0210,0x0600,0x0610,\n0x0020,0x0030,0x0420,0x0430,0x0220,0x0230,0x0620,0x0630,\n0x4000,0x4010,0x4400,0x4410,0x4200,0x4210,0x4600,0x4610,\n0x4020,0x4030,0x4420,0x4430,0x4220,0x4230,0x4620,0x4630,\n0x0001,0x0011,0x0401,0x0411,0x0201,0x0211,0x0601,0x0611,\n0x0021,0x0031,0x0421,0x0431,0x0221,0x0231,0x0621,0x0631,\n0x4001,0x4011,0x4401,0x4411,0x4201,0x4211,0x4601,0x4611,\n0x4021,0x4031,0x4421,0x4431,0x4221,0x4231,0x4621,0x4631,\n  /* *** 64 - 127 *** */\n0x0080,0x0090,0x0480,0x0490,0x0280,0x0290,0x0680,0x0690,\n0x00a0,0x00b0,0x04a0,0x04b0,0x02a0,0x02b0,0x06a0,0x06b0,\n0x4080,0x4090,0x4480,0x4490,0x4280,0x4290,0x4680,0x4690,\n0x40a0,0x40b0,0x44a0,0x44b0,0x42a0,0x42b0,0x46a0,0x46b0,\n0x0081,0x0091,0x0481,0x0491,0x0281,0x0291,0x0681,0x0691,\n0x00a1,0x00b1,0x04a1,0x04b1,0x02a1,0x02b1,0x06a1,0x06b1,\n0x4081,0x4091,0x4481,0x4491,0x4281,0x4291,0x4681,0x4691,\n0x40a1,0x40b1,0x44a1,0x44b1,0x42a1,0x42b1,0x46a1,0x46b1,\n  /* *** 128 - 191 *** */\n0x1000,0x1010,0x1400,0x1410,0x1200,0x1210,0x1600,0x1610,\n0x1020,0x1030,0x1420,0x1430,0x1220,0x1230,0x1620,0x1630,\n0x5000,0x5010,0x5400,0x5410,0x5200,0x5210,0x5600,0x5610,\n0x5020,0x5030,0x5420,0x5430,0x5220,0x5230,0x5620,0x5630,\n0x1001,0x1011,0x1401,0x1411,0x1201,0x1211,0x1601,0x1611,\n0x1021,0x1031,0x1421,0x1431,0x1221,0x1231,0x1621,0x1631,\n0x5001,0x5011,0x5401,0x5411,0x5201,0x5211,0x5601,0x5611,\n0x5021,0x5031,0x5421,0x5431,0x5221,0x5231,0x5621,0x5631,\n  /* *** 192 - 255 *** */\n0x1080,0x1090,0x1480,0x1490,0x1280,0x1290,0x1680,0x1690,\n0x10a0,0x10b0,0x14a0,0x14b0,0x12a0,0x12b0,0x16a0,0x16b0,\n0x5080,0x5090,0x5480,0x5490,0x5280,0x5290,0x5680,0x5690,\n0x50a0,0x50b0,0x54a0,0x54b0,0x52a0,0x52b0,0x56a0,0x56b0,\n0x1081,0x1091,0x1481,0x1491,0x1281,0x1291,0x1681,0x1691,\n0x10a1,0x10b1,0x14a1,0x14b1,0x12a1,0x12b1,0x16a1,0x16b1,\n0x5081,0x5091,0x5481,0x5491,0x5281,0x5291,0x5681,0x5691,\n0x50a1,0x50b1,0x54a1,0x54b1,0x52a1,0x52b1,0x56a1,0x56b1,\n// SBOX: 8 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x0008,0x0040,0x0048,0x8000,0x8008,0x8040,0x8048,\n0x0100,0x0108,0x0140,0x0148,0x8100,0x8108,0x8140,0x8148,\n0x2000,0x2008,0x2040,0x2048,0xa000,0xa008,0xa040,0xa048,\n0x2100,0x2108,0x2140,0x2148,0xa100,0xa108,0xa140,0xa148,\n0x0800,0x0808,0x0840,0x0848,0x8800,0x8808,0x8840,0x8848,\n0x0900,0x0908,0x0940,0x0948,0x8900,0x8908,0x8940,0x8948,\n0x2800,0x2808,0x2840,0x2848,0xa800,0xa808,0xa840,0xa848,\n0x2900,0x2908,0x2940,0x2948,0xa900,0xa908,0xa940,0xa948,\n  /* *** 64 - 127 *** */\n0x0004,0x000c,0x0044,0x004c,0x8004,0x800c,0x8044,0x804c,\n0x0104,0x010c,0x0144,0x014c,0x8104,0x810c,0x8144,0x814c,\n0x2004,0x200c,0x2044,0x204c,0xa004,0xa00c,0xa044,0xa04c,\n0x2104,0x210c,0x2144,0x214c,0xa104,0xa10c,0xa144,0xa14c,\n0x0804,0x080c,0x0844,0x084c,0x8804,0x880c,0x8844,0x884c,\n0x0904,0x090c,0x0944,0x094c,0x8904,0x890c,0x8944,0x894c,\n0x2804,0x280c,0x2844,0x284c,0xa804,0xa80c,0xa844,0xa84c,\n0x2904,0x290c,0x2944,0x294c,0xa904,0xa90c,0xa944,0xa94c,\n  /* *** 128 - 191 *** */\n0x0002,0x000a,0x0042,0x004a,0x8002,0x800a,0x8042,0x804a,\n0x0102,0x010a,0x0142,0x014a,0x8102,0x810a,0x8142,0x814a,\n0x2002,0x200a,0x2042,0x204a,0xa002,0xa00a,0xa042,0xa04a,\n0x2102,0x210a,0x2142,0x214a,0xa102,0xa10a,0xa142,0xa14a,\n0x0802,0x080a,0x0842,0x084a,0x8802,0x880a,0x8842,0x884a,\n0x0902,0x090a,0x0942,0x094a,0x8902,0x890a,0x8942,0x894a,\n0x2802,0x280a,0x2842,0x284a,0xa802,0xa80a,0xa842,0xa84a,\n0x2902,0x290a,0x2942,0x294a,0xa902,0xa90a,0xa942,0xa94a,\n  /* *** 192 - 255 *** */\n0x0006,0x000e,0x0046,0x004e,0x8006,0x800e,0x8046,0x804e,\n0x0106,0x010e,0x0146,0x014e,0x8106,0x810e,0x8146,0x814e,\n0x2006,0x200e,0x2046,0x204e,0xa006,0xa00e,0xa046,0xa04e,\n0x2106,0x210e,0x2146,0x214e,0xa106,0xa10e,0xa146,0xa14e,\n0x0806,0x080e,0x0846,0x084e,0x8806,0x880e,0x8846,0x884e,\n0x0906,0x090e,0x0946,0x094e,0x8906,0x890e,0x8946,0x894e,\n0x2806,0x280e,0x2846,0x284e,0xa806,0xa80e,0xa846,0xa84e,\n0x2906,0x290e,0x2946,0x294e,0xa906,0xa90e,0xa946,0xa94e,\n// SBOX: 9 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x0020,0x0400,0x0420,0x8000,0x8020,0x8400,0x8420,\n0x0040,0x0060,0x0440,0x0460,0x8040,0x8060,0x8440,0x8460,\n0x0100,0x0120,0x0500,0x0520,0x8100,0x8120,0x8500,0x8520,\n0x0140,0x0160,0x0540,0x0560,0x8140,0x8160,0x8540,0x8560,\n0x2000,0x2020,0x2400,0x2420,0xa000,0xa020,0xa400,0xa420,\n0x2040,0x2060,0x2440,0x2460,0xa040,0xa060,0xa440,0xa460,\n0x2100,0x2120,0x2500,0x2520,0xa100,0xa120,0xa500,0xa520,\n0x2140,0x2160,0x2540,0x2560,0xa140,0xa160,0xa540,0xa560,\n  /* *** 64 - 127 *** */\n0x0008,0x0028,0x0408,0x0428,0x8008,0x8028,0x8408,0x8428,\n0x0048,0x0068,0x0448,0x0468,0x8048,0x8068,0x8448,0x8468,\n0x0108,0x0128,0x0508,0x0528,0x8108,0x8128,0x8508,0x8528,\n0x0148,0x0168,0x0548,0x0568,0x8148,0x8168,0x8548,0x8568,\n0x2008,0x2028,0x2408,0x2428,0xa008,0xa028,0xa408,0xa428,\n0x2048,0x2068,0x2448,0x2468,0xa048,0xa068,0xa448,0xa468,\n0x2108,0x2128,0x2508,0x2528,0xa108,0xa128,0xa508,0xa528,\n0x2148,0x2168,0x2548,0x2568,0xa148,0xa168,0xa548,0xa568,\n  /* *** 128 - 191 *** */\n0x0001,0x0021,0x0401,0x0421,0x8001,0x8021,0x8401,0x8421,\n0x0041,0x0061,0x0441,0x0461,0x8041,0x8061,0x8441,0x8461,\n0x0101,0x0121,0x0501,0x0521,0x8101,0x8121,0x8501,0x8521,\n0x0141,0x0161,0x0541,0x0561,0x8141,0x8161,0x8541,0x8561,\n0x2001,0x2021,0x2401,0x2421,0xa001,0xa021,0xa401,0xa421,\n0x2041,0x2061,0x2441,0x2461,0xa041,0xa061,0xa441,0xa461,\n0x2101,0x2121,0x2501,0x2521,0xa101,0xa121,0xa501,0xa521,\n0x2141,0x2161,0x2541,0x2561,0xa141,0xa161,0xa541,0xa561,\n  /* *** 192 - 255 *** */\n0x0009,0x0029,0x0409,0x0429,0x8009,0x8029,0x8409,0x8429,\n0x0049,0x0069,0x0449,0x0469,0x8049,0x8069,0x8449,0x8469,\n0x0109,0x0129,0x0509,0x0529,0x8109,0x8129,0x8509,0x8529,\n0x0149,0x0169,0x0549,0x0569,0x8149,0x8169,0x8549,0x8569,\n0x2009,0x2029,0x2409,0x2429,0xa009,0xa029,0xa409,0xa429,\n0x2049,0x2069,0x2449,0x2469,0xa049,0xa069,0xa449,0xa469,\n0x2109,0x2129,0x2509,0x2529,0xa109,0xa129,0xa509,0xa529,\n0x2149,0x2169,0x2549,0x2569,0xa149,0xa169,0xa549,0xa569,\n// SBOX: 9 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x0800,0x1000,0x1800,0x0004,0x0804,0x1004,0x1804,\n0x0200,0x0a00,0x1200,0x1a00,0x0204,0x0a04,0x1204,0x1a04,\n0x0080,0x0880,0x1080,0x1880,0x0084,0x0884,0x1084,0x1884,\n0x0280,0x0a80,0x1280,0x1a80,0x0284,0x0a84,0x1284,0x1a84,\n0x0002,0x0802,0x1002,0x1802,0x0006,0x0806,0x1006,0x1806,\n0x0202,0x0a02,0x1202,0x1a02,0x0206,0x0a06,0x1206,0x1a06,\n0x0082,0x0882,0x1082,0x1882,0x0086,0x0886,0x1086,0x1886,\n0x0282,0x0a82,0x1282,0x1a82,0x0286,0x0a86,0x1286,0x1a86,\n  /* *** 64 - 127 *** */\n0x0010,0x0810,0x1010,0x1810,0x0014,0x0814,0x1014,0x1814,\n0x0210,0x0a10,0x1210,0x1a10,0x0214,0x0a14,0x1214,0x1a14,\n0x0090,0x0890,0x1090,0x1890,0x0094,0x0894,0x1094,0x1894,\n0x0290,0x0a90,0x1290,0x1a90,0x0294,0x0a94,0x1294,0x1a94,\n0x0012,0x0812,0x1012,0x1812,0x0016,0x0816,0x1016,0x1816,\n0x0212,0x0a12,0x1212,0x1a12,0x0216,0x0a16,0x1216,0x1a16,\n0x0092,0x0892,0x1092,0x1892,0x0096,0x0896,0x1096,0x1896,\n0x0292,0x0a92,0x1292,0x1a92,0x0296,0x0a96,0x1296,0x1a96,\n  /* *** 128 - 191 *** */\n0x4000,0x4800,0x5000,0x5800,0x4004,0x4804,0x5004,0x5804,\n0x4200,0x4a00,0x5200,0x5a00,0x4204,0x4a04,0x5204,0x5a04,\n0x4080,0x4880,0x5080,0x5880,0x4084,0x4884,0x5084,0x5884,\n0x4280,0x4a80,0x5280,0x5a80,0x4284,0x4a84,0x5284,0x5a84,\n0x4002,0x4802,0x5002,0x5802,0x4006,0x4806,0x5006,0x5806,\n0x4202,0x4a02,0x5202,0x5a02,0x4206,0x4a06,0x5206,0x5a06,\n0x4082,0x4882,0x5082,0x5882,0x4086,0x4886,0x5086,0x5886,\n0x4282,0x4a82,0x5282,0x5a82,0x4286,0x4a86,0x5286,0x5a86,\n  /* *** 192 - 255 *** */\n0x4010,0x4810,0x5010,0x5810,0x4014,0x4814,0x5014,0x5814,\n0x4210,0x4a10,0x5210,0x5a10,0x4214,0x4a14,0x5214,0x5a14,\n0x4090,0x4890,0x5090,0x5890,0x4094,0x4894,0x5094,0x5894,\n0x4290,0x4a90,0x5290,0x5a90,0x4294,0x4a94,0x5294,0x5a94,\n0x4012,0x4812,0x5012,0x5812,0x4016,0x4816,0x5016,0x5816,\n0x4212,0x4a12,0x5212,0x5a12,0x4216,0x4a16,0x5216,0x5a16,\n0x4092,0x4892,0x5092,0x5892,0x4096,0x4896,0x5096,0x5896,\n0x4292,0x4a92,0x5292,0x5a92,0x4296,0x4a96,0x5296,0x5a96,\n// SBOX: 10 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x0001,0x0020,0x0021,0x0008,0x0009,0x0028,0x0029,\n0x1000,0x1001,0x1020,0x1021,0x1008,0x1009,0x1028,0x1029,\n0x0040,0x0041,0x0060,0x0061,0x0048,0x0049,0x0068,0x0069,\n0x1040,0x1041,0x1060,0x1061,0x1048,0x1049,0x1068,0x1069,\n0x0100,0x0101,0x0120,0x0121,0x0108,0x0109,0x0128,0x0129,\n0x1100,0x1101,0x1120,0x1121,0x1108,0x1109,0x1128,0x1129,\n0x0140,0x0141,0x0160,0x0161,0x0148,0x0149,0x0168,0x0169,\n0x1140,0x1141,0x1160,0x1161,0x1148,0x1149,0x1168,0x1169,\n  /* *** 64 - 127 *** */\n0x0200,0x0201,0x0220,0x0221,0x0208,0x0209,0x0228,0x0229,\n0x1200,0x1201,0x1220,0x1221,0x1208,0x1209,0x1228,0x1229,\n0x0240,0x0241,0x0260,0x0261,0x0248,0x0249,0x0268,0x0269,\n0x1240,0x1241,0x1260,0x1261,0x1248,0x1249,0x1268,0x1269,\n0x0300,0x0301,0x0320,0x0321,0x0308,0x0309,0x0328,0x0329,\n0x1300,0x1301,0x1320,0x1321,0x1308,0x1309,0x1328,0x1329,\n0x0340,0x0341,0x0360,0x0361,0x0348,0x0349,0x0368,0x0369,\n0x1340,0x1341,0x1360,0x1361,0x1348,0x1349,0x1368,0x1369,\n  /* *** 128 - 191 *** */\n0x0080,0x0081,0x00a0,0x00a1,0x0088,0x0089,0x00a8,0x00a9,\n0x1080,0x1081,0x10a0,0x10a1,0x1088,0x1089,0x10a8,0x10a9,\n0x00c0,0x00c1,0x00e0,0x00e1,0x00c8,0x00c9,0x00e8,0x00e9,\n0x10c0,0x10c1,0x10e0,0x10e1,0x10c8,0x10c9,0x10e8,0x10e9,\n0x0180,0x0181,0x01a0,0x01a1,0x0188,0x0189,0x01a8,0x01a9,\n0x1180,0x1181,0x11a0,0x11a1,0x1188,0x1189,0x11a8,0x11a9,\n0x01c0,0x01c1,0x01e0,0x01e1,0x01c8,0x01c9,0x01e8,0x01e9,\n0x11c0,0x11c1,0x11e0,0x11e1,0x11c8,0x11c9,0x11e8,0x11e9,\n  /* *** 192 - 255 *** */\n0x0280,0x0281,0x02a0,0x02a1,0x0288,0x0289,0x02a8,0x02a9,\n0x1280,0x1281,0x12a0,0x12a1,0x1288,0x1289,0x12a8,0x12a9,\n0x02c0,0x02c1,0x02e0,0x02e1,0x02c8,0x02c9,0x02e8,0x02e9,\n0x12c0,0x12c1,0x12e0,0x12e1,0x12c8,0x12c9,0x12e8,0x12e9,\n0x0380,0x0381,0x03a0,0x03a1,0x0388,0x0389,0x03a8,0x03a9,\n0x1380,0x1381,0x13a0,0x13a1,0x1388,0x1389,0x13a8,0x13a9,\n0x03c0,0x03c1,0x03e0,0x03e1,0x03c8,0x03c9,0x03e8,0x03e9,\n0x13c0,0x13c1,0x13e0,0x13e1,0x13c8,0x13c9,0x13e8,0x13e9,\n// SBOX: 10 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x2000,0x0400,0x2400,0x0010,0x2010,0x0410,0x2410,\n0x8000,0xa000,0x8400,0xa400,0x8010,0xa010,0x8410,0xa410,\n0x0800,0x2800,0x0c00,0x2c00,0x0810,0x2810,0x0c10,0x2c10,\n0x8800,0xa800,0x8c00,0xac00,0x8810,0xa810,0x8c10,0xac10,\n0x0002,0x2002,0x0402,0x2402,0x0012,0x2012,0x0412,0x2412,\n0x8002,0xa002,0x8402,0xa402,0x8012,0xa012,0x8412,0xa412,\n0x0802,0x2802,0x0c02,0x2c02,0x0812,0x2812,0x0c12,0x2c12,\n0x8802,0xa802,0x8c02,0xac02,0x8812,0xa812,0x8c12,0xac12,\n  /* *** 64 - 127 *** */\n0x4000,0x6000,0x4400,0x6400,0x4010,0x6010,0x4410,0x6410,\n0xc000,0xe000,0xc400,0xe400,0xc010,0xe010,0xc410,0xe410,\n0x4800,0x6800,0x4c00,0x6c00,0x4810,0x6810,0x4c10,0x6c10,\n0xc800,0xe800,0xcc00,0xec00,0xc810,0xe810,0xcc10,0xec10,\n0x4002,0x6002,0x4402,0x6402,0x4012,0x6012,0x4412,0x6412,\n0xc002,0xe002,0xc402,0xe402,0xc012,0xe012,0xc412,0xe412,\n0x4802,0x6802,0x4c02,0x6c02,0x4812,0x6812,0x4c12,0x6c12,\n0xc802,0xe802,0xcc02,0xec02,0xc812,0xe812,0xcc12,0xec12,\n  /* *** 128 - 191 *** */\n0x0004,0x2004,0x0404,0x2404,0x0014,0x2014,0x0414,0x2414,\n0x8004,0xa004,0x8404,0xa404,0x8014,0xa014,0x8414,0xa414,\n0x0804,0x2804,0x0c04,0x2c04,0x0814,0x2814,0x0c14,0x2c14,\n0x8804,0xa804,0x8c04,0xac04,0x8814,0xa814,0x8c14,0xac14,\n0x0006,0x2006,0x0406,0x2406,0x0016,0x2016,0x0416,0x2416,\n0x8006,0xa006,0x8406,0xa406,0x8016,0xa016,0x8416,0xa416,\n0x0806,0x2806,0x0c06,0x2c06,0x0816,0x2816,0x0c16,0x2c16,\n0x8806,0xa806,0x8c06,0xac06,0x8816,0xa816,0x8c16,0xac16,\n  /* *** 192 - 255 *** */\n0x4004,0x6004,0x4404,0x6404,0x4014,0x6014,0x4414,0x6414,\n0xc004,0xe004,0xc404,0xe404,0xc014,0xe014,0xc414,0xe414,\n0x4804,0x6804,0x4c04,0x6c04,0x4814,0x6814,0x4c14,0x6c14,\n0xc804,0xe804,0xcc04,0xec04,0xc814,0xe814,0xcc14,0xec14,\n0x4006,0x6006,0x4406,0x6406,0x4016,0x6016,0x4416,0x6416,\n0xc006,0xe006,0xc406,0xe406,0xc016,0xe016,0xc416,0xe416,\n0x4806,0x6806,0x4c06,0x6c06,0x4816,0x6816,0x4c16,0x6c16,\n0xc806,0xe806,0xcc06,0xec06,0xc816,0xe816,0xcc16,0xec16,\n// SBOX: 11 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x1000,0x0200,0x1200,0x0040,0x1040,0x0240,0x1240,\n0x0008,0x1008,0x0208,0x1208,0x0048,0x1048,0x0248,0x1248,\n0x0080,0x1080,0x0280,0x1280,0x00c0,0x10c0,0x02c0,0x12c0,\n0x0088,0x1088,0x0288,0x1288,0x00c8,0x10c8,0x02c8,0x12c8,\n0x0010,0x1010,0x0210,0x1210,0x0050,0x1050,0x0250,0x1250,\n0x0018,0x1018,0x0218,0x1218,0x0058,0x1058,0x0258,0x1258,\n0x0090,0x1090,0x0290,0x1290,0x00d0,0x10d0,0x02d0,0x12d0,\n0x0098,0x1098,0x0298,0x1298,0x00d8,0x10d8,0x02d8,0x12d8,\n  /* *** 64 - 127 *** */\n0x0001,0x1001,0x0201,0x1201,0x0041,0x1041,0x0241,0x1241,\n0x0009,0x1009,0x0209,0x1209,0x0049,0x1049,0x0249,0x1249,\n0x0081,0x1081,0x0281,0x1281,0x00c1,0x10c1,0x02c1,0x12c1,\n0x0089,0x1089,0x0289,0x1289,0x00c9,0x10c9,0x02c9,0x12c9,\n0x0011,0x1011,0x0211,0x1211,0x0051,0x1051,0x0251,0x1251,\n0x0019,0x1019,0x0219,0x1219,0x0059,0x1059,0x0259,0x1259,\n0x0091,0x1091,0x0291,0x1291,0x00d1,0x10d1,0x02d1,0x12d1,\n0x0099,0x1099,0x0299,0x1299,0x00d9,0x10d9,0x02d9,0x12d9,\n  /* *** 128 - 191 *** */\n0x8000,0x9000,0x8200,0x9200,0x8040,0x9040,0x8240,0x9240,\n0x8008,0x9008,0x8208,0x9208,0x8048,0x9048,0x8248,0x9248,\n0x8080,0x9080,0x8280,0x9280,0x80c0,0x90c0,0x82c0,0x92c0,\n0x8088,0x9088,0x8288,0x9288,0x80c8,0x90c8,0x82c8,0x92c8,\n0x8010,0x9010,0x8210,0x9210,0x8050,0x9050,0x8250,0x9250,\n0x8018,0x9018,0x8218,0x9218,0x8058,0x9058,0x8258,0x9258,\n0x8090,0x9090,0x8290,0x9290,0x80d0,0x90d0,0x82d0,0x92d0,\n0x8098,0x9098,0x8298,0x9298,0x80d8,0x90d8,0x82d8,0x92d8,\n  /* *** 192 - 255 *** */\n0x8001,0x9001,0x8201,0x9201,0x8041,0x9041,0x8241,0x9241,\n0x8009,0x9009,0x8209,0x9209,0x8049,0x9049,0x8249,0x9249,\n0x8081,0x9081,0x8281,0x9281,0x80c1,0x90c1,0x82c1,0x92c1,\n0x8089,0x9089,0x8289,0x9289,0x80c9,0x90c9,0x82c9,0x92c9,\n0x8011,0x9011,0x8211,0x9211,0x8051,0x9051,0x8251,0x9251,\n0x8019,0x9019,0x8219,0x9219,0x8059,0x9059,0x8259,0x9259,\n0x8091,0x9091,0x8291,0x9291,0x80d1,0x90d1,0x82d1,0x92d1,\n0x8099,0x9099,0x8299,0x9299,0x80d9,0x90d9,0x82d9,0x92d9,\n// SBOX: 11 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x0002,0x0400,0x0402,0x0100,0x0102,0x0500,0x0502,\n0x0020,0x0022,0x0420,0x0422,0x0120,0x0122,0x0520,0x0522,\n0x0800,0x0802,0x0c00,0x0c02,0x0900,0x0902,0x0d00,0x0d02,\n0x0820,0x0822,0x0c20,0x0c22,0x0920,0x0922,0x0d20,0x0d22,\n0x2000,0x2002,0x2400,0x2402,0x2100,0x2102,0x2500,0x2502,\n0x2020,0x2022,0x2420,0x2422,0x2120,0x2122,0x2520,0x2522,\n0x2800,0x2802,0x2c00,0x2c02,0x2900,0x2902,0x2d00,0x2d02,\n0x2820,0x2822,0x2c20,0x2c22,0x2920,0x2922,0x2d20,0x2d22,\n  /* *** 64 - 127 *** */\n0x4000,0x4002,0x4400,0x4402,0x4100,0x4102,0x4500,0x4502,\n0x4020,0x4022,0x4420,0x4422,0x4120,0x4122,0x4520,0x4522,\n0x4800,0x4802,0x4c00,0x4c02,0x4900,0x4902,0x4d00,0x4d02,\n0x4820,0x4822,0x4c20,0x4c22,0x4920,0x4922,0x4d20,0x4d22,\n0x6000,0x6002,0x6400,0x6402,0x6100,0x6102,0x6500,0x6502,\n0x6020,0x6022,0x6420,0x6422,0x6120,0x6122,0x6520,0x6522,\n0x6800,0x6802,0x6c00,0x6c02,0x6900,0x6902,0x6d00,0x6d02,\n0x6820,0x6822,0x6c20,0x6c22,0x6920,0x6922,0x6d20,0x6d22,\n  /* *** 128 - 191 *** */\n0x0004,0x0006,0x0404,0x0406,0x0104,0x0106,0x0504,0x0506,\n0x0024,0x0026,0x0424,0x0426,0x0124,0x0126,0x0524,0x0526,\n0x0804,0x0806,0x0c04,0x0c06,0x0904,0x0906,0x0d04,0x0d06,\n0x0824,0x0826,0x0c24,0x0c26,0x0924,0x0926,0x0d24,0x0d26,\n0x2004,0x2006,0x2404,0x2406,0x2104,0x2106,0x2504,0x2506,\n0x2024,0x2026,0x2424,0x2426,0x2124,0x2126,0x2524,0x2526,\n0x2804,0x2806,0x2c04,0x2c06,0x2904,0x2906,0x2d04,0x2d06,\n0x2824,0x2826,0x2c24,0x2c26,0x2924,0x2926,0x2d24,0x2d26,\n  /* *** 192 - 255 *** */\n0x4004,0x4006,0x4404,0x4406,0x4104,0x4106,0x4504,0x4506,\n0x4024,0x4026,0x4424,0x4426,0x4124,0x4126,0x4524,0x4526,\n0x4804,0x4806,0x4c04,0x4c06,0x4904,0x4906,0x4d04,0x4d06,\n0x4824,0x4826,0x4c24,0x4c26,0x4924,0x4926,0x4d24,0x4d26,\n0x6004,0x6006,0x6404,0x6406,0x6104,0x6106,0x6504,0x6506,\n0x6024,0x6026,0x6424,0x6426,0x6124,0x6126,0x6524,0x6526,\n0x6804,0x6806,0x6c04,0x6c06,0x6904,0x6906,0x6d04,0x6d06,\n0x6824,0x6826,0x6c24,0x6c26,0x6924,0x6926,0x6d24,0x6d26,\n// SBOX: 12 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x0200,0x0010,0x0210,0x8000,0x8200,0x8010,0x8210,\n0x0008,0x0208,0x0018,0x0218,0x8008,0x8208,0x8018,0x8218,\n0x1000,0x1200,0x1010,0x1210,0x9000,0x9200,0x9010,0x9210,\n0x1008,0x1208,0x1018,0x1218,0x9008,0x9208,0x9018,0x9218,\n0x0080,0x0280,0x0090,0x0290,0x8080,0x8280,0x8090,0x8290,\n0x0088,0x0288,0x0098,0x0298,0x8088,0x8288,0x8098,0x8298,\n0x1080,0x1280,0x1090,0x1290,0x9080,0x9280,0x9090,0x9290,\n0x1088,0x1288,0x1098,0x1298,0x9088,0x9288,0x9098,0x9298,\n  /* *** 64 - 127 *** */\n0x0001,0x0201,0x0011,0x0211,0x8001,0x8201,0x8011,0x8211,\n0x0009,0x0209,0x0019,0x0219,0x8009,0x8209,0x8019,0x8219,\n0x1001,0x1201,0x1011,0x1211,0x9001,0x9201,0x9011,0x9211,\n0x1009,0x1209,0x1019,0x1219,0x9009,0x9209,0x9019,0x9219,\n0x0081,0x0281,0x0091,0x0291,0x8081,0x8281,0x8091,0x8291,\n0x0089,0x0289,0x0099,0x0299,0x8089,0x8289,0x8099,0x8299,\n0x1081,0x1281,0x1091,0x1291,0x9081,0x9281,0x9091,0x9291,\n0x1089,0x1289,0x1099,0x1299,0x9089,0x9289,0x9099,0x9299,\n  /* *** 128 - 191 *** */\n0x4000,0x4200,0x4010,0x4210,0xc000,0xc200,0xc010,0xc210,\n0x4008,0x4208,0x4018,0x4218,0xc008,0xc208,0xc018,0xc218,\n0x5000,0x5200,0x5010,0x5210,0xd000,0xd200,0xd010,0xd210,\n0x5008,0x5208,0x5018,0x5218,0xd008,0xd208,0xd018,0xd218,\n0x4080,0x4280,0x4090,0x4290,0xc080,0xc280,0xc090,0xc290,\n0x4088,0x4288,0x4098,0x4298,0xc088,0xc288,0xc098,0xc298,\n0x5080,0x5280,0x5090,0x5290,0xd080,0xd280,0xd090,0xd290,\n0x5088,0x5288,0x5098,0x5298,0xd088,0xd288,0xd098,0xd298,\n  /* *** 192 - 255 *** */\n0x4001,0x4201,0x4011,0x4211,0xc001,0xc201,0xc011,0xc211,\n0x4009,0x4209,0x4019,0x4219,0xc009,0xc209,0xc019,0xc219,\n0x5001,0x5201,0x5011,0x5211,0xd001,0xd201,0xd011,0xd211,\n0x5009,0x5209,0x5019,0x5219,0xd009,0xd209,0xd019,0xd219,\n0x4081,0x4281,0x4091,0x4291,0xc081,0xc281,0xc091,0xc291,\n0x4089,0x4289,0x4099,0x4299,0xc089,0xc289,0xc099,0xc299,\n0x5081,0x5281,0x5091,0x5291,0xd081,0xd281,0xd091,0xd291,\n0x5089,0x5289,0x5099,0x5299,0xd089,0xd289,0xd099,0xd299,\n// SBOX: 12 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x0004,0x0100,0x0104,0x0002,0x0006,0x0102,0x0106,\n0x0040,0x0044,0x0140,0x0144,0x0042,0x0046,0x0142,0x0146,\n0x0020,0x0024,0x0120,0x0124,0x0022,0x0026,0x0122,0x0126,\n0x0060,0x0064,0x0160,0x0164,0x0062,0x0066,0x0162,0x0166,\n0x0800,0x0804,0x0900,0x0904,0x0802,0x0806,0x0902,0x0906,\n0x0840,0x0844,0x0940,0x0944,0x0842,0x0846,0x0942,0x0946,\n0x0820,0x0824,0x0920,0x0924,0x0822,0x0826,0x0922,0x0926,\n0x0860,0x0864,0x0960,0x0964,0x0862,0x0866,0x0962,0x0966,\n  /* *** 64 - 127 *** */\n0x0400,0x0404,0x0500,0x0504,0x0402,0x0406,0x0502,0x0506,\n0x0440,0x0444,0x0540,0x0544,0x0442,0x0446,0x0542,0x0546,\n0x0420,0x0424,0x0520,0x0524,0x0422,0x0426,0x0522,0x0526,\n0x0460,0x0464,0x0560,0x0564,0x0462,0x0466,0x0562,0x0566,\n0x0c00,0x0c04,0x0d00,0x0d04,0x0c02,0x0c06,0x0d02,0x0d06,\n0x0c40,0x0c44,0x0d40,0x0d44,0x0c42,0x0c46,0x0d42,0x0d46,\n0x0c20,0x0c24,0x0d20,0x0d24,0x0c22,0x0c26,0x0d22,0x0d26,\n0x0c60,0x0c64,0x0d60,0x0d64,0x0c62,0x0c66,0x0d62,0x0d66,\n  /* *** 128 - 191 *** */\n0x2000,0x2004,0x2100,0x2104,0x2002,0x2006,0x2102,0x2106,\n0x2040,0x2044,0x2140,0x2144,0x2042,0x2046,0x2142,0x2146,\n0x2020,0x2024,0x2120,0x2124,0x2022,0x2026,0x2122,0x2126,\n0x2060,0x2064,0x2160,0x2164,0x2062,0x2066,0x2162,0x2166,\n0x2800,0x2804,0x2900,0x2904,0x2802,0x2806,0x2902,0x2906,\n0x2840,0x2844,0x2940,0x2944,0x2842,0x2846,0x2942,0x2946,\n0x2820,0x2824,0x2920,0x2924,0x2822,0x2826,0x2922,0x2926,\n0x2860,0x2864,0x2960,0x2964,0x2862,0x2866,0x2962,0x2966,\n  /* *** 192 - 255 *** */\n0x2400,0x2404,0x2500,0x2504,0x2402,0x2406,0x2502,0x2506,\n0x2440,0x2444,0x2540,0x2544,0x2442,0x2446,0x2542,0x2546,\n0x2420,0x2424,0x2520,0x2524,0x2422,0x2426,0x2522,0x2526,\n0x2460,0x2464,0x2560,0x2564,0x2462,0x2466,0x2562,0x2566,\n0x2c00,0x2c04,0x2d00,0x2d04,0x2c02,0x2c06,0x2d02,0x2d06,\n0x2c40,0x2c44,0x2d40,0x2d44,0x2c42,0x2c46,0x2d42,0x2d46,\n0x2c20,0x2c24,0x2d20,0x2d24,0x2c22,0x2c26,0x2d22,0x2d26,\n0x2c60,0x2c64,0x2d60,0x2d64,0x2c62,0x2c66,0x2d62,0x2d66,\n// SBOX: 13 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x0008,0x0040,0x0048,0x0020,0x0028,0x0060,0x0068,\n0x0800,0x0808,0x0840,0x0848,0x0820,0x0828,0x0860,0x0868,\n0x0010,0x0018,0x0050,0x0058,0x0030,0x0038,0x0070,0x0078,\n0x0810,0x0818,0x0850,0x0858,0x0830,0x0838,0x0870,0x0878,\n0x2000,0x2008,0x2040,0x2048,0x2020,0x2028,0x2060,0x2068,\n0x2800,0x2808,0x2840,0x2848,0x2820,0x2828,0x2860,0x2868,\n0x2010,0x2018,0x2050,0x2058,0x2030,0x2038,0x2070,0x2078,\n0x2810,0x2818,0x2850,0x2858,0x2830,0x2838,0x2870,0x2878,\n  /* *** 64 - 127 *** */\n0x0400,0x0408,0x0440,0x0448,0x0420,0x0428,0x0460,0x0468,\n0x0c00,0x0c08,0x0c40,0x0c48,0x0c20,0x0c28,0x0c60,0x0c68,\n0x0410,0x0418,0x0450,0x0458,0x0430,0x0438,0x0470,0x0478,\n0x0c10,0x0c18,0x0c50,0x0c58,0x0c30,0x0c38,0x0c70,0x0c78,\n0x2400,0x2408,0x2440,0x2448,0x2420,0x2428,0x2460,0x2468,\n0x2c00,0x2c08,0x2c40,0x2c48,0x2c20,0x2c28,0x2c60,0x2c68,\n0x2410,0x2418,0x2450,0x2458,0x2430,0x2438,0x2470,0x2478,\n0x2c10,0x2c18,0x2c50,0x2c58,0x2c30,0x2c38,0x2c70,0x2c78,\n  /* *** 128 - 191 *** */\n0x0001,0x0009,0x0041,0x0049,0x0021,0x0029,0x0061,0x0069,\n0x0801,0x0809,0x0841,0x0849,0x0821,0x0829,0x0861,0x0869,\n0x0011,0x0019,0x0051,0x0059,0x0031,0x0039,0x0071,0x0079,\n0x0811,0x0819,0x0851,0x0859,0x0831,0x0839,0x0871,0x0879,\n0x2001,0x2009,0x2041,0x2049,0x2021,0x2029,0x2061,0x2069,\n0x2801,0x2809,0x2841,0x2849,0x2821,0x2829,0x2861,0x2869,\n0x2011,0x2019,0x2051,0x2059,0x2031,0x2039,0x2071,0x2079,\n0x2811,0x2819,0x2851,0x2859,0x2831,0x2839,0x2871,0x2879,\n  /* *** 192 - 255 *** */\n0x0401,0x0409,0x0441,0x0449,0x0421,0x0429,0x0461,0x0469,\n0x0c01,0x0c09,0x0c41,0x0c49,0x0c21,0x0c29,0x0c61,0x0c69,\n0x0411,0x0419,0x0451,0x0459,0x0431,0x0439,0x0471,0x0479,\n0x0c11,0x0c19,0x0c51,0x0c59,0x0c31,0x0c39,0x0c71,0x0c79,\n0x2401,0x2409,0x2441,0x2449,0x2421,0x2429,0x2461,0x2469,\n0x2c01,0x2c09,0x2c41,0x2c49,0x2c21,0x2c29,0x2c61,0x2c69,\n0x2411,0x2419,0x2451,0x2459,0x2431,0x2439,0x2471,0x2479,\n0x2c11,0x2c19,0x2c51,0x2c59,0x2c31,0x2c39,0x2c71,0x2c79,\n// SBOX: 13 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x4000,0x0100,0x4100,0x0200,0x4200,0x0300,0x4300,\n0x0004,0x4004,0x0104,0x4104,0x0204,0x4204,0x0304,0x4304,\n0x0080,0x4080,0x0180,0x4180,0x0280,0x4280,0x0380,0x4380,\n0x0084,0x4084,0x0184,0x4184,0x0284,0x4284,0x0384,0x4384,\n0x0002,0x4002,0x0102,0x4102,0x0202,0x4202,0x0302,0x4302,\n0x0006,0x4006,0x0106,0x4106,0x0206,0x4206,0x0306,0x4306,\n0x0082,0x4082,0x0182,0x4182,0x0282,0x4282,0x0382,0x4382,\n0x0086,0x4086,0x0186,0x4186,0x0286,0x4286,0x0386,0x4386,\n  /* *** 64 - 127 *** */\n0x1000,0x5000,0x1100,0x5100,0x1200,0x5200,0x1300,0x5300,\n0x1004,0x5004,0x1104,0x5104,0x1204,0x5204,0x1304,0x5304,\n0x1080,0x5080,0x1180,0x5180,0x1280,0x5280,0x1380,0x5380,\n0x1084,0x5084,0x1184,0x5184,0x1284,0x5284,0x1384,0x5384,\n0x1002,0x5002,0x1102,0x5102,0x1202,0x5202,0x1302,0x5302,\n0x1006,0x5006,0x1106,0x5106,0x1206,0x5206,0x1306,0x5306,\n0x1082,0x5082,0x1182,0x5182,0x1282,0x5282,0x1382,0x5382,\n0x1086,0x5086,0x1186,0x5186,0x1286,0x5286,0x1386,0x5386,\n  /* *** 128 - 191 *** */\n0x8000,0xc000,0x8100,0xc100,0x8200,0xc200,0x8300,0xc300,\n0x8004,0xc004,0x8104,0xc104,0x8204,0xc204,0x8304,0xc304,\n0x8080,0xc080,0x8180,0xc180,0x8280,0xc280,0x8380,0xc380,\n0x8084,0xc084,0x8184,0xc184,0x8284,0xc284,0x8384,0xc384,\n0x8002,0xc002,0x8102,0xc102,0x8202,0xc202,0x8302,0xc302,\n0x8006,0xc006,0x8106,0xc106,0x8206,0xc206,0x8306,0xc306,\n0x8082,0xc082,0x8182,0xc182,0x8282,0xc282,0x8382,0xc382,\n0x8086,0xc086,0x8186,0xc186,0x8286,0xc286,0x8386,0xc386,\n  /* *** 192 - 255 *** */\n0x9000,0xd000,0x9100,0xd100,0x9200,0xd200,0x9300,0xd300,\n0x9004,0xd004,0x9104,0xd104,0x9204,0xd204,0x9304,0xd304,\n0x9080,0xd080,0x9180,0xd180,0x9280,0xd280,0x9380,0xd380,\n0x9084,0xd084,0x9184,0xd184,0x9284,0xd284,0x9384,0xd384,\n0x9002,0xd002,0x9102,0xd102,0x9202,0xd202,0x9302,0xd302,\n0x9006,0xd006,0x9106,0xd106,0x9206,0xd206,0x9306,0xd306,\n0x9082,0xd082,0x9182,0xd182,0x9282,0xd282,0x9382,0xd382,\n0x9086,0xd086,0x9186,0xd186,0x9286,0xd286,0x9386,0xd386,\n// SBOX: 14 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x0010,0x0200,0x0210,0x0800,0x0810,0x0a00,0x0a10,\n0x0080,0x0090,0x0280,0x0290,0x0880,0x0890,0x0a80,0x0a90,\n0x0400,0x0410,0x0600,0x0610,0x0c00,0x0c10,0x0e00,0x0e10,\n0x0480,0x0490,0x0680,0x0690,0x0c80,0x0c90,0x0e80,0x0e90,\n0x0008,0x0018,0x0208,0x0218,0x0808,0x0818,0x0a08,0x0a18,\n0x0088,0x0098,0x0288,0x0298,0x0888,0x0898,0x0a88,0x0a98,\n0x0408,0x0418,0x0608,0x0618,0x0c08,0x0c18,0x0e08,0x0e18,\n0x0488,0x0498,0x0688,0x0698,0x0c88,0x0c98,0x0e88,0x0e98,\n  /* *** 64 - 127 *** */\n0x2000,0x2010,0x2200,0x2210,0x2800,0x2810,0x2a00,0x2a10,\n0x2080,0x2090,0x2280,0x2290,0x2880,0x2890,0x2a80,0x2a90,\n0x2400,0x2410,0x2600,0x2610,0x2c00,0x2c10,0x2e00,0x2e10,\n0x2480,0x2490,0x2680,0x2690,0x2c80,0x2c90,0x2e80,0x2e90,\n0x2008,0x2018,0x2208,0x2218,0x2808,0x2818,0x2a08,0x2a18,\n0x2088,0x2098,0x2288,0x2298,0x2888,0x2898,0x2a88,0x2a98,\n0x2408,0x2418,0x2608,0x2618,0x2c08,0x2c18,0x2e08,0x2e18,\n0x2488,0x2498,0x2688,0x2698,0x2c88,0x2c98,0x2e88,0x2e98,\n  /* *** 128 - 191 *** */\n0x0100,0x0110,0x0300,0x0310,0x0900,0x0910,0x0b00,0x0b10,\n0x0180,0x0190,0x0380,0x0390,0x0980,0x0990,0x0b80,0x0b90,\n0x0500,0x0510,0x0700,0x0710,0x0d00,0x0d10,0x0f00,0x0f10,\n0x0580,0x0590,0x0780,0x0790,0x0d80,0x0d90,0x0f80,0x0f90,\n0x0108,0x0118,0x0308,0x0318,0x0908,0x0918,0x0b08,0x0b18,\n0x0188,0x0198,0x0388,0x0398,0x0988,0x0998,0x0b88,0x0b98,\n0x0508,0x0518,0x0708,0x0718,0x0d08,0x0d18,0x0f08,0x0f18,\n0x0588,0x0598,0x0788,0x0798,0x0d88,0x0d98,0x0f88,0x0f98,\n  /* *** 192 - 255 *** */\n0x2100,0x2110,0x2300,0x2310,0x2900,0x2910,0x2b00,0x2b10,\n0x2180,0x2190,0x2380,0x2390,0x2980,0x2990,0x2b80,0x2b90,\n0x2500,0x2510,0x2700,0x2710,0x2d00,0x2d10,0x2f00,0x2f10,\n0x2580,0x2590,0x2780,0x2790,0x2d80,0x2d90,0x2f80,0x2f90,\n0x2108,0x2118,0x2308,0x2318,0x2908,0x2918,0x2b08,0x2b18,\n0x2188,0x2198,0x2388,0x2398,0x2988,0x2998,0x2b88,0x2b98,\n0x2508,0x2518,0x2708,0x2718,0x2d08,0x2d18,0x2f08,0x2f18,\n0x2588,0x2598,0x2788,0x2798,0x2d88,0x2d98,0x2f88,0x2f98,\n// SBOX: 14 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x8000,0x0020,0x8020,0x1000,0x9000,0x1020,0x9020,\n0x0004,0x8004,0x0024,0x8024,0x1004,0x9004,0x1024,0x9024,\n0x0001,0x8001,0x0021,0x8021,0x1001,0x9001,0x1021,0x9021,\n0x0005,0x8005,0x0025,0x8025,0x1005,0x9005,0x1025,0x9025,\n0x4000,0xc000,0x4020,0xc020,0x5000,0xd000,0x5020,0xd020,\n0x4004,0xc004,0x4024,0xc024,0x5004,0xd004,0x5024,0xd024,\n0x4001,0xc001,0x4021,0xc021,0x5001,0xd001,0x5021,0xd021,\n0x4005,0xc005,0x4025,0xc025,0x5005,0xd005,0x5025,0xd025,\n  /* *** 64 - 127 *** */\n0x0040,0x8040,0x0060,0x8060,0x1040,0x9040,0x1060,0x9060,\n0x0044,0x8044,0x0064,0x8064,0x1044,0x9044,0x1064,0x9064,\n0x0041,0x8041,0x0061,0x8061,0x1041,0x9041,0x1061,0x9061,\n0x0045,0x8045,0x0065,0x8065,0x1045,0x9045,0x1065,0x9065,\n0x4040,0xc040,0x4060,0xc060,0x5040,0xd040,0x5060,0xd060,\n0x4044,0xc044,0x4064,0xc064,0x5044,0xd044,0x5064,0xd064,\n0x4041,0xc041,0x4061,0xc061,0x5041,0xd041,0x5061,0xd061,\n0x4045,0xc045,0x4065,0xc065,0x5045,0xd045,0x5065,0xd065,\n  /* *** 128 - 191 *** */\n0x0002,0x8002,0x0022,0x8022,0x1002,0x9002,0x1022,0x9022,\n0x0006,0x8006,0x0026,0x8026,0x1006,0x9006,0x1026,0x9026,\n0x0003,0x8003,0x0023,0x8023,0x1003,0x9003,0x1023,0x9023,\n0x0007,0x8007,0x0027,0x8027,0x1007,0x9007,0x1027,0x9027,\n0x4002,0xc002,0x4022,0xc022,0x5002,0xd002,0x5022,0xd022,\n0x4006,0xc006,0x4026,0xc026,0x5006,0xd006,0x5026,0xd026,\n0x4003,0xc003,0x4023,0xc023,0x5003,0xd003,0x5023,0xd023,\n0x4007,0xc007,0x4027,0xc027,0x5007,0xd007,0x5027,0xd027,\n  /* *** 192 - 255 *** */\n0x0042,0x8042,0x0062,0x8062,0x1042,0x9042,0x1062,0x9062,\n0x0046,0x8046,0x0066,0x8066,0x1046,0x9046,0x1066,0x9066,\n0x0043,0x8043,0x0063,0x8063,0x1043,0x9043,0x1063,0x9063,\n0x0047,0x8047,0x0067,0x8067,0x1047,0x9047,0x1067,0x9067,\n0x4042,0xc042,0x4062,0xc062,0x5042,0xd042,0x5062,0xd062,\n0x4046,0xc046,0x4066,0xc066,0x5046,0xd046,0x5066,0xd066,\n0x4043,0xc043,0x4063,0xc063,0x5043,0xd043,0x5063,0xd063,\n0x4047,0xc047,0x4067,0xc067,0x5047,0xd047,0x5067,0xd067,\n// SBOX: 15 , 0000-FF00\n  /* *** 0 - 63 *** */\n0x0000,0x0010,0x2000,0x2010,0x0080,0x0090,0x2080,0x2090,\n0x0002,0x0012,0x2002,0x2012,0x0082,0x0092,0x2082,0x2092,\n0x8000,0x8010,0xa000,0xa010,0x8080,0x8090,0xa080,0xa090,\n0x8002,0x8012,0xa002,0xa012,0x8082,0x8092,0xa082,0xa092,\n0x0001,0x0011,0x2001,0x2011,0x0081,0x0091,0x2081,0x2091,\n0x0003,0x0013,0x2003,0x2013,0x0083,0x0093,0x2083,0x2093,\n0x8001,0x8011,0xa001,0xa011,0x8081,0x8091,0xa081,0xa091,\n0x8003,0x8013,0xa003,0xa013,0x8083,0x8093,0xa083,0xa093,\n  /* *** 64 - 127 *** */\n0x0004,0x0014,0x2004,0x2014,0x0084,0x0094,0x2084,0x2094,\n0x0006,0x0016,0x2006,0x2016,0x0086,0x0096,0x2086,0x2096,\n0x8004,0x8014,0xa004,0xa014,0x8084,0x8094,0xa084,0xa094,\n0x8006,0x8016,0xa006,0xa016,0x8086,0x8096,0xa086,0xa096,\n0x0005,0x0015,0x2005,0x2015,0x0085,0x0095,0x2085,0x2095,\n0x0007,0x0017,0x2007,0x2017,0x0087,0x0097,0x2087,0x2097,\n0x8005,0x8015,0xa005,0xa015,0x8085,0x8095,0xa085,0xa095,\n0x8007,0x8017,0xa007,0xa017,0x8087,0x8097,0xa087,0xa097,\n  /* *** 128 - 191 *** */\n0x4000,0x4010,0x6000,0x6010,0x4080,0x4090,0x6080,0x6090,\n0x4002,0x4012,0x6002,0x6012,0x4082,0x4092,0x6082,0x6092,\n0xc000,0xc010,0xe000,0xe010,0xc080,0xc090,0xe080,0xe090,\n0xc002,0xc012,0xe002,0xe012,0xc082,0xc092,0xe082,0xe092,\n0x4001,0x4011,0x6001,0x6011,0x4081,0x4091,0x6081,0x6091,\n0x4003,0x4013,0x6003,0x6013,0x4083,0x4093,0x6083,0x6093,\n0xc001,0xc011,0xe001,0xe011,0xc081,0xc091,0xe081,0xe091,\n0xc003,0xc013,0xe003,0xe013,0xc083,0xc093,0xe083,0xe093,\n  /* *** 192 - 255 *** */\n0x4004,0x4014,0x6004,0x6014,0x4084,0x4094,0x6084,0x6094,\n0x4006,0x4016,0x6006,0x6016,0x4086,0x4096,0x6086,0x6096,\n0xc004,0xc014,0xe004,0xe014,0xc084,0xc094,0xe084,0xe094,\n0xc006,0xc016,0xe006,0xe016,0xc086,0xc096,0xe086,0xe096,\n0x4005,0x4015,0x6005,0x6015,0x4085,0x4095,0x6085,0x6095,\n0x4007,0x4017,0x6007,0x6017,0x4087,0x4097,0x6087,0x6097,\n0xc005,0xc015,0xe005,0xe015,0xc085,0xc095,0xe085,0xe095,\n0xc007,0xc017,0xe007,0xe017,0xc087,0xc097,0xe087,0xe097,\n// SBOX: 15 , 0000-00FF\n  /* *** 0 - 63 *** */\n0x0000,0x0200,0x0400,0x0600,0x1000,0x1200,0x1400,0x1600,\n0x0040,0x0240,0x0440,0x0640,0x1040,0x1240,0x1440,0x1640,\n0x0020,0x0220,0x0420,0x0620,0x1020,0x1220,0x1420,0x1620,\n0x0060,0x0260,0x0460,0x0660,0x1060,0x1260,0x1460,0x1660,\n0x0008,0x0208,0x0408,0x0608,0x1008,0x1208,0x1408,0x1608,\n0x0048,0x0248,0x0448,0x0648,0x1048,0x1248,0x1448,0x1648,\n0x0028,0x0228,0x0428,0x0628,0x1028,0x1228,0x1428,0x1628,\n0x0068,0x0268,0x0468,0x0668,0x1068,0x1268,0x1468,0x1668,\n  /* *** 64 - 127 *** */\n0x0800,0x0a00,0x0c00,0x0e00,0x1800,0x1a00,0x1c00,0x1e00,\n0x0840,0x0a40,0x0c40,0x0e40,0x1840,0x1a40,0x1c40,0x1e40,\n0x0820,0x0a20,0x0c20,0x0e20,0x1820,0x1a20,0x1c20,0x1e20,\n0x0860,0x0a60,0x0c60,0x0e60,0x1860,0x1a60,0x1c60,0x1e60,\n0x0808,0x0a08,0x0c08,0x0e08,0x1808,0x1a08,0x1c08,0x1e08,\n0x0848,0x0a48,0x0c48,0x0e48,0x1848,0x1a48,0x1c48,0x1e48,\n0x0828,0x0a28,0x0c28,0x0e28,0x1828,0x1a28,0x1c28,0x1e28,\n0x0868,0x0a68,0x0c68,0x0e68,0x1868,0x1a68,0x1c68,0x1e68,\n  /* *** 128 - 191 *** */\n0x0100,0x0300,0x0500,0x0700,0x1100,0x1300,0x1500,0x1700,\n0x0140,0x0340,0x0540,0x0740,0x1140,0x1340,0x1540,0x1740,\n0x0120,0x0320,0x0520,0x0720,0x1120,0x1320,0x1520,0x1720,\n0x0160,0x0360,0x0560,0x0760,0x1160,0x1360,0x1560,0x1760,\n0x0108,0x0308,0x0508,0x0708,0x1108,0x1308,0x1508,0x1708,\n0x0148,0x0348,0x0548,0x0748,0x1148,0x1348,0x1548,0x1748,\n0x0128,0x0328,0x0528,0x0728,0x1128,0x1328,0x1528,0x1728,\n0x0168,0x0368,0x0568,0x0768,0x1168,0x1368,0x1568,0x1768,\n  /* *** 192 - 255 *** */\n0x0900,0x0b00,0x0d00,0x0f00,0x1900,0x1b00,0x1d00,0x1f00,\n0x0940,0x0b40,0x0d40,0x0f40,0x1940,0x1b40,0x1d40,0x1f40,\n0x0920,0x0b20,0x0d20,0x0f20,0x1920,0x1b20,0x1d20,0x1f20,\n0x0960,0x0b60,0x0d60,0x0f60,0x1960,0x1b60,0x1d60,0x1f60,\n0x0908,0x0b08,0x0d08,0x0f08,0x1908,0x1b08,0x1d08,0x1f08,\n0x0948,0x0b48,0x0d48,0x0f48,0x1948,0x1b48,0x1d48,0x1f48,\n0x0928,0x0b28,0x0d28,0x0f28,0x1928,0x1b28,0x1d28,0x1f28,\n0x0968,0x0b68,0x0d68,0x0f68,0x1968,0x1b68,0x1d68,0x1f68,0x0};\n"
  },
  {
    "path": "src/geo/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanlocationlistener.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemangeo_global.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanabstractlocationlistenercore.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanqtlocationlistenercore.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanlocationlistener.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanabstractlocationlistenercore.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanqtlocationlistenercore.cpp\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemancoreresource_lib.qrc\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/geo/asemangeo_global.h",
    "content": "#ifndef ASEMAN_GEO_GLOBAL_H\n#define ASEMAN_GEO_GLOBAL_H\n\n#include <QtCore/qglobal.h>\n\n#if !defined(QT_STATIC) && !defined(QASEMAN_STATIC)\n#if defined(LIBQTASEMAN_GEO_LIBRARY)\n#  define LIBQTASEMAN_GEO_EXPORT Q_DECL_EXPORT\n#else\n#  define LIBQTASEMAN_GEO_EXPORT Q_DECL_IMPORT\n#endif\n#else\n#define LIBQTASEMAN_GEO_EXPORT\n#endif\n\n#endif // ASEMAN_GEO_GLOBAL_H\n"
  },
  {
    "path": "src/geo/asemanlocationlistener.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanlocationlistener.h\"\n\n#ifdef Q_OS_ANDROID\n#include \"private/asemanandroidlocationlistenercore.h\"\ntypedef AsemanAndroidLocationListenerCore LocationListenerCore;\n#else\n#include \"private/asemanqtlocationlistenercore.h\"\ntypedef AsemanQtLocationListenerCore LocationListenerCore;\n#endif\n\nclass AsemanLocationListenerPrivate\n{\npublic:\n    AsemanAbstractLocationListenerCore *core;\n};\n\nAsemanLocationListener::AsemanLocationListener(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanLocationListenerPrivate;\n    p->core = new LocationListenerCore(this);\n\n    connect(p->core, &AsemanAbstractLocationListenerCore::positionUpdated,\n            this, &AsemanLocationListener::positionUpdated, Qt::QueuedConnection);\n}\n\nvoid AsemanLocationListener::requestLocationUpdates(int interval)\n{\n    p->core->requestLocationUpdates(interval);\n}\n\nvoid AsemanLocationListener::getLastKnownLocation()\n{\n    p->core->getLastKnownLocation();\n}\n\nAsemanLocationListener::~AsemanLocationListener()\n{\n    p->core->stop();\n    delete p;\n}\n"
  },
  {
    "path": "src/geo/asemanlocationlistener.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANLOCATIONLISTENER_H\n#define ASEMANLOCATIONLISTENER_H\n\n#include <QObject>\n#include <QGeoPositionInfo>\n\n#include \"asemangeo_global.h\"\n\nclass AsemanLocationListenerPrivate;\nclass LIBQTASEMAN_GEO_EXPORT AsemanLocationListener : public QObject\n{\n    Q_OBJECT\npublic:\n    AsemanLocationListener(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanLocationListener();\n\n    void requestLocationUpdates(int interval);\n    void getLastKnownLocation();\n\nQ_SIGNALS:\n    void positionUpdated(const QGeoPositionInfo & update);\n\nprivate:\n    AsemanLocationListenerPrivate *p;\n};\n\n#endif // ASEMANLOCATIONLISTENER_H\n"
  },
  {
    "path": "src/geo/geo.pri",
    "content": "INCLUDEPATH += $$PWD\nDEPENDPATH += $$PWD\n\nQT += core positioning\n\nHEADERS += \\\n    $$PWD/asemanlocationlistener.h \\\n    $$PWD/asemangeo_global.h \\\n    $$PWD/private/asemanabstractlocationlistenercore.h \\\n    $$PWD/private/asemanqtlocationlistenercore.h\n\nSOURCES += \\\n    $$PWD/asemanlocationlistener.cpp \\\n    $$PWD/private/asemanabstractlocationlistenercore.cpp \\\n    $$PWD/private/asemanqtlocationlistenercore.cpp\n\nandroid: {\n    lessThan(QT_MAJOR_VERSION, 6) QT += androidextras\n    HEADERS += \\\n        $$PWD/private/asemanandroidlocationlistenercore.h\n    SOURCES += \\\n        $$PWD/private/asemanandroidlocationlistenercore.cpp\n}\n\n"
  },
  {
    "path": "src/geo/geo.pro",
    "content": "load(qt_build_config)\n\nTARGET = QAsemanGeo\nQT = asemancore\n\nMODULE = asemangeo\n\nload(qt_module)\n\nDEFINES += LIBQTASEMAN_GEO_LIBRARY\n\ninclude(geo.pri)\n"
  },
  {
    "path": "src/geo/private/asemanabstractlocationlistenercore.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanabstractlocationlistenercore.h\"\n\nAsemanAbstractLocationListenerCore::AsemanAbstractLocationListenerCore(QObject *parent) :\n    QObject(parent)\n{\n    connect(this, &AsemanAbstractLocationListenerCore::positionUpdated, this, &AsemanAbstractLocationListenerCore::updated);\n}\n\nvoid AsemanAbstractLocationListenerCore::getLastKnownLocation()\n{\n    Q_EMIT positionUpdated(_lastLocation);\n}\n\nvoid AsemanAbstractLocationListenerCore::stop()\n{\n    requestLocationUpdates(-1);\n}\n\nvoid AsemanAbstractLocationListenerCore::updated(const QGeoPositionInfo &update)\n{\n    if(!update.isValid())\n        return;\n\n    _lastLocation = update;\n}\n\nAsemanAbstractLocationListenerCore::~AsemanAbstractLocationListenerCore()\n{\n\n}\n"
  },
  {
    "path": "src/geo/private/asemanabstractlocationlistenercore.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANABSTRACTLOCATIONLISTENERCORE_H\n#define ASEMANABSTRACTLOCATIONLISTENERCORE_H\n\n#include <QObject>\n#include <QGeoPositionInfo>\n\n#include \"asemangeo_global.h\"\n\nclass LIBQTASEMAN_GEO_EXPORT AsemanAbstractLocationListenerCore : public QObject\n{\n    Q_OBJECT\npublic:\n    AsemanAbstractLocationListenerCore(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanAbstractLocationListenerCore();\n\n    virtual void requestLocationUpdates(int interval) = 0;\n    virtual void getLastKnownLocation();\n    virtual void stop();\n\nQ_SIGNALS:\n    void positionUpdated(const QGeoPositionInfo & update);\n\nprivate Q_SLOTS:\n    void updated(const QGeoPositionInfo & update);\n\nprivate:\n    QGeoPositionInfo _lastLocation;\n};\n\n#endif // ASEMANABSTRACTLOCATIONLISTENERCORE_H\n"
  },
  {
    "path": "src/geo/private/asemanandroidlocationlistenercore.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanandroidlocationlistenercore.h\"\n\n#include <QDebug>\n#include <QPointer>\n#include <QString>\n#include <QThread>\n#include <QCoreApplication>\n\n#include <jni.h>\n\n#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))\n#include <QJniEnvironment>\n#include <QJniObject>\ntypedef QJniEnvironment QAndroidJniEnvironment;\ntypedef QJniObject QAndroidJniObject;\n#else\n#include <QAndroidJniEnvironment>\n#include <QAndroidJniObject>\n#endif\n\nQHash<jobject, AsemanAndroidLocationListenerCore*> android_location_listener_objects;\n\nAsemanAndroidLocationListenerCore *getLocationListenerObject(jobject obj)\n{\n    QHashIterator<jobject, AsemanAndroidLocationListenerCore*> i(android_location_listener_objects);\n    while(i.hasNext())\n    {\n        i.next();\n        if(QAndroidJniObject(i.key()) == QAndroidJniObject(obj))\n            return i.value();\n    }\n\n    return 0;\n}\n\nclass AsemanAndroidLocationListenerPrivate\n{\npublic:\n    QAndroidJniObject object;\n    QAndroidJniEnvironment env;\n};\n\nAsemanAndroidLocationListenerCore::AsemanAndroidLocationListenerCore(QObject *parent) :\n    AsemanAbstractLocationListenerCore(parent)\n{\n    p = new AsemanAndroidLocationListenerPrivate;\n    qRegisterMetaType<QGeoPositionInfo>(\"QGeoPositionInfo\");\n\n    p->object = QAndroidJniObject(\"io/aseman/android/extra/AsemanLocationListener\");\n    android_location_listener_objects.insert(p->object.object<jobject>(), this);\n}\n\nAsemanAndroidLocationListenerCore::~AsemanAndroidLocationListenerCore()\n{\n    android_location_listener_objects.remove(p->object.object<jobject>());\n    delete p;\n}\n\nvoid AsemanAndroidLocationListenerCore::requestLocationUpdates(int interval)\n{\n    p->object.callMethod<void>(__FUNCTION__, \"(I)V\", interval);\n}\n\nvoid AsemanAndroidLocationListenerCore::getLastKnownLocation()\n{\n    p->object.callMethod<void>(__FUNCTION__, \"()V\");\n}\n\nstatic void locationListened( JNIEnv *env, jobject obj ,jdouble longitude, jdouble latitude, jdouble altitude, jstring city )\n{\n    Q_UNUSED(env)\n    Q_UNUSED(city)\n    AsemanAndroidLocationListenerCore *all = getLocationListenerObject(obj);\n    if(!all)\n        return;\n\n    QGeoCoordinate coo(latitude, longitude, altitude);\n    QGeoPositionInfo info(coo, QDateTime::currentDateTime());\n    QMetaObject::invokeMethod(all, \"positionUpdated\", Q_ARG(QGeoPositionInfo, info));\n}\n\nbool aseman_android_loclis_registerNativeMethods() {\n    JNINativeMethod methods[] {{\"_locationListened\", \"(DDDLjava/lang/String;)V\", reinterpret_cast<void *>(locationListened)}};\n\n    QAndroidJniObject javaClass(\"io/aseman/android/extra/AsemanLocationListener\");\n    QAndroidJniEnvironment env;\n    jclass objectClass = env->GetObjectClass(javaClass.object<jobject>());\n\n    env->RegisterNatives(objectClass, methods, sizeof(methods) / sizeof(methods[0]));\n\n    env->DeleteLocalRef(objectClass);\n    return true;\n}\n\nconst bool aseman_android_loclis_native_methods_registered = aseman_android_loclis_registerNativeMethods();\n"
  },
  {
    "path": "src/geo/private/asemanandroidlocationlistenercore.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANANDROIDLOCATIONLISTENERCORE_H\n#define ASEMANANDROIDLOCATIONLISTENERCORE_H\n\n#include \"asemanabstractlocationlistenercore.h\"\n#include <QGeoPositionInfo>\n\n#include \"asemangeo_global.h\"\n\nclass AsemanAndroidLocationListenerPrivate;\nclass LIBQTASEMAN_GEO_EXPORT AsemanAndroidLocationListenerCore : public AsemanAbstractLocationListenerCore\n{\n    Q_OBJECT\npublic:\n    AsemanAndroidLocationListenerCore(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanAndroidLocationListenerCore();\n\n    void requestLocationUpdates(int interval);\n    void getLastKnownLocation();\n\nprivate:\n    AsemanAndroidLocationListenerPrivate *p;\n};\n\n//Q_DECLARE_METATYPE(QGeoPositionInfo)\n\n#endif // ASEMANANDROIDLOCATIONLISTENERCORE_H\n"
  },
  {
    "path": "src/geo/private/asemanqtlocationlistenercore.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanqtlocationlistenercore.h\"\n\n#include <QGeoPositionInfoSource>\n\nclass AsemanQtLocationListenerCorePrivate\n{\npublic:\n    QGeoPositionInfoSource *source;\n};\n\nAsemanQtLocationListenerCore::AsemanQtLocationListenerCore(QObject *parent) :\n    AsemanAbstractLocationListenerCore(parent)\n{\n    p = new AsemanQtLocationListenerCorePrivate;\n    p->source = QGeoPositionInfoSource::createDefaultSource(this);\n    connect(p->source, &QGeoPositionInfoSource::positionUpdated, this, &AsemanQtLocationListenerCore::positionUpdated);\n}\n\nvoid AsemanQtLocationListenerCore::requestLocationUpdates(int interval)\n{\n    p->source->requestUpdate(interval);\n}\n\nvoid AsemanQtLocationListenerCore::stop()\n{\n    p->source->stopUpdates();\n}\n\nAsemanQtLocationListenerCore::~AsemanQtLocationListenerCore()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/geo/private/asemanqtlocationlistenercore.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQTLOCATIONLISTENERCORE_H\n#define ASEMANQTLOCATIONLISTENERCORE_H\n\n#include \"asemanabstractlocationlistenercore.h\"\n\nclass AsemanQtLocationListenerCorePrivate;\nclass AsemanQtLocationListenerCore: public AsemanAbstractLocationListenerCore\n{\npublic:\n    AsemanQtLocationListenerCore(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanQtLocationListenerCore();\n\n    void requestLocationUpdates(int interval);\n    void stop();\n\nprivate:\n    AsemanQtLocationListenerCorePrivate *p;\n};\n\n#endif // ASEMANQTLOCATIONLISTENERCORE_H\n"
  },
  {
    "path": "src/gui/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanapplication.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandevices.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanimagecoloranalizor.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmimeapps.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmimedata.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemantexttools.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemantitlebarcolorgrabber.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemantools.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemantranslationmanager.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanwindowdetails.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemangui_global.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemankeyhandler.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanglobaltranslations.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanapplication.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandevices.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanimagecoloranalizor.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmimeapps.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmimedata.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemantexttools.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemantitlebarcolorgrabber.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemantools.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemantranslationmanager.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanwindowdetails.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemankeyhandler.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanglobaltranslations.cpp\n    PARENT_SCOPE)\n\nif (ANDROID)\n    set(SOURCE\n        ${SOURCE}\n        $$PWD/asemanjavalayer.cpp\n        $$PWD/asemanjavalayer.h\n        PARENT_SCOPE)\nendif ()\n\nif (IOS)\n    set(SOURCE\n        ${SOURCE}\n        $$PWD/asemanobjectiveclayer.mm\n        $$PWD/asemanobjectiveclayer.h\n        PARENT_SCOPE)\n    add_compile_definitions(DISABLE_IOS_CONTACTS_SUPPORT)\nendif ()\n\nif (MACOS)\n    set(SOURCE\n        ${SOURCE}\n        $$PWD/asemanmacmanager.nn\n        $$PWD/asemanmacmanager.h\n        PARENT_SCOPE)\nendif ()\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/gui/asemanapplication.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanapplication.h\"\n#include \"asemandevices.h\"\n#include \"asemantools.h\"\n#ifdef Q_OS_ANDROID\n#include \"asemanjavalayer.h\"\n#endif\n\n#include <QDir>\n#include <QFont>\n#include <QPalette>\n#include <QSettings>\n#include <QThread>\n#include <QCoreApplication>\n#include <QDebug>\n#include <QTimer>\n#include <QStandardPaths>\n#include <QPointer>\n\n#ifdef QT_GUI_LIB\n#define READ_DEFINITION(FUNCTION, DEFAULT_VALUE) \\\n    switch(aseman_app_singleton->p->appType) { \\\n    case GuiApplication: \\\n        return static_cast<QGuiApplication*>(QCoreApplication::instance())->FUNCTION(); \\\n        break; \\\n    default: \\\n        return DEFAULT_VALUE; \\\n        break; \\\n    }\n#else\n#define READ_DEFINITION(FUNCTION, DEFAULT_VALUE) \\\n    return DEFAULT_VALUE;\n#endif\n\n#ifdef QT_GUI_LIB\n#define SET_DIFINITION(FUNCTION, VALUE) \\\n    switch(aseman_app_singleton->p->appType) { \\\n    case GuiApplication: \\\n        static_cast<QGuiApplication*>(QCoreApplication::instance())->FUNCTION(VALUE); \\\n        break; \\\n    }\n#else\n#define SET_DIFINITION(FUNCTION, VALUE)\n    Q_UNUSED(VALUE)\n#endif\n\n#if defined(Q_OS_ANDROID) && (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n#include <QtAndroid>\n#endif\n\n#ifdef QT_GUI_LIB\n#include <QGuiApplication>\n#endif\n#ifdef QT_CORE_LIB\n#include <QCoreApplication>\n#endif\n\nstatic QSettings *app_global_settings = 0;\nstatic AsemanApplication *aseman_app_singleton = 0;\nstatic QSet<AsemanApplication*> aseman_app_objects;\nstatic QString *aseman_app_home_path = 0;\nstatic QString *aseman_app_log_path = 0;\nstatic QString *aseman_app_tmp_path = 0;\n\n#if defined(Q_OS_MAC) && defined(Q_PROCESSOR_X86_32)\n#include <objc/objc.h>\n#include <objc/message.h>\n\nbool dockClickHandler(id self,SEL _cmd,...)\n{\n    Q_UNUSED(self)\n    Q_UNUSED(_cmd)\n    if(aseman_app_singleton) aseman_app_singleton->clickedOnDock();\n    return true;\n}\n#endif\n\nclass AsemanApplicationPrivate\n{\npublic:\n    QUrl windowIcon;\n    QTimer *clickOnDock_timer;\n    QFont globalFont;\n    int appType;\n    QCoreApplication *app;\n    bool app_owner;\n    QString appAbout;\n};\n\nAsemanApplication::AsemanApplication() :\n    QObject()\n{\n    p = new AsemanApplicationPrivate;\n    p->app = QCoreApplication::instance();\n    p->appType = NoneApplication;\n    p->app_owner = false;\n\n#ifdef QT_GUI_LIB\n    if( qobject_cast<QGuiApplication*>(p->app) )\n    {\n        p->appType = GuiApplication;\n    }\n    else\n#endif\n#ifdef QT_CORE_LIB\n    if( qobject_cast<QCoreApplication*>(p->app) )\n        p->appType = CoreApplication;\n#endif\n\n    aseman_app_objects.insert(this);\n    if(!aseman_app_singleton)\n        aseman_app_singleton = this;\n\n    p->app->installEventFilter(this);\n    init();\n}\n\nAsemanApplication::AsemanApplication(int &argc, char **argv, ApplicationType appType) :\n    QObject()\n{\n    if(!aseman_app_singleton)\n        aseman_app_singleton = this;\n\n    p = new AsemanApplicationPrivate;\n    p->appType = appType;\n    p->app_owner = true;\n\n    switch(p->appType)\n    {\n#ifdef QT_CORE_LIB\n    case CoreApplication:\n        p->app = new QCoreApplication(argc, argv);\n        break;\n#endif\n#ifdef QT_GUI_LIB\n    case GuiApplication:\n        p->app = new QGuiApplication(argc, argv);\n        break;\n#endif\n    default:\n        p->app = 0;\n        break;\n    }\n\n    aseman_app_objects.insert(this);\n    if(p->app)\n        p->app->installEventFilter(this);\n\n    init();\n}\n\nvoid AsemanApplication::init()\n{\n#ifndef FORCE_ASEMAN_DENSITY\n    if(!qgetenv(\"ASEMAN_SCALE_FACTOR\").isNull())\n        AsemanDevices::setFlag(AsemanDevices::AsemanScaleFactorEnable);\n    else\n    if(!qgetenv(\"QT_SCALE_FACTOR\").isNull())\n        AsemanDevices::setFlag(AsemanDevices::DisableDensities);\n#endif\n#ifdef Q_OS_WIN\n    else\n    if(QGuiApplication::testAttribute(Qt::AA_EnableHighDpiScaling))\n        AsemanDevices::setFlag(AsemanDevices::DisableDensities);\n#endif\n\n    switch(p->appType)\n    {\n#ifdef QT_GUI_LIB\n    case GuiApplication:\n        connect(static_cast<QGuiApplication*>(p->app), &QGuiApplication::lastWindowClosed, this, &AsemanApplication::lastWindowClosed);\n        connect(static_cast<QGuiApplication*>(p->app), &QGuiApplication::applicationStateChanged, this, &AsemanApplication::applicationStateChanged);\n        p->globalFont = static_cast<QGuiApplication*>(p->app)->font();\n#endif\n#ifdef QT_CORE_LIB\n    case CoreApplication:\n        connect(p->app, &QCoreApplication::organizationNameChanged, this, &AsemanApplication::organizationNameChanged);\n        connect(p->app, &QCoreApplication::organizationDomainChanged, this, &AsemanApplication::organizationDomainChanged);\n        connect(p->app, &QCoreApplication::applicationNameChanged, this, &AsemanApplication::applicationNameChanged);\n        connect(p->app, &QCoreApplication::applicationVersionChanged, this, &AsemanApplication::applicationVersionChanged);\n        break;\n#endif\n\n    default:\n        p->app = 0;\n        break;\n    }\n\n    p->clickOnDock_timer = new QTimer(this);\n    p->clickOnDock_timer->setSingleShot(true);\n    p->clickOnDock_timer->setInterval(500);\n\n#if defined(Q_OS_MAC) && defined(Q_PROCESSOR_X86_32)\n#ifndef Q_OS_IOS\n    objc_object* cls = objc_getClass(\"NSApplication\");\n    SEL sharedApplication = sel_registerName(\"sharedApplication\");\n    objc_object* appInst = objc_msgSend(cls,sharedApplication);\n\n    if(appInst != NULL)\n    {\n        objc_object* delegate = objc_msgSend(appInst, sel_registerName(\"delegate\"));\n        objc_object* delClass = objc_msgSend(delegate,  sel_registerName(\"class\"));\n        const char* tst = class_getName(delClass->isa);\n        bool test = class_addMethod((objc_class*)delClass, sel_registerName(\"applicationShouldHandleReopen:hasVisibleWindows:\"), (IMP)dockClickHandler,\"B@:\");\n\n        Q_UNUSED(tst)\n        if (!test)\n        {\n            // failed to register handler...\n        }\n    }\n#endif\n#endif\n}\n\nQString AsemanApplication::homePath()\n{\n    if(aseman_app_home_path)\n        return *aseman_app_home_path;\n\n    aseman_app_home_path = new QString();\n\n    QString oldPath;\n#ifdef Q_OS_WIN\n    oldPath = QDir::homePath() + \"/AppData/Local/\" + QCoreApplication::applicationName();\n#else\n    oldPath = QDir::homePath() + \"/.config/\" + QCoreApplication::applicationName();\n#endif\n\n    QStringList paths = QStandardPaths::standardLocations(QStandardPaths::QStandardPaths::AppDataLocation);\n    if(paths.isEmpty())\n        paths << oldPath;\n\n    if( oldPath.count() && QFileInfo::exists(oldPath) )\n        *aseman_app_home_path = oldPath;\n    else\n        *aseman_app_home_path = paths.first();\n\n    QDir().mkpath(*aseman_app_home_path);\n    return *aseman_app_home_path;\n}\n\nvoid AsemanApplication::setHomePath(const QString &path)\n{\n    homePath();\n    *aseman_app_home_path = path;\n\n    if(aseman_app_singleton)\n    {\n        Q_EMIT aseman_app_singleton->homePathChanged();\n        Q_EMIT aseman_app_singleton->logPathChanged();\n        Q_EMIT aseman_app_singleton->confsPathChanged();\n        Q_EMIT aseman_app_singleton->backupsPathChanged();\n    }\n}\n\nQString AsemanApplication::startPath()\n{\n#ifdef Q_OS_ANDROID\n    return QStringLiteral(\"/sdcard/\");\n#else\n#ifdef Q_OS_IOS\n    return homePath();\n#else\n    return QDir::homePath();\n#endif\n#endif\n}\n\nQString AsemanApplication::appPath()\n{\n    return QCoreApplication::applicationDirPath();\n}\n\nQString AsemanApplication::appFilePath()\n{\n    return QCoreApplication::applicationFilePath();\n}\n\nQString AsemanApplication::logPath()\n{\n    if(!aseman_app_log_path)\n    {\n        aseman_app_log_path = new QString();\n        *aseman_app_log_path = homePath() + \"/log\";\n        QDir().mkpath(*aseman_app_log_path);\n    }\n\n    return *aseman_app_log_path;\n}\n\nvoid AsemanApplication::setLogPath(const QString &path)\n{\n    if( logPath() == path )\n        return;\n\n    *aseman_app_log_path = path;\n    if(aseman_app_singleton)\n        Q_EMIT aseman_app_singleton->logPathChanged();\n}\n\nQString AsemanApplication::confsPath()\n{\n    return homePath() + \"/config.ini\";\n}\n\nQString AsemanApplication::tempPath()\n{\n    if(!aseman_app_tmp_path)\n    {\n        aseman_app_tmp_path = new QString();\n#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)\n        *aseman_app_tmp_path = homePath() + \"/tmp/\";\n#else\n        *aseman_app_tmp_path = QDir::tempPath();\n#endif\n        QDir().mkpath(*aseman_app_tmp_path);\n    }\n\n    return *aseman_app_tmp_path;\n}\n\nQString AsemanApplication::backupsPath()\n{\n#ifdef Q_OS_ANDROID\n    return \"/sdcard/\" + QCoreApplication::organizationDomain() + \"/\" + QCoreApplication::applicationName() + \"/backups\";\n#else\n#ifdef Q_OS_IOS\n    return homePath() + \"/backups/\";\n#else\n    return homePath() + \"/backups\";\n#endif\n#endif\n}\n\nQString AsemanApplication::cameraPath()\n{\n#ifdef Q_OS_ANDROID\n    return \"/sdcard/DCIM\";\n#else\n#ifdef Q_OS_IOS\n    return QStandardPaths::standardLocations(QStandardPaths::QStandardPaths::AppDataLocation).first() + \"/camera/\";\n#else\n    return QDir::homePath() + \"/Pictures/Camera\";\n#endif\n#endif\n}\n\nQString AsemanApplication::applicationDirPath()\n{\n    return QCoreApplication::applicationDirPath();\n}\n\nQString AsemanApplication::applicationFilePath()\n{\n    return QCoreApplication::applicationFilePath();\n}\n\nqint64 AsemanApplication::applicationPid()\n{\n    return QCoreApplication::applicationPid();\n}\n\nvoid AsemanApplication::setOrganizationDomain(const QString &orgDomain)\n{\n    QCoreApplication::setOrganizationDomain(orgDomain);\n}\n\nQString AsemanApplication::organizationDomain()\n{\n    return QCoreApplication::organizationDomain();\n}\n\nvoid AsemanApplication::setOrganizationName(const QString &orgName)\n{\n    QCoreApplication::setOrganizationName(orgName);\n}\n\nQString AsemanApplication::organizationName()\n{\n    return QCoreApplication::organizationName();\n}\n\nvoid AsemanApplication::setApplicationName(const QString &application)\n{\n    QCoreApplication::setApplicationName(application);\n}\n\nQString AsemanApplication::applicationName()\n{\n    return QCoreApplication::applicationName();\n}\n\nvoid AsemanApplication::setApplicationVersion(const QString &version)\n{\n    QCoreApplication::setApplicationVersion(version);\n}\n\nQString AsemanApplication::applicationVersion()\n{\n    return QCoreApplication::applicationVersion();\n}\n\nvoid AsemanApplication::setApplicationDisplayName(const QString &name)\n{\n    SET_DIFINITION(setApplicationDisplayName, name)\n}\n\nQString AsemanApplication::applicationDisplayName()\n{\n    READ_DEFINITION(applicationDisplayName, QString())\n}\n\nvoid AsemanApplication::setApplicationAbout(const QString &desc)\n{\n    if(!aseman_app_singleton)\n        return;\n    if( aseman_app_singleton->p->appAbout == desc )\n        return;\n\n    aseman_app_singleton->p->appAbout = desc;\n    Q_EMIT aseman_app_singleton->applicationAboutChanged();\n}\n\nQString AsemanApplication::applicationAbout()\n{\n    if(aseman_app_singleton)\n        return tr(aseman_app_singleton->p->appAbout.toUtf8());\n    else\n        return QString();\n}\n\nvoid AsemanApplication::setQpaNoTextHandles(bool stt)\n{\n    bool currentResult = qpaNoTextHandles();\n    if(currentResult == stt)\n        return;\n\n    if(stt)\n    {\n        qputenv(\"QT_ANDROID_ENABLE_WORKAROUND_TO_DISABLE_PREDICTIVE_TEXT\", \"1\");\n        qputenv(\"QT_QPA_NO_TEXT_HANDLES\", \"1\");\n    }\n    else\n    {\n        qunsetenv(\"QT_QPA_NO_TEXT_HANDLES\");\n        qunsetenv(\"QT_ANDROID_ENABLE_WORKAROUND_TO_DISABLE_PREDICTIVE_TEXT\");\n    }\n\n    Q_EMIT aseman_app_singleton->qpaNoTextHandlesChanged();\n}\n\nbool AsemanApplication::qpaNoTextHandles()\n{\n    return qgetenv(\"QT_QPA_NO_TEXT_HANDLES\") == \"1\";\n}\n\nQString AsemanApplication::platformName()\n{\n    READ_DEFINITION(platformName, QString())\n}\n\nQStringList AsemanApplication::arguments()\n{\n    return QCoreApplication::arguments();\n}\n\nvoid AsemanApplication::setQuitOnLastWindowClosed(bool quit)\n{\n    SET_DIFINITION(setQuitOnLastWindowClosed, quit)\n}\n\nbool AsemanApplication::quitOnLastWindowClosed()\n{\n    READ_DEFINITION(quitOnLastWindowClosed, false)\n}\n\nQClipboard *AsemanApplication::clipboard()\n{\n    READ_DEFINITION(clipboard, 0)\n}\n\nvoid AsemanApplication::setWindowIcon(const QUrl &icon)\n{\n    if(p->windowIcon == icon)\n        return;\n\n    p->windowIcon = icon;\n    QString file = icon.toString();\n    if(file.left(6) == QStringLiteral(\"qrc://\"))\n        file = file.replace(0, 6, QStringLiteral(\":/\"));\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0))\n    SET_DIFINITION(setWindowIcon, QIcon(file))\n#else\n    Q_UNUSED(icon)\n#endif\n    Q_EMIT windowIconChanged();\n}\n\nQUrl AsemanApplication::windowIcon() const\n{\n    return p->windowIcon;\n}\n\nint AsemanApplication::appType()\n{\n    return aseman_app_singleton->p->appType;\n}\n\nbool AsemanApplication::isDebug()\n{\n#ifdef QT_DEBUG\n    return true;\n#else\n    return false;\n#endif\n}\n\nAsemanApplication *AsemanApplication::instance()\n{\n    return aseman_app_singleton;\n}\n\nQCoreApplication *AsemanApplication::qapp()\n{\n    return QCoreApplication::instance();\n}\n\nvoid AsemanApplication::setGlobalFont(const QFont &font)\n{\n    if(p->globalFont == font)\n        return;\n\n    p->globalFont = font;\n    Q_EMIT globalFontChanged();\n}\n\nQFont AsemanApplication::globalFont() const\n{\n    return p->globalFont;\n}\n\nQFont AsemanApplication::font()\n{\n    READ_DEFINITION(font, QFont())\n}\n\nvoid AsemanApplication::setFont(const QFont &f)\n{\n    SET_DIFINITION(setFont, f);\n}\n\n#ifdef QT_GUI_LIB\nQPalette AsemanApplication::palette()\n{\n    READ_DEFINITION(palette, QPalette())\n}\n\nvoid AsemanApplication::setPalette(const QPalette &pal)\n{\n    SET_DIFINITION(setPalette, pal);\n}\n\nint AsemanApplication::applicationState()\n{\n    READ_DEFINITION(applicationState, Qt::ApplicationActive)\n}\n#endif\n\nQSettings *AsemanApplication::settings()\n{\n    if( !app_global_settings )\n    {\n        QDir().mkpath(AsemanApplication::homePath());\n        app_global_settings = new QSettings( AsemanApplication::homePath() + \"/config.ini\", QSettings::IniFormat );\n    }\n\n    return app_global_settings;\n}\n\nvoid AsemanApplication::refreshTranslations()\n{\n    Q_EMIT languageUpdated();\n}\n\nvoid AsemanApplication::back()\n{\n    Q_EMIT backRequest();\n}\n\nint AsemanApplication::exec()\n{\n    p->clickOnDock_timer->stop();\n    p->clickOnDock_timer->start();\n\n    return p->app->exec();\n}\n\nvoid AsemanApplication::exit(int retcode)\n{\n    aseman_app_singleton->p->app->exit(retcode);\n}\n\nvoid AsemanApplication::sleep(quint64 ms)\n{\n    QThread::msleep(ms);\n}\n\nvoid AsemanApplication::setSetting(const QString &key, const QVariant &value)\n{\n    settings()->setValue(key, value);\n}\n\nQVariant AsemanApplication::readSetting(const QString &key, const QVariant &defaultValue)\n{\n    return settings()->value(key, defaultValue);\n}\n\nbool AsemanApplication::eventFilter(QObject *o, QEvent *e)\n{\n    if(o == p->app)\n    {\n#ifdef Q_OS_MAC\n        switch(e->type()) {\n        case QEvent::ApplicationActivate:\n            if(p->clickOnDock_timer->isActive())\n            {\n                p->clickOnDock_timer->stop();\n                p->clickOnDock_timer->start();\n            }\n            else\n                Q_EMIT clickedOnDock();\n            break;\n\n        default:\n            break;\n        }\n#endif\n    }\n\n    return QObject::eventFilter(o,e);\n}\n\nAsemanApplication::~AsemanApplication()\n{\n    aseman_app_objects.remove(this);\n    if(aseman_app_singleton == this)\n        aseman_app_singleton = 0;\n\n    if(p->app && p->app_owner)\n        delete p->app;\n\n    delete p;\n}\n"
  },
  {
    "path": "src/gui/asemanapplication.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANAPPLICATION_H\n#define ASEMANAPPLICATION_H\n\n#include \"aseman_macros.h\"\n\n#include <QFont>\n#include <QVariant>\n#include <QCoreApplication>\n#include <QClipboard>\n#include <QUrl>\n\n#ifdef QT_GUI_LIB\n#include <QIcon>\n#endif\n\n#include \"asemangui_global.h\"\n\n#if defined(QT_GUI_LIB)\n#define DEFAULT_AAPP_TYPE AsemanApplication::GuiApplication\n#else\n#if defined(QT_CORE_LIB)\n#define DEFAULT_AAPP_TYPE AsemanApplication::CoreApplication\n#endif\n#endif\n\nclass AsemanNetworkProxy;\nclass QSettings;\nclass AsemanApplicationPrivate;\nclass LIBQTASEMAN_GUI_EXPORT AsemanApplication : public QObject\n{\n    Q_OBJECT\n    Q_ENUMS(ApplicationType)\n    Q_ENUMS(ApplicationState)\n\n    Q_PROPERTY(QString homePath     READ homePath     NOTIFY homePathChanged)\n    Q_PROPERTY(QString startPath    READ startPath    NOTIFY fakeSignal)\n    Q_PROPERTY(QString appPath      READ appPath      NOTIFY fakeSignal)\n    Q_PROPERTY(QString appFilePath  READ appFilePath  NOTIFY fakeSignal)\n    Q_PROPERTY(QString logPath      READ logPath      WRITE setLogPath NOTIFY logPathChanged)\n    Q_PROPERTY(QString confsPath    READ confsPath    NOTIFY confsPathChanged)\n    Q_PROPERTY(QString tempPath     READ tempPath     NOTIFY fakeSignal)\n    Q_PROPERTY(QString backupsPath  READ backupsPath  NOTIFY backupsPathChanged)\n    Q_PROPERTY(QString cameraPath   READ cameraPath   NOTIFY fakeSignal)\n\n    Q_PROPERTY(int appType READ appType NOTIFY fakeSignal)\n    Q_PROPERTY(bool isDebug READ isDebug NOTIFY fakeSignal)\n\n    Q_PROPERTY(QFont globalFont READ globalFont WRITE setGlobalFont NOTIFY globalFontChanged)\n\n    Q_PROPERTY(QString applicationName READ applicationName WRITE setApplicationName NOTIFY applicationNameChanged)\n    Q_PROPERTY(QString applicationVersion READ applicationVersion WRITE setApplicationVersion NOTIFY applicationVersionChanged)\n    Q_PROPERTY(QString organizationName READ organizationName WRITE setOrganizationName NOTIFY organizationNameChanged)\n    Q_PROPERTY(QString organizationDomain READ organizationDomain WRITE setOrganizationDomain NOTIFY organizationDomainChanged)\n    Q_PROPERTY(QString applicationAbout READ applicationAbout WRITE setApplicationAbout NOTIFY applicationAboutChanged)\n    Q_PROPERTY(bool qpaNoTextHandles READ qpaNoTextHandles WRITE setQpaNoTextHandles NOTIFY qpaNoTextHandlesChanged)\n    Q_PROPERTY(QUrl windowIcon READ windowIcon WRITE setWindowIcon NOTIFY windowIconChanged)\n\n    Q_PROPERTY(int applicationState READ applicationState NOTIFY applicationStateChanged)\n\n    Q_PROPERTY(QString applicationDisplayName READ applicationDisplayName WRITE setApplicationDisplayName NOTIFY fakeSignal)\n    Q_PROPERTY(QString platformName READ platformName STORED false)\n    Q_PROPERTY(bool quitOnLastWindowClosed  READ quitOnLastWindowClosed WRITE setQuitOnLastWindowClosed NOTIFY fakeSignal)\n\npublic:\n    enum ApplicationType {\n        NoneApplication,\n#ifdef QT_GUI_LIB\n        GuiApplication,\n#endif\n#ifdef QT_CORE_LIB\n        CoreApplication\n#endif\n    };\n\n    enum ApplicationState {\n        ApplicationSuspended    = Qt::ApplicationSuspended,\n        ApplicationHidden       = Qt::ApplicationHidden,\n        ApplicationInactive     = Qt::ApplicationInactive,\n        ApplicationActive       = Qt::ApplicationActive\n    };\n\n    AsemanApplication();\n    AsemanApplication(int &argc, char **argv, ApplicationType appType = DEFAULT_AAPP_TYPE);\n    virtual ~AsemanApplication();\n\n    static QString homePath();\n    static void setHomePath(const QString &path);\n\n    static QString startPath();\n    static QString appPath();\n    static QString appFilePath();\n    static QString confsPath();\n    static QString tempPath();\n    static QString backupsPath();\n    static QString cameraPath();\n\n    static QString applicationDirPath();\n    static QString applicationFilePath();\n    static qint64 applicationPid();\n\n    static QString logPath();\n    static void setLogPath(const QString &path);\n\n    static void setOrganizationDomain(const QString &orgDomain);\n    static QString organizationDomain();\n    static void setOrganizationName(const QString &orgName);\n    static QString organizationName();\n    static void setApplicationName(const QString &application);\n    static QString applicationName();\n    static void setApplicationVersion(const QString &version);\n    static QString applicationVersion();\n    static void setApplicationDisplayName(const QString &name);\n    static QString applicationDisplayName();\n    static void setApplicationAbout(const QString &desc);\n    static QString applicationAbout();\n\n    static void setQpaNoTextHandles(bool stt);\n    static bool qpaNoTextHandles();\n\n    static QString platformName();\n\n    static QStringList arguments();\n\n    static void setQuitOnLastWindowClosed(bool quit);\n    static bool quitOnLastWindowClosed();\n\n    static QClipboard *clipboard();\n\n    void setWindowIcon(const QUrl &icon);\n    QUrl windowIcon() const;\n\n    static int appType();\n    static bool isDebug();\n\n    static AsemanApplication *instance();\n    static QCoreApplication *qapp();\n\n    void setGlobalFont(const QFont &font);\n    QFont globalFont() const;\n\n    static QFont font();\n    static void setFont(const QFont &f);\n\n#ifdef QT_GUI_LIB\n    static QPalette palette();\n    static void setPalette(const QPalette &pal);\n\n    static int applicationState();\n#endif\n\n    static QSettings *settings();\n\n    inline operator QCoreApplication*() const { return qapp(); }\n\npublic Q_SLOTS:\n    void refreshTranslations();\n    void back();\n    int exec();\n    static void exit(int retcode = 0);\n\n    void sleep(quint64 ms);\n\n    void setSetting( const QString & key, const QVariant & value );\n    QVariant readSetting( const QString & key, const QVariant & defaultValue = QVariant() );\n\nQ_SIGNALS:\n    void fakeSignal();\n    void globalFontFamilyChanged();\n    void globalMonoFontFamilyChanged();\n    void globalFontChanged();\n    void languageUpdated();\n    void backRequest();\n    void clickedOnDock();\n\n    void homePathChanged();\n    void logPathChanged();\n    void confsPathChanged();\n    void backupsPathChanged();\n\n    void organizationNameChanged();\n    void organizationDomainChanged();\n    void applicationNameChanged();\n    void applicationVersionChanged();\n    void applicationStateChanged();\n    void applicationAboutChanged();\n    void windowIconChanged();\n    void qpaNoTextHandlesChanged();\n\n    void lastWindowClosed();\n\nprotected:\n    bool eventFilter(QObject *o, QEvent *e) Q_DECL_OVERRIDE;\n\nprivate:\n    void init();\n\nprivate:\n    AsemanApplicationPrivate *p;\n};\n\ntypedef AsemanApplication QAsemanApplication;\n\n#endif // ASEMANAPPLICATION_H\n"
  },
  {
    "path": "src/gui/asemandevices.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#define LINUX_DEFAULT_DPI 96\n#define WINDOWS_DEFAULT_DPI 96\n#define UTOUCH_DEFAULT_DPI 76\n\n#define TABLET_RATIO 1.28\n#define FONT_RATIO 1.28\n\n#include \"asemandevices.h\"\n#include \"asemanapplication.h\"\n#include \"asemanmimedata.h\"\n\n#ifdef Q_OS_ANDROID\n#include \"asemanjavalayer.h\"\n#endif\n#ifdef Q_OS_IOS\n#include \"asemanobjectiveclayer.h\"\n#endif\n\n#ifdef Q_OS_MACX\n#include <IOKit/IOKitLib.h>\n#include \"asemanmacmanager.h\"\n#endif\n\n#include <QTimerEvent>\n#include <QGuiApplication>\n#include <QMimeType>\n#include <QMimeDatabase>\n#include <QUrl>\n#include <QDesktopServices>\n#include <QDir>\n#include <QImageWriter>\n#include <QFileInfo>\n#include <QFile>\n#include <QClipboard>\n#include <QtCore/qmath.h>\n#include <QScreen>\n#include <QDateTime>\n#include <QDebug>\n#include <QMimeData>\n#include <QProcess>\n#include <QGuiApplication>\n#include <QCryptographicHash>\n#include <QTimer>\n#include <QVariantMap>\n#include <QSysInfo>\n#include <QJsonDocument>\n#include <QThread>\n#include <QStandardPaths>\n#include <QInputMethodQueryEvent>\n\n#ifdef ASEMAN_MULTIMEDIA\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0))\n#include <QBuffer>\n#include <QCameraInfo>\n#endif\n#endif\n\nclass AsemanDevicesPrivate\n{\npublic:\n    int hide_keyboard_timer;\n    bool keyboard_stt;\n\n    QMimeDatabase mime_db;\n\n#ifdef Q_OS_ANDROID\n    AsemanJavaLayer *java_layer;\n    qint32 androidKeyboardHeight;\n#endif\n#ifdef Q_OS_IOS\n    AsemanObjectiveCLayer *objc_layer;\n#endif\n#ifdef Q_OS_MACX\n    AsemanMacManager *mac_layer;\n#endif\n\n    bool transparentStatusBar;\n    bool transparentNavigationBar;\n\n    static QHash<int, bool> flags;\n    static qreal fontScale;\n    static QSet<AsemanDevices*> devicesObjs;\n};\n\nQHash<int, bool> AsemanDevicesPrivate::flags;\nqreal AsemanDevicesPrivate::fontScale = 1;\nQSet<AsemanDevices*> AsemanDevicesPrivate::devicesObjs;\n\nAsemanDevices::AsemanDevices(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanDevicesPrivate;\n    p->hide_keyboard_timer = 0;\n    p->keyboard_stt = false;\n    p->transparentStatusBar = false;\n    p->transparentNavigationBar = false;\n\n    refreshTransparentStatusBar();\n    refreshTransparentNavigationBar();\n\n#ifdef Q_OS_ANDROID\n    p->androidKeyboardHeight = 0;\n    p->java_layer = AsemanJavaLayer::instance();\n\n    connect( p->java_layer, &AsemanJavaLayer::incomingShare, this, &AsemanDevices::incoming_share, Qt::QueuedConnection );\n    connect( p->java_layer, &AsemanJavaLayer::incomingImage, this, &AsemanDevices::incomingImage, Qt::QueuedConnection );\n    connect( p->java_layer, &AsemanJavaLayer::deepLinkReceived, this, &AsemanDevices::deepLinkReceived, Qt::QueuedConnection);\n    connect( p->java_layer, &AsemanJavaLayer::selectImageResult, this, &AsemanDevices::selectImageResult, Qt::QueuedConnection );\n    connect( p->java_layer, &AsemanJavaLayer::activityPaused, this, &AsemanDevices::activity_paused, Qt::QueuedConnection );\n    connect( p->java_layer, &AsemanJavaLayer::activityResumed, this, &AsemanDevices::activity_resumed, Qt::QueuedConnection );\n    connect( p->java_layer, &AsemanJavaLayer::keyboardVisiblityChanged, this, [this](qint32 height){\n        height = height/deviceDensity();\n        if(p->androidKeyboardHeight == height)\n            return;\n\n        p->androidKeyboardHeight = height;\n        Q_EMIT geometryChanged();\n    });\n#endif\n#ifdef Q_OS_IOS\n   p->objc_layer = new AsemanObjectiveCLayer(this);\n   connect(p->objc_layer, &AsemanObjectiveCLayer::keyboardHeightChanged, this, &AsemanDevices::keyboard_changed);\n   connect(p->objc_layer, &AsemanObjectiveCLayer::deepLinkReceived, this, &AsemanDevices::deepLinkReceived);\n\n   QTimer *intervalChecks = new QTimer(this);\n   intervalChecks->setInterval(1000);\n   intervalChecks->setSingleShot(false);\n   intervalChecks->connect(intervalChecks, &QTimer::timeout, this, [this](){\n       static qreal lastStatusBarHeight = AsemanObjectiveCLayer::statusBarHeight();\n       qreal newStatusBarHeight = AsemanObjectiveCLayer::statusBarHeight();\n       if (lastStatusBarHeight == newStatusBarHeight)\n           return;\n\n       lastStatusBarHeight = newStatusBarHeight;\n       Q_EMIT statusBarHeightChanged();\n   });\n   intervalChecks->start();\n#endif\n#ifdef Q_OS_MACX\n   p->mac_layer = new AsemanMacManager(this);\n   connect(p->mac_layer, &AsemanMacManager::deepLinkReceived, this, &AsemanDevices::deepLinkReceived);\n#endif\n\n    connect( QGuiApplication::inputMethod(), &QInputMethod::visibleChanged, this, &AsemanDevices::keyboard_changed);\n    connect( static_cast<QGuiApplication*>(QCoreApplication::instance())->clipboard(), &QClipboard::dataChanged, this, &AsemanDevices::clipboardChanged);\n\n    QScreen *scr = screen();\n    if( scr )\n        connect( scr, &QScreen::geometryChanged, this, &AsemanDevices::geometryChanged);\n\n    AsemanDevicesPrivate::devicesObjs.insert(this);\n}\n\nbool AsemanDevices::isMobile()\n{\n    return isTouchDevice() && !isTablet();\n}\n\nbool AsemanDevices::isTablet()\n{\n#ifdef Q_OS_ANDROID\n    return isTouchDevice() && AsemanJavaLayer::instance()->isTablet();\n#else\n    return isTouchDevice() && lcdPhysicalSize() >= 6;\n#endif\n}\n\nbool AsemanDevices::isLargeTablet()\n{\n#ifdef Q_OS_ANDROID\n    return isTablet() && AsemanJavaLayer::instance()->getSizeName() == 3;\n#else\n    return isTouchDevice() && lcdPhysicalSize() >= 9;\n#endif\n}\n\nbool AsemanDevices::isTouchDevice()\n{\n    return isAndroid() || isIOS() || isWindowsPhone() || isUbuntuTouch();\n}\n\nbool AsemanDevices::isDesktop()\n{\n    return !isTouchDevice();\n}\n\nbool AsemanDevices::isMacX()\n{\n#ifdef Q_OS_MACX\n    return true;\n#else\n    return false;\n#endif\n}\n\nbool AsemanDevices::isWindows()\n{\n#ifdef Q_OS_WIN\n    return true;\n#else\n    return false;\n#endif\n}\n\nbool AsemanDevices::isLinux()\n{\n#if defined(Q_OS_LINUX) || defined(Q_OS_OPENBSD)\n    return true;\n#else\n    return false;\n#endif\n}\n\nbool AsemanDevices::isAndroid()\n{\n#ifdef Q_OS_ANDROID\n    return true;\n#else\n    return false;\n#endif\n}\n\nbool AsemanDevices::isIOS()\n{\n#ifdef Q_OS_IOS\n    return true;\n#else\n    return false;\n#endif\n}\n\nbool AsemanDevices::isUbuntuTouch()\n{\n#ifdef Q_OS_UBUNTUTOUCH\n    return true;\n#else\n    return false;\n#endif\n}\n\nbool AsemanDevices::isWindowsPhone()\n{\n#ifdef Q_OS_WINPHONE\n    return true;\n#else\n    return false;\n#endif\n}\n\nbool AsemanDevices::isWindows8()\n{\n#ifdef Q_OS_WIN\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n    return QSysInfo::windowsVersion() == QSysInfo::WV_WINDOWS8 ||\n           QSysInfo::windowsVersion() == QSysInfo::WV_WINDOWS8_1;\n#else\n    return false;\n#endif\n#else\n    return false;\n#endif\n}\n\nbool AsemanDevices::isWebAssembly()\n{\n#ifdef Q_OS_WASM\n    return true;\n#else\n    return false;\n#endif\n}\n\nbool AsemanDevices::isQt6()\n{\n#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))\n    return true;\n#else\n    return false;\n#endif\n}\n\nQScreen *AsemanDevices::screen()\n{\n    const QList<QScreen*> & screens = QGuiApplication::screens();\n    if( screens.isEmpty() )\n        return 0;\n\n    return screens.first();\n}\n\nQObject *AsemanDevices::screenObj() const\n{\n    return screen();\n}\n\nqreal AsemanDevices::lcdPhysicalSize()\n{\n    qreal w = lcdPhysicalWidth();\n    qreal h = lcdPhysicalHeight();\n\n    return qSqrt( h*h + w*w );\n}\n\nqreal AsemanDevices::lcdPhysicalWidth()\n{\n    if( QGuiApplication::screens().isEmpty() )\n        return 0;\n\n    return (qreal)screenSize().width()/lcdDpiX();\n}\n\nqreal AsemanDevices::lcdPhysicalHeight()\n{\n    if( QGuiApplication::screens().isEmpty() )\n        return 0;\n\n    return (qreal)screenSize().height()/lcdDpiY();\n}\n\nqreal AsemanDevices::lcdDpiX()\n{\n#ifdef Q_OS_ANDROID\n    return AsemanJavaLayer::instance()->densityDpi();\n#else\n    if( QGuiApplication::screens().isEmpty() )\n        return 0;\n\n    QScreen *scr = QGuiApplication::screens().first();\n    return scr->physicalDotsPerInchX();\n#endif\n}\n\nqreal AsemanDevices::lcdDpiY()\n{\n#ifdef Q_OS_ANDROID\n    return AsemanJavaLayer::instance()->densityDpi();\n#else\n    if( QGuiApplication::screens().isEmpty() )\n        return 0;\n\n    QScreen *scr = QGuiApplication::screens().first();\n    return scr->physicalDotsPerInchY();\n#endif\n}\n\nQSize AsemanDevices::screenSize()\n{\n#ifdef Q_OS_ANDROID\n    return QSize(AsemanJavaLayer::instance()->screenSizeWidth(),\n                 AsemanJavaLayer::instance()->screenSizeHeight());\n#else\n    if( QGuiApplication::screens().isEmpty() )\n        return QSize();\n\n    QScreen *scr = QGuiApplication::screens().first();\n    return scr->size();\n#endif\n}\n\nqreal AsemanDevices::keyboardHeight() const\n{\n#ifdef Q_OS_ANDROID\n    return p->androidKeyboardHeight*density();\n#else\n#ifdef Q_OS_UBUNTUTOUCH\n    return screenSize().height()*0.5;\n#else\n#ifdef DESKTOP_DEVICE\n    return 0;\n#else\n#ifdef Q_OS_IOS\n    return p->objc_layer->keyboardHeight();\n#else\n    const QSize & scr_size = screenSize();\n    bool portrait = scr_size.width()<scr_size.height();\n    if( portrait )\n    {\n        if( isMobile() )\n            return screenSize().height()*0.6;\n        else\n            return screenSize().height()*0.4;\n    }\n    else\n    {\n        if( isMobile() )\n            return screenSize().height()*0.7;\n        else\n            return screenSize().height()*0.5;\n    }\n#endif\n#endif\n#endif\n#endif\n}\n\nQString AsemanDevices::deviceName()\n{\n    if(isDesktop())\n        return QSysInfo::prettyProductName() + \" \" + QSysInfo::currentCpuArchitecture();\n#ifdef Q_OS_ANDROID\n    else\n        return AsemanJavaLayer::instance()->deviceName();\n#else\n    else\n        return QStringLiteral(\"mobile\");\n#endif\n}\n\nQString AsemanDevices::deviceId()\n{\n#if defined(Q_OS_ANDROID)\n    return AsemanJavaLayer::instance()->deviceId();\n#elif defined(Q_OS_IOS)\n    return AsemanObjectiveCLayer::deviceId();\n#elif defined(Q_OS_MACX)\n    io_registry_entry_t ioRegistryRoot = IORegistryEntryFromPath(kIOMasterPortDefault, \"IOService:/\");\n    CFStringRef uuidCf = (CFStringRef) IORegistryEntryCreateCFProperty(ioRegistryRoot, CFSTR(kIOPlatformUUIDKey), kCFAllocatorDefault, 0);\n    IOObjectRelease(ioRegistryRoot);\n    char buf[128];\n    CFStringGetCString(uuidCf, buf, sizeof(buf), kCFStringEncodingMacRoman);\n    CFRelease(uuidCf);\n    return QString::fromUtf8( QByteArray(buf, sizeof(buf)) );\n#elif defined(Q_OS_LINUX) || defined(Q_OS_WIN32)\n    static QString cg_hostId;\n    if(!cg_hostId.isEmpty())\n        return cg_hostId;\n\n    QProcess prc;\n#ifdef Q_OS_WIN\n    prc.start(QStringLiteral(\"wmic\"), {QStringLiteral(\"csproduct\"), QStringLiteral(\"get\"), QStringLiteral(\"UUID\")});\n#else\n    prc.start(QStringLiteral(\"hostid\"));\n#endif\n    prc.waitForStarted();\n    prc.waitForReadyRead();\n    prc.waitForFinished();\n\n    cg_hostId = QString::fromUtf8(prc.readAll());\n    cg_hostId = cg_hostId.remove(QStringLiteral(\"UUID\")).trimmed();\n    if(cg_hostId.isEmpty())\n        cg_hostId = QStringLiteral(\"noid\");\n    return cg_hostId;\n#else\n    return QStringLiteral(\"noid\");\n#endif\n}\n\nQString AsemanDevices::deviceShortId()\n{\n    QString hash = QString::fromUtf8(QCryptographicHash::hash(deviceId().toUtf8(), QCryptographicHash::Md5).toHex());\n    return hash.remove(QStringLiteral(\"-\")).left(8);\n}\n\nQString AsemanDevices::platformVersion()\n{\n    return QSysInfo::productVersion();\n}\n\nQString AsemanDevices::platformType()\n{\n    return QSysInfo::productType();\n}\n\nQString AsemanDevices::platformName()\n{\n    return QSysInfo::prettyProductName();\n}\n\nQString AsemanDevices::platformKernel()\n{\n    return QSysInfo::kernelType();\n}\n\nQString AsemanDevices::platformKernelVersion()\n{\n    return QSysInfo::kernelVersion();\n}\n\nQString AsemanDevices::platformCpuArchitecture()\n{\n    return QSysInfo::currentCpuArchitecture();\n}\n\nQString AsemanDevices::qtVersion()\n{\n    return QStringLiteral(QT_VERSION_STR);\n}\n\nqreal AsemanDevices::qtMajorVersion()\n{\n    static qreal result = 0;\n    if(result != 0.0)\n        return result;\n\n    const QString &qv = qtVersion();\n    int idx0 = qv.indexOf(QStringLiteral(\".\"));\n    int idx1 = qv.indexOf(QStringLiteral(\".\"), idx0+1);\n    result = qv.left(idx1).toDouble();\n    return result;\n}\n\nbool AsemanDevices::transparentStatusBar()\n{\n    return p->transparentStatusBar;\n}\n\nvoid AsemanDevices::setTransparentStatusBar(bool stt)\n{\n    if(p->transparentStatusBar == stt)\n        return;\n\n#ifdef Q_OS_ANDROID\n    AsemanJavaLayer::instance()->setTransparentStatusBar(stt);\n#else\n    Q_UNUSED(stt)\n#endif\n    p->transparentStatusBar = stt;\n    Q_EMIT transparentStatusBarChanged();\n\n    QTimer::singleShot(100, this, [this](){\n        refreshTransparentStatusBar();\n        Q_EMIT statusBarHeightChanged();\n    });\n}\n\nbool AsemanDevices::transparentNavigationBar()\n{\n    return p->transparentNavigationBar;\n}\n\nvoid AsemanDevices::setTransparentNavigationBar(bool stt)\n{\n    if(p->transparentNavigationBar == stt)\n        return;\n\n#ifdef Q_OS_ANDROID\n    AsemanJavaLayer::instance()->setTransparentNavigationBar(stt);\n#else\n    Q_UNUSED(stt)\n#endif\n    p->transparentNavigationBar = stt;\n    Q_EMIT transparentNavigationBarChanged();\n\n    QTimer::singleShot(100, this, [this](){\n        refreshTransparentNavigationBar();\n        Q_EMIT navigationBarHeightChanged();\n    });\n}\n\nqreal AsemanDevices::standardTitleBarHeight() const\n{\n    static qreal res = 0;\n    if(res)\n        return res;\n\n    if(isDesktop())\n        res = 54*density();\n    else\n    if(isMobile())\n        res = 56*density();\n    else\n        res = 54*density();\n\n    return res;\n}\n\nqreal AsemanDevices::statusBarHeight()\n{\n    if(!transparentStatusBar())\n        return 0;\n\n#ifdef Q_OS_IOS\n    return AsemanObjectiveCLayer::statusBarHeight();\n#else\n    static qreal result = 0;\n    if(result == 0.0)\n    {\n#ifdef Q_OS_ANDROID\n        result = density()*(AsemanJavaLayer::instance()->statusBarHeight()/deviceDensity());\n#else\n        result = 20*density();\n#endif\n    }\n    return result;\n#endif\n}\n\nqreal AsemanDevices::navigationBarHeight()\n{\n    if(!transparentNavigationBar())\n        return 0;\n\n    static qreal result = 0;\n    if(result == 0.0)\n    {\n#ifdef Q_OS_ANDROID\n        result = density()*(AsemanJavaLayer::instance()->navigationBarHeight()/deviceDensity());\n#else\n#ifdef Q_OS_IOS\n        result = AsemanObjectiveCLayer::navigationBarHeight();\n#else\n        result = 44*density();\n#endif\n#endif\n    }\n    return result;\n}\n\nvoid AsemanDevices::setFlag(int flag, bool state)\n{\n    AsemanDevicesPrivate::flags[flag] = state;\n}\n\nbool AsemanDevices::flag(int flag)\n{\n    return AsemanDevicesPrivate::flags.value(flag);\n}\n\nint AsemanDevices::densityDpi()\n{\n#ifdef Q_OS_ANDROID\n    return AsemanJavaLayer::instance()->densityDpi();\n#else\n    return lcdDpiX();\n#endif\n}\n\nqreal AsemanDevices::density()\n{\n    const bool disabled = AsemanDevices::flag(DisableDensities);\n    if(AsemanDevices::flag(AsemanScaleFactorEnable))\n        return qgetenv(\"ASEMAN_SCALE_FACTOR\").toDouble();\n    else\n    if(disabled)\n        return 1;\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) && !defined(Q_OS_IOS) && !defined (Q_OS_MAC)\n    else\n    if(QGuiApplication::testAttribute(Qt::AA_EnableHighDpiScaling))\n        return deviceDensity()/screen()->devicePixelRatio();\n#endif\n    else\n        return deviceDensity();\n}\n\nqreal AsemanDevices::deviceDensity()\n{\n#ifdef Q_OS_ANDROID\n    qreal ratio = isTablet()? TABLET_RATIO : 1;\n//    if( isLargeTablet() )\n//        ratio = 1.6;\n\n    return AsemanJavaLayer::instance()->density()*ratio;\n#else\n#ifdef Q_OS_IOS\n    qreal ratio = isTablet()? TABLET_RATIO : 1;\n    return ratio*densityDpi()/180.0;\n#else\n#if defined(Q_OS_LINUX) || defined(Q_OS_OPENBSD)\n#ifdef Q_OS_UBUNTUTOUCH\n    return screen()->logicalDotsPerInch()/UTOUCH_DEFAULT_DPI;\n#else\n    return screen()->logicalDotsPerInch()/LINUX_DEFAULT_DPI;\n#endif\n#else\n#ifdef Q_OS_WIN32\n    return 0.95*screen()->logicalDotsPerInch()/WINDOWS_DEFAULT_DPI;\n#else\n    return 1;\n#endif\n#endif\n#endif\n#endif\n}\n\nqreal AsemanDevices::fontDensity()\n{\n#ifdef Q_OS_ANDROID\n    const qreal ratio = AsemanDevicesPrivate::fontScale*(isMobile()? FONT_RATIO*1.25 : FONT_RATIO*1.35);\n    if(AsemanDevices::flag(AsemanScaleFactorEnable))\n        return density()*ratio;\n    else\n    if(AsemanDevices::flag(DisableDensities))\n        return ratio;\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))\n    else\n    if(QGuiApplication::testAttribute(Qt::AA_EnableHighDpiScaling))\n        return AsemanJavaLayer::instance()->density()*ratio/screen()->devicePixelRatio();\n#endif\n    else\n        return AsemanJavaLayer::instance()->density()*ratio;\n#else\n#ifdef Q_OS_IOS\n    return AsemanDevicesPrivate::fontScale * 1.4;\n#else\n#if defined(Q_OS_LINUX) || defined(Q_OS_OPENBSD)\n#ifdef Q_OS_UBUNTUTOUCH\n    qreal ratio = AsemanDevicesPrivate::fontScale * 1.3;\n    return ratio*density();\n#else\n    qreal ratio = AsemanDevicesPrivate::fontScale * 1.4;\n    return ratio*density();\n#endif\n#else\n#ifdef Q_OS_WIN32\n    qreal ratio = AsemanDevicesPrivate::fontScale * 1.4;\n    return ratio*density();\n#else\n    qreal ratio = AsemanDevicesPrivate::fontScale * 1.3;\n    return ratio*density();\n#endif\n#endif\n#endif\n#endif\n}\n\nvoid AsemanDevices::setFontScale(qreal fontScale)\n{\n    if(AsemanDevicesPrivate::fontScale == fontScale)\n        return;\n\n    AsemanDevicesPrivate::fontScale = fontScale;\n    for(AsemanDevices *dvc: AsemanDevicesPrivate::devicesObjs)\n    {\n        Q_EMIT dvc->fontScaleChanged();\n        Q_EMIT dvc->fontDensityChanged();\n    }\n}\n\nqreal AsemanDevices::fontScale()\n{\n    return AsemanDevicesPrivate::fontScale;\n}\n\nbool AsemanDevices::cameraIsAvailable() const\n{\n#ifdef ASEMAN_MULTIMEDIA\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0))\n    return QCameraInfo::availableCameras().count();\n#else\n    return false;\n#endif\n#else\n    return false;\n#endif\n}\n\nQString AsemanDevices::localFilesPrePath()\n{\n#ifdef Q_OS_WIN\n    return QStringLiteral(\"file:///\");\n#else\n    return QStringLiteral(\"file://\");\n#endif\n}\n\nQString AsemanDevices::clipboard() const\n{\n    return QGuiApplication::clipboard()->text();\n}\n\nbool AsemanDevices::keyboard() const\n{\n    return p->keyboard_stt;\n}\n\nQList<QUrl> AsemanDevices::clipboardUrl() const\n{\n    return QGuiApplication::clipboard()->mimeData()->urls();\n}\n\nvoid AsemanDevices::setClipboardUrl(const QList<QUrl> &urls)\n{\n    QString data = QStringLiteral(\"copy\");\n\n    for( const QUrl &url: urls )\n        data += QStringLiteral(\"\\nfile://\") + url.toLocalFile();\n\n    QMimeData *mime = new QMimeData();\n    mime->setUrls(urls);\n    mime->setData( QStringLiteral(\"x-special/gnome-copied-files\"), data.toUtf8() );\n\n    QGuiApplication::clipboard()->setMimeData(mime);\n}\n\nQString AsemanDevices::cameraLocation()\n{\n    return AsemanApplication::cameraPath();\n}\n\nQString AsemanDevices::picturesLocation()\n{\n    QStringList probs;\n    probs = QStandardPaths::standardLocations( QStandardPaths::PicturesLocation );\n\n#ifdef Q_OS_ANDROID\n    probs << \"/sdcard/Pictures\";\n#else\n#ifdef Q_OS_IOS\n    probs << QStandardPaths::standardLocations(QStandardPaths::QStandardPaths::AppDataLocation).first() + \"/Pictures\";\n#else\n    probs << QDir::homePath() + \"/Pictures\";\n#endif\n#endif\n\n    for(const QString & prob: probs)\n        if( QFile::exists(prob) )\n            return prob;\n\n    return probs.last();\n}\n\nQString AsemanDevices::musicsLocation()\n{\n    QStringList probs;\n    probs = QStandardPaths::standardLocations( QStandardPaths::MusicLocation );\n\n#ifdef Q_OS_ANDROID\n    probs << \"/sdcard/Music\";\n#else\n#ifdef Q_OS_IOS\n    probs << QStandardPaths::standardLocations(QStandardPaths::QStandardPaths::AppDataLocation).first() + \"/Music\";\n#else\n    probs << QDir::homePath() + \"/Music\";\n#endif\n#endif\n\n    for(const QString & prob: probs)\n        if( QFile::exists(prob) )\n            return prob;\n\n    return probs.last();\n}\n\nQString AsemanDevices::documentsLocation()\n{\n    QStringList probs;\n    probs = QStandardPaths::standardLocations( QStandardPaths::DocumentsLocation );\n\n#ifdef Q_OS_ANDROID\n    probs << \"/sdcard/documents\";\n    probs << \"/sdcard/Documents\";\n#else\n#ifdef Q_OS_IOS\n    probs << QStandardPaths::standardLocations(QStandardPaths::QStandardPaths::AppDataLocation).first() + \"/Documents\";\n#else\n    probs << QDir::homePath() + \"/Documents\";\n#endif\n#endif\n\n    for(const QString & prob: probs)\n        if( QFile::exists(prob) )\n            return prob;\n\n    return probs.last();\n}\n\nQString AsemanDevices::downloadsLocation()\n{\n    QStringList probs;\n    probs = QStandardPaths::standardLocations( QStandardPaths::DownloadLocation );\n\n#ifdef Q_OS_ANDROID\n    probs << \"/sdcard/downloads\";\n    probs << \"/sdcard/Downloads\";\n#else\n#ifdef Q_OS_IOS\n    probs << QStandardPaths::standardLocations(QStandardPaths::QStandardPaths::AppDataLocation).first() + \"/Downloads\";\n#else\n    probs << QDir::homePath() + \"/Downloads\";\n#endif\n#endif\n\n    for(const QString & prob: probs)\n        if( QFile::exists(prob) )\n            return prob;\n\n    return probs.last();\n}\n\nQString AsemanDevices::resourcePath()\n{\n#ifdef Q_OS_ANDROID\n    return \"assets:\";\n#else\n#ifndef Q_OS_MAC\n    QString result = QCoreApplication::applicationDirPath() + \"/../share/\" + QCoreApplication::applicationName().toLower();\n    QFileInfo file(result);\n    if(file.exists() && file.isDir())\n        return file.filePath();\n    else\n        return QCoreApplication::applicationDirPath() + \"/\";\n#else\n#ifdef Q_OS_IOS\n    return QCoreApplication::applicationDirPath() + \"/\";\n#else\n    return QCoreApplication::applicationDirPath() + \"/../Resources/\";\n#endif\n#endif\n#endif\n}\n\nQString AsemanDevices::resourcePathQml()\n{\n#ifdef Q_OS_ANDROID\n    return resourcePath();\n#else\n    return localFilesPrePath() + resourcePath();\n#endif\n}\n\nQString AsemanDevices::libsPath()\n{\n#ifndef Q_OS_MAC\n    QString result = QCoreApplication::applicationDirPath() + \"/../lib/\" + QCoreApplication::applicationName().toLower();\n    QFileInfo file(result);\n    if(file.exists() && file.isDir())\n        return file.filePath();\n    else\n        return QCoreApplication::applicationDirPath() + \"/\";\n#else\n#ifdef Q_OS_IOS\n    return QCoreApplication::applicationDirPath() + \"/\";\n#else\n    return QCoreApplication::applicationDirPath() + \"/../Resources/\";\n#endif\n#endif\n}\n\nQVariantMap AsemanDevices::deviceDetails()\n{\n    QVariantMap map;\n    map[QStringLiteral(\"device.name\")] = AsemanDevices::deviceName();\n    map[QStringLiteral(\"device.id\")] = AsemanDevices::deviceId();\n    map[QStringLiteral(\"device.shortId\")] = AsemanDevices::deviceShortId();\n\n    map[QStringLiteral(\"platform.version\")] = AsemanDevices::platformVersion();\n    map[QStringLiteral(\"platform.type\")] = AsemanDevices::platformType();\n    map[QStringLiteral(\"platform.name\")] = AsemanDevices::platformName();\n    map[QStringLiteral(\"platform.kernel\")] = AsemanDevices::platformKernel();\n    map[QStringLiteral(\"platform.kernelVersion\")] = AsemanDevices::platformKernelVersion();\n    map[QStringLiteral(\"platform.cpuArchitecture\")] = AsemanDevices::platformCpuArchitecture();\n\n    map[QStringLiteral(\"qt.version\")] = AsemanDevices::qtVersion();\n    map[QStringLiteral(\"qt.majorVersion\")] = AsemanDevices::qtMajorVersion();\n\n    map[QStringLiteral(\"screen.size\")] = AsemanDevices::screenSize();\n    map[QStringLiteral(\"screen.keyboardHeight\")] = AsemanDevices::keyboardHeight();\n    map[QStringLiteral(\"screen.density\")] = AsemanDevices::density();\n    map[QStringLiteral(\"screen.dpi\")] = AsemanDevices::densityDpi();\n    map[QStringLiteral(\"screen.deviceDensity\")] = AsemanDevices::deviceDensity();\n    map[QStringLiteral(\"screen.fontDensity\")] = AsemanDevices::fontDensity();\n\n    map[QStringLiteral(\"lcd.physicalSize\")] = AsemanDevices::lcdPhysicalSize();\n    map[QStringLiteral(\"lcd.physicalWidth\")] = AsemanDevices::lcdPhysicalWidth();\n    map[QStringLiteral(\"lcd.physicalHeight\")] = AsemanDevices::lcdPhysicalHeight();\n    map[QStringLiteral(\"lcd.dpiX\")] = AsemanDevices::lcdDpiX();\n    map[QStringLiteral(\"lcd.dpiY\")] = AsemanDevices::lcdDpiY();\n\n    map[QStringLiteral(\"os.mobile\")] = AsemanDevices::isMobile();\n    map[QStringLiteral(\"os.tablet\")] = AsemanDevices::isTablet();\n    map[QStringLiteral(\"os.largeTablet\")] = AsemanDevices::isLargeTablet();\n    map[QStringLiteral(\"os.touchDevice\")] = AsemanDevices::isTouchDevice();\n    map[QStringLiteral(\"os.desktop\")] = AsemanDevices::isDesktop();\n    map[QStringLiteral(\"os.macX\")] = AsemanDevices::isMacX();\n    map[QStringLiteral(\"os.windows\")] = AsemanDevices::isWindows();\n    map[QStringLiteral(\"os.linux\")] = AsemanDevices::isLinux();\n    map[QStringLiteral(\"os.android\")] = AsemanDevices::isAndroid();\n    map[QStringLiteral(\"os.iOS\")] = AsemanDevices::isIOS();\n    map[QStringLiteral(\"os.ubuntuTouch\")] = AsemanDevices::isUbuntuTouch();\n    map[QStringLiteral(\"os.windowsPhone\")] = AsemanDevices::isWindowsPhone();\n    map[QStringLiteral(\"os.windows8\")] = AsemanDevices::isWindows8();\n\n    map[QStringLiteral(\"ui.transparentStatusBar\")] = AsemanDevices::transparentStatusBar();\n    map[QStringLiteral(\"ui.transparentNavigationBar\")] = AsemanDevices::transparentNavigationBar();\n    map[QStringLiteral(\"ui.standardTitleBarHeight\")] = AsemanDevices::standardTitleBarHeight();\n    map[QStringLiteral(\"ui.statusBarHeight\")] = AsemanDevices::statusBarHeight();\n    map[QStringLiteral(\"ui.navigationBarHeight\")] = AsemanDevices::navigationBarHeight();\n\n    map[QStringLiteral(\"path.cameraLocation\")] = AsemanDevices::cameraLocation();\n    map[QStringLiteral(\"path.picturesLocation\")] = AsemanDevices::picturesLocation();\n    map[QStringLiteral(\"path.musicsLocation\")] = AsemanDevices::musicsLocation();\n    map[QStringLiteral(\"path.documentsLocation\")] = AsemanDevices::downloadsLocation();\n    map[QStringLiteral(\"path.resourcePath\")] = AsemanDevices::resourcePath();\n    map[QStringLiteral(\"path.resourcePathQml\")] = AsemanDevices::resourcePathQml();\n    map[QStringLiteral(\"path.libsPath\")] = AsemanDevices::libsPath();\n\n    map[QStringLiteral(\"app.path.homePath\")] = AsemanApplication::homePath();\n    map[QStringLiteral(\"app.path.startPath\")] = AsemanApplication::startPath();\n    map[QStringLiteral(\"app.path.appPath\")] = AsemanApplication::appPath();\n    map[QStringLiteral(\"app.path.appFilePath\")] = AsemanApplication::appFilePath();\n    map[QStringLiteral(\"app.path.confsPath\")] = AsemanApplication::confsPath();\n    map[QStringLiteral(\"app.path.tempPath\")] = AsemanApplication::tempPath();\n    map[QStringLiteral(\"app.path.backupsPath\")] = AsemanApplication::backupsPath();\n    map[QStringLiteral(\"app.path.cameraPath\")] = AsemanApplication::cameraPath();\n    map[QStringLiteral(\"app.path.dirPath\")] = AsemanApplication::applicationDirPath();\n    map[QStringLiteral(\"app.path.filePath\")] = AsemanApplication::applicationFilePath();\n    map[QStringLiteral(\"app.path.logPath\")] = AsemanApplication::logPath();\n\n    map[QStringLiteral(\"app.pid\")] = AsemanApplication::applicationPid();\n    map[QStringLiteral(\"app.organizationDomain\")] = AsemanApplication::organizationDomain();\n    map[QStringLiteral(\"app.organizationName\")] = AsemanApplication::organizationName();\n    map[QStringLiteral(\"app.name\")] = AsemanApplication::applicationName();\n    map[QStringLiteral(\"app.version\")] = AsemanApplication::applicationVersion();\n    map[QStringLiteral(\"app.displayName\")] = AsemanApplication::applicationDisplayName();\n    map[QStringLiteral(\"app.platformName\")] = AsemanApplication::platformName();\n\n    map[QStringLiteral(\"app.appType\")] = AsemanApplication::appType();\n    map[QStringLiteral(\"app.isDebug\")] = AsemanApplication::isDebug();\n    map[QStringLiteral(\"app.font\")] = AsemanApplication::font();\n\n    QMapIterator<QString, QVariant> i(map);\n    while(i.hasNext())\n    {\n        i.next();\n        if(i.key().left(5) != QStringLiteral(\"path.\") && i.key().left(9) != QStringLiteral(\"app.path.\"))\n            continue;\n\n        QString path = i.value().toString();\n        QFileInfo inf(path);\n\n        map[i.key() + QStringLiteral(\".exists\")] = inf.exists();\n        map[i.key() + QStringLiteral(\".isDir\")] = inf.isDir();\n        map[i.key() + QStringLiteral(\".isFile\")] = inf.isFile();\n        map[i.key() + QStringLiteral(\".isWritable\")] = inf.isWritable();\n        map[i.key() + QStringLiteral(\".isReadable\")] = inf.isReadable();\n        map[i.key() + QStringLiteral(\".isExecutable\")] = inf.isExecutable();\n        map[i.key() + QStringLiteral(\".isSymLink\")] = inf.isSymLink();\n    }\n\n    return map;\n}\n\nbool AsemanDevices::hasBiometric()\n{\n#if defined(Q_OS_IOS)\n    return p->objc_layer->hasBiometric();\n#elif defined(Q_OS_MACOS)\n    return AsemanMacManager::hasBiometric();\n#else\n    return false;\n#endif\n}\n\nbool AsemanDevices::biometricCheck()\n{\n#if defined(Q_OS_IOS)\n    return p->objc_layer->biometricCheck();\n#elif defined(Q_OS_MACOS)\n    return AsemanMacManager::biometricCheck();\n#else\n    return false;\n#endif\n}\n\nQStringList AsemanDevices::getLastImages(qint32 offset, qint32 count)\n{\n#ifdef Q_OS_ANDROID\n    return p->java_layer->getLastImages(offset, count).split(QStringLiteral(\"\\n\"), Qt::SkipEmptyParts);\n#else\n    return QStringList();\n#endif\n}\n\nvoid AsemanDevices::setupImEventFilter(QObject *item)\n{\n    class ImFixer: public QObject {\n    protected:\n        bool eventFilter(QObject *obj, QEvent *event) override {\n            if (event->type() == QEvent::InputMethodQuery) {\n                QInputMethodQueryEvent *imEvt = static_cast<QInputMethodQueryEvent *>(event);\n                if (imEvt->queries() == Qt::InputMethodQuery::ImCursorRectangle) {\n                    imEvt->setValue(Qt::InputMethodQuery::ImCursorRectangle, QRectF());\n                    return true;\n                }\n            }\n            return QObject::eventFilter(obj, event);\n        }\n    };\n    static thread_local ImFixer imf;\n    item->installEventFilter(&imf);\n}\n\nvoid AsemanDevices::setupWindowColor(QColor color)\n{\n#ifdef Q_OS_MACX\n    QTimer::singleShot(100, [color, this](){\n        p->mac_layer->removeTitlebarFromWindow(color.redF(), color.greenF(), color.blueF());\n    });\n#else\n    Q_UNUSED(color)\n#endif\n}\n\nvoid AsemanDevices::hideKeyboard()\n{\n    if( p->hide_keyboard_timer )\n        killTimer(p->hide_keyboard_timer);\n\n    p->hide_keyboard_timer = startTimer(250);\n}\n\nvoid AsemanDevices::showKeyboard()\n{\n    if( p->hide_keyboard_timer )\n    {\n        killTimer(p->hide_keyboard_timer);\n        p->hide_keyboard_timer = 0;\n    }\n\n    QGuiApplication::inputMethod()->show();\n    p->keyboard_stt = true;\n\n    Q_EMIT keyboardChanged();\n}\n\nvoid AsemanDevices::share(const QString &subject, const QString &message)\n{\n#ifdef Q_OS_ANDROID\n    p->java_layer->sharePaper( subject, message );\n#else\n#ifdef Q_OS_IOS\n    AsemanObjectiveCLayer::sharePaper((subject.length()? subject + '\\n' : QString()) + message);\n#else\n    QString adrs = QStringLiteral(\"mailto:%1?subject=%2&body=%3\").arg(QString(),subject,message);\n    QDesktopServices::openUrl( adrs );\n#endif\n#endif\n}\n\nbool AsemanDevices::openFile(const QString &address)\n{\n#ifdef Q_OS_ANDROID\n    const QMimeType & t = p->mime_db.mimeTypeForFile(address);\n    return p->java_layer->openFile( address, t.name() );\n#else\n    return QDesktopServices::openUrl( QUrl(address) );\n#endif\n}\n\nbool AsemanDevices::shareFile(const QString &address)\n{\n#ifdef Q_OS_ANDROID\n    const QMimeType & t = p->mime_db.mimeTypeForFile(address);\n    return p->java_layer->shareFile( address, t.name() );\n#else\n    return QDesktopServices::openUrl( QUrl(address) );\n#endif\n}\n\nbool AsemanDevices::saveToGallery(const QString &filePath)\n{\n#ifdef Q_OS_IOS\n    AsemanObjectiveCLayer::saveToCameraRoll(filePath);\n#else\n    QString path = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation) + QStringLiteral(\"/\") + QCoreApplication::applicationName();\n    QDir().mkpath(path);\n\n    QImageWriter writer(path + \"/\" + filePath.mid(filePath.lastIndexOf(QStringLiteral(\"/\"))+1));\n    writer.write(QImage(filePath));\n#endif\n    return true;\n}\n\nvoid AsemanDevices::callNumber(const QString &number)\n{\n    Q_UNUSED(number)\n#ifdef Q_OS_ANDROID\n    p->java_layer->callNumber(number);\n#else\n#endif\n}\n\nvoid AsemanDevices::setClipboard(const QString &text)\n{\n    QGuiApplication::clipboard()->setText( text );\n}\n\nvoid AsemanDevices::setClipboardData(AsemanMimeData *mime)\n{\n    QMimeData *data = new QMimeData();\n    if(mime)\n    {\n        data->setText(mime->text());\n        data->setHtml(mime->html());\n        data->setUrls(mime->urls());\n\n        const QVariantMap &map = mime->dataMap();\n        QMapIterator<QString,QVariant> i(map);\n        while(i.hasNext())\n        {\n            i.next();\n            QByteArray bytes;\n            QDataStream stream(&bytes, QIODevice::WriteOnly);\n            stream << i.value();\n\n            data->setData(i.key(), bytes);\n        }\n    }\n    QGuiApplication::clipboard()->setMimeData(data);\n}\n\nQString AsemanDevices::startCameraPicture()\n{\n#ifdef Q_OS_ANDROID\n    QString output = cameraLocation() + \"/aseman_\" + QString::number(QDateTime::currentDateTime().toMSecsSinceEpoch()) + \".jpg\";\n    if(!p->java_layer->startCamera(output))\n        output.clear();\n\n    return output;\n#else\n    return QString();\n#endif\n}\n\nbool AsemanDevices::getOpenPictures()\n{\n#ifdef Q_OS_ANDROID\n    return p->java_layer->getOpenPictures();\n#else\n    return false;\n#endif\n}\n\nvoid AsemanDevices::triggerVibrateFeedback()\n{\n#ifdef Q_OS_IOS\n    p->objc_layer->triggerVibrateFeedback();\n#endif\n}\n\nQVariantList AsemanDevices::getContactList(std::function<void(const QVariantList &)> asyncCallback)\n{\n    QVariantList res;\n#ifdef Q_OS_ANDROID\n    if (asyncCallback)\n    {\n        class ContactThreaded: public QThread\n        {\n        protected:\n            void run() {\n                result = QJsonDocument::fromJson(AsemanJavaLayer::instance()->getContactList().toUtf8()).toVariant().toList();\n            }\n\n        public:\n            ContactThreaded(QObject *parent = Q_NULLPTR): QThread(parent) {}\n            virtual ~ContactThreaded() {}\n            QVariantList result;\n        };\n\n        auto currentThread = QThread::currentThread();\n        ContactThreaded *thread = new ContactThreaded;\n        connect(thread, &ContactThreaded::finished, currentThread, [thread, asyncCallback](){\n            asyncCallback(thread->result);\n            thread->deleteLater();\n        },  Qt::QueuedConnection);\n        thread->start();\n\n        return res;\n    }\n    else\n        res = QJsonDocument::fromJson(AsemanJavaLayer::instance()->getContactList().toUtf8()).toVariant().toList();\n#endif\n#ifdef Q_OS_IOS\n    if (asyncCallback)\n        AsemanObjectiveCLayer::getContactList(asyncCallback);\n    return res;\n#endif\n\n    if (asyncCallback)\n        asyncCallback(res);\n\n    return res;\n}\n\nvoid AsemanDevices::incoming_share(const QString &title, const QString &msg)\n{\n    Q_EMIT incomingShare(title,msg);\n}\n\nvoid AsemanDevices::activity_paused()\n{\n    Q_EMIT activityPaused();\n}\n\nvoid AsemanDevices::activity_resumed()\n{\n    Q_EMIT activityResumed();\n}\n\nvoid AsemanDevices::keyboard_changed()\n{\n    Q_EMIT keyboardChanged();\n    Q_EMIT geometryChanged();\n}\n\nvoid AsemanDevices::timerEvent(QTimerEvent *e)\n{\n    if( e->timerId() == p->hide_keyboard_timer )\n    {\n        killTimer(p->hide_keyboard_timer);\n        p->hide_keyboard_timer = 0;\n\n        QGuiApplication::inputMethod()->hide();\n        p->keyboard_stt = false;\n\n        Q_EMIT keyboardChanged();\n    }\n}\n\nvoid AsemanDevices::refreshTransparentStatusBar()\n{\n#ifdef Q_OS_ANDROID\n    p->transparentStatusBar = AsemanJavaLayer::instance()->transparentStatusBar();\n#else\n#ifdef Q_OS_IOS\n    p->transparentStatusBar = true;\n#else\n    p->transparentStatusBar = false;\n#endif\n#endif\n}\n\nvoid AsemanDevices::refreshTransparentNavigationBar()\n{\n#ifdef Q_OS_ANDROID\n    p->transparentNavigationBar = AsemanJavaLayer::instance()->transparentNavigationBar();\n#else\n#ifdef Q_OS_IOS\n    p->transparentNavigationBar = (AsemanObjectiveCLayer::navigationBarHeight() > 0.1);\n#else\n    p->transparentNavigationBar = false;\n#endif\n#endif\n}\n\nAsemanDevices::~AsemanDevices()\n{\n    AsemanDevicesPrivate::devicesObjs.remove(this);\n    delete p;\n}\n"
  },
  {
    "path": "src/gui/asemandevices.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANDEVICES_H\n#define ASEMANDEVICES_H\n\n#include <QObject>\n#include <QUrl>\n#include <QSize>\n#include <QVariantMap>\n#include <QColor>\n\n#include \"asemangui_global.h\"\n#include <functional>\n\nclass AsemanMimeData;\nclass QScreen;\nclass AsemanDevicesPrivate;\nclass LIBQTASEMAN_GUI_EXPORT AsemanDevices : public QObject\n{\n    Q_OBJECT\n\n    Q_PROPERTY(bool isMobile       READ isMobile       NOTIFY isMobileChanged       )\n    Q_PROPERTY(bool isTablet       READ isTablet       NOTIFY isTabletChanged       )\n    Q_PROPERTY(bool isLargeTablet  READ isLargeTablet  NOTIFY isLargeTabletChanged  )\n    Q_PROPERTY(bool isTouchDevice  READ isTouchDevice  NOTIFY isTouchDeviceChanged  )\n    Q_PROPERTY(bool isDesktop      READ isDesktop      NOTIFY isDesktopChanged      )\n    Q_PROPERTY(bool isMacX         READ isMacX         NOTIFY isMacXChanged         )\n    Q_PROPERTY(bool isWindows      READ isWindows      NOTIFY isWindowsChanged      )\n    Q_PROPERTY(bool isWindows8     READ isWindows8     NOTIFY isWindowsChanged      )\n    Q_PROPERTY(bool isLinux        READ isLinux        NOTIFY isLinuxChanged        )\n    Q_PROPERTY(bool isAndroid      READ isAndroid      NOTIFY isAndroidChanged      )\n    Q_PROPERTY(bool isIOS          READ isIOS          NOTIFY isIOSChanged          )\n    Q_PROPERTY(bool isUbuntuTouch  READ isUbuntuTouch  NOTIFY isUbuntuTouchChanged  )\n    Q_PROPERTY(bool isWindowsPhone READ isWindowsPhone NOTIFY isWindowsPhoneChanged )\n    Q_PROPERTY(bool isQt6          READ isQt6          NOTIFY isQt6Changed          )\n    Q_PROPERTY(bool isWebAssembly  READ isWebAssembly  NOTIFY isWebAssemblyChanged  )\n\n    Q_PROPERTY(QObject* screen READ screenObj NOTIFY screenChanged )\n\n    Q_PROPERTY(bool cameraIsAvailable READ cameraIsAvailable NOTIFY cameraIsAvailableChanged)\n\n    Q_PROPERTY(qreal lcdPhysicalSize   READ lcdPhysicalSize   NOTIFY lcdPhysicalSizeChanged   )\n    Q_PROPERTY(qreal lcdPhysicalWidth  READ lcdPhysicalWidth  NOTIFY lcdPhysicalWidthChanged  )\n    Q_PROPERTY(qreal lcdPhysicalHeight READ lcdPhysicalHeight NOTIFY lcdPhysicalHeightChanged )\n    Q_PROPERTY(qreal lcdDpiX           READ lcdDpiX           NOTIFY lcdDpiXChanged           )\n    Q_PROPERTY(qreal lcdDpiY           READ lcdDpiY           NOTIFY lcdDpiYChanged           )\n\n    Q_PROPERTY(QString platformVersion         READ platformVersion         NOTIFY platformChanged)\n    Q_PROPERTY(QString platformType            READ platformType            NOTIFY platformChanged)\n    Q_PROPERTY(QString platformName            READ platformName            NOTIFY platformChanged)\n    Q_PROPERTY(QString platformKernel          READ platformKernel          NOTIFY platformChanged)\n    Q_PROPERTY(QString platformKernelVersion   READ platformKernelVersion   NOTIFY platformChanged)\n    Q_PROPERTY(QString platformCpuArchitecture READ platformCpuArchitecture NOTIFY platformChanged)\n\n    Q_PROPERTY(QSize screenSize        READ screenSize        NOTIFY geometryChanged          )\n    Q_PROPERTY(qreal keyboardHeight    READ keyboardHeight    NOTIFY geometryChanged          )\n\n    Q_PROPERTY(QString localFilesPrePath READ localFilesPrePath NOTIFY localFilesPrePathChanged)\n\n    Q_PROPERTY(int   densityDpi    READ densityDpi    NOTIFY densityDpiChanged  )\n    Q_PROPERTY(qreal density       READ density       NOTIFY densityChanged     )\n    Q_PROPERTY(qreal deviceDensity READ deviceDensity NOTIFY densityChanged     )\n    Q_PROPERTY(qreal fontDensity   READ fontDensity   NOTIFY fontDensityChanged )\n\n    Q_PROPERTY(bool  transparentStatusBar     READ transparentStatusBar     WRITE setTransparentStatusBar     NOTIFY transparentStatusBarChanged    )\n    Q_PROPERTY(bool  transparentNavigationBar READ transparentNavigationBar WRITE setTransparentNavigationBar NOTIFY transparentNavigationBarChanged)\n    Q_PROPERTY(qreal standardTitleBarHeight   READ standardTitleBarHeight   NOTIFY standardTitleBarHeightChanged  )\n    Q_PROPERTY(qreal statusBarHeight          READ statusBarHeight          NOTIFY statusBarHeightChanged)\n    Q_PROPERTY(qreal navigationBarHeight      READ navigationBarHeight      NOTIFY navigationBarHeightChanged)\n\n    Q_PROPERTY(QString     clipboard    READ clipboard    WRITE setClipboard    NOTIFY clipboardChanged   )\n    Q_PROPERTY(QList<QUrl> clipboardUrl READ clipboardUrl WRITE setClipboardUrl NOTIFY clipboardUrlChanged)\n\n    Q_PROPERTY(bool keyboard READ keyboard NOTIFY keyboardChanged)\n    Q_PROPERTY(bool hasBiometric READ hasBiometric NOTIFY hasBiometricChanged)\n\n    Q_PROPERTY(QString cameraLocation    READ cameraLocation    NOTIFY cameraLocationChanged    )\n    Q_PROPERTY(QString picturesLocation  READ picturesLocation  NOTIFY picturesLocationChanged  )\n    Q_PROPERTY(QString musicsLocation    READ musicsLocation    NOTIFY musicsLocationChanged    )\n    Q_PROPERTY(QString documentsLocation READ documentsLocation NOTIFY documentsLocationChanged )\n    Q_PROPERTY(QString downloadsLocation READ downloadsLocation NOTIFY downloadsLocationChanged )\n    Q_PROPERTY(QString resourcePath      READ resourcePathQml   NOTIFY resourcePathChanged      )\n    Q_PROPERTY(QString libsPath          READ libsPath          NOTIFY libsPathChanged          )\n\n    Q_PROPERTY(QString deviceName READ deviceName NOTIFY deviceNameChanged)\n    Q_PROPERTY(QString deviceId   READ deviceId   NOTIFY deviceIdChanged)\n    Q_PROPERTY(QString deviceShortId   READ deviceShortId   NOTIFY deviceIdChanged)\n\n    Q_PROPERTY(QString qtVersion READ qtVersion NOTIFY qtVersionChanged)\n    Q_PROPERTY(qreal qtMajorVersion READ qtMajorVersion NOTIFY qtVersionChanged)\n\n    Q_PROPERTY(qreal fontScale READ fontScale WRITE setFontScale NOTIFY fontScaleChanged)\n    Q_PROPERTY(QVariantMap deviceDetails READ deviceDetails NOTIFY deviceDetailsChanged)\n\npublic:\n    enum Flags {\n        DisableDensities,\n        AsemanScaleFactorEnable\n    };\n\n    AsemanDevices(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanDevices();\n\n    static bool isMobile();\n    static bool isTablet();\n    static bool isLargeTablet();\n    static bool isTouchDevice();\n    static bool isDesktop();\n    static bool isMacX();\n    static bool isWindows();\n    static bool isLinux();\n    static bool isAndroid();\n    static bool isIOS();\n    static bool isUbuntuTouch();\n    static bool isWindowsPhone();\n    static bool isWindows8();\n    static bool isWebAssembly();\n    static bool isQt6();\n\n    static QScreen *screen();\n    QObject *screenObj() const;\n\n    static qreal lcdPhysicalSize();\n    static qreal lcdPhysicalWidth();\n    static qreal lcdPhysicalHeight();\n    static qreal lcdDpiX();\n    static qreal lcdDpiY();\n\n    static QSize screenSize();\n    qreal keyboardHeight() const;\n    static QString deviceName();\n    static QString deviceId();\n    static QString deviceShortId();\n\n    static QString platformVersion();\n    static QString platformType();\n    static QString platformName();\n    static QString platformKernel();\n    static QString platformKernelVersion();\n    static QString platformCpuArchitecture();\n\n    static QString qtVersion();\n    static qreal qtMajorVersion();\n\n    static int densityDpi();\n    static qreal density();\n    static qreal deviceDensity();\n    static qreal fontDensity();\n\n    static void setFontScale(qreal fontScale);\n    static qreal fontScale();\n\n    bool cameraIsAvailable() const;\n\n    static QString localFilesPrePath();\n\n    bool transparentStatusBar();\n    void setTransparentStatusBar(bool stt);\n\n    bool transparentNavigationBar();\n    void setTransparentNavigationBar(bool stt);\n\n    qreal standardTitleBarHeight() const;\n\n    qreal statusBarHeight();\n    qreal navigationBarHeight();\n\n    Q_INVOKABLE static void setFlag(int flag, bool state = true);\n    Q_INVOKABLE static bool flag(int flag);\n\n    QString clipboard() const;\n    bool keyboard() const;\n\n    QList<QUrl> clipboardUrl() const;\n    void setClipboardUrl(const QList<QUrl> &urls);\n\n    static QString cameraLocation();\n    static QString picturesLocation();\n    static QString musicsLocation();\n    static QString documentsLocation();\n    static QString downloadsLocation();\n    static QString resourcePath();\n    static QString resourcePathQml();\n    static QString libsPath();\n\n    QVariantMap deviceDetails();\n\n    bool hasBiometric();\n\n    static QVariantList getContactList(std::function<void(const QVariantList &res)> asyncCallback = Q_NULLPTR);\n\npublic Q_SLOTS:\n    void hideKeyboard();\n    void showKeyboard();\n\n    void share(const QString & subject, const QString & message );\n    bool openFile( const QString & address );\n    bool shareFile(const QString &address);\n    bool saveToGallery(const QString &filePath);\n    void callNumber( const QString & number );\n    void setClipboard( const QString & text );\n    void setClipboardData(AsemanMimeData *mime);\n\n    QStringList getLastImages(qint32 offset, qint32 count);\n\n    void setupImEventFilter(QObject *item);\n    void setupWindowColor(QColor color);\n\n    virtual QString startCameraPicture();\n    virtual bool getOpenPictures();\n\n    void triggerVibrateFeedback();\n\n    bool biometricCheck();\n\nQ_SIGNALS:\n    void incomingShare( const QString & title, const QString & msg );\n    void incomingImage( const QString & path );\n    void deepLinkReceived(const QString &link);\n    void selectImageResult( const QString & path );\n    void activityPaused();\n    void activityResumed();\n\n    void isMobileChanged();\n    void isTabletChanged();\n    void isLargeTabletChanged();\n    void isTouchDeviceChanged();\n    void isDesktopChanged();\n    void isMacXChanged();\n    void isWindowsChanged();\n    void isLinuxChanged();\n    void isAndroidChanged();\n    void isIOSChanged();\n    void isUbuntuTouchChanged();\n    void isWindowsPhoneChanged();\n    void isWebAssemblyChanged();\n    void isQt6Changed();\n\n    void deviceNameChanged();\n    void deviceIdChanged();\n    void qtVersionChanged();\n    void platformChanged();\n\n    void cameraIsAvailableChanged();\n\n    void screenChanged();\n    void localFilesPrePathChanged();\n\n    void lcdPhysicalSizeChanged();\n    void lcdPhysicalWidthChanged();\n    void lcdPhysicalHeightChanged();\n\n    void lcdDpiXChanged();\n    void lcdDpiYChanged();\n\n    void geometryChanged();\n    void hasBiometricChanged();\n\n    void transparentStatusBarChanged();\n    void transparentNavigationBarChanged();\n    void standardTitleBarHeightChanged();\n    void statusBarHeightChanged();\n    void navigationBarHeightChanged();\n\n    void densityDpiChanged();\n    void densityChanged();\n    void fontScaleChanged();\n    void fontDensityChanged();\n\n    void clipboardChanged();\n    void clipboardUrlChanged();\n    void keyboardChanged();\n\n    void cameraLocationChanged();\n    void picturesLocationChanged();\n    void musicsLocationChanged();\n    void documentsLocationChanged();\n    void downloadsLocationChanged();\n    void resourcePathChanged();\n    void libsPathChanged();\n\n    void deviceDetailsChanged();\n\nprivate Q_SLOTS:\n    void incoming_share( const QString & title, const QString & msg );\n    void activity_paused();\n    void activity_resumed();\n    void keyboard_changed();\n\nprotected:\n    void timerEvent(QTimerEvent *e) Q_DECL_OVERRIDE;\n    void refreshTransparentStatusBar();\n    void refreshTransparentNavigationBar();\n\nprivate:\n    AsemanDevicesPrivate *p;\n};\n\ntypedef AsemanDevices QAsemanDevices;\n\n#endif // ASEMANDEVICES_H\n"
  },
  {
    "path": "src/gui/asemanglobaltranslations.cpp",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanglobaltranslations.h\"\n\n#include <QCoreApplication>\n#include <QPointer>\n#include <QSet>\n\nclass AsemanGlobalTranslations::Private\n{\npublic:\n    static QSet<AsemanGlobalTranslations*> objects;\n};\n\nQSet<AsemanGlobalTranslations*> AsemanGlobalTranslations::Private::objects;\n\nAsemanGlobalTranslations::AsemanGlobalTranslations(QObject *parent) :\n    QObject(parent)\n{\n    p = new Private;\n    p->objects.insert(this);\n}\n\nAsemanGlobalTranslations *AsemanGlobalTranslations::instance()\n{\n    static QPointer<AsemanGlobalTranslations> res;\n    if (!res)\n        res = new AsemanGlobalTranslations(QCoreApplication::instance());\n    return res;\n}\n\nvoid AsemanGlobalTranslations::refresh()\n{\n    for (AsemanGlobalTranslations *o: Private::objects)\n        Q_EMIT o->refreshed();\n}\n\nAsemanGlobalTranslations::~AsemanGlobalTranslations()\n{\n    p->objects.remove(this);\n    delete p;\n}\n"
  },
  {
    "path": "src/gui/asemanglobaltranslations.h",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANGLOBALTRANSLATIONS_H\n#define ASEMANGLOBALTRANSLATIONS_H\n\n#include <QObject>\n\n#include \"asemangui_global.h\"\n\nclass LIBQTASEMAN_GUI_EXPORT AsemanGlobalTranslations : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QString refresher READ refresher NOTIFY refreshed)\n\n    class Private;\n    friend class AsemanTranslationManager;\n\npublic:\n    AsemanGlobalTranslations(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanGlobalTranslations();\n\n    QString refresher() const { return QString(); }\n\n    static AsemanGlobalTranslations *instance();\n\nQ_SIGNALS:\n    void refreshed();\n\nprivate:\n    static void refresh();\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanGlobalTranslations QAsemanGlobalTranslations;\n\n#endif // ASEMANGLOBALTRANSLATIONS_H\n"
  },
  {
    "path": "src/gui/asemangui_global.h",
    "content": "#ifndef ASEMAN_GUI_GLOBAL_H\n#define ASEMAN_GUI_GLOBAL_H\n\n#include <QtCore/qglobal.h>\n\n#if !defined(QT_STATIC) && !defined(QASEMAN_STATIC)\n#if defined(LIBQTASEMAN_GUI_LIBRARY)\n#  define LIBQTASEMAN_GUI_EXPORT Q_DECL_EXPORT\n#else\n#  define LIBQTASEMAN_GUI_EXPORT Q_DECL_IMPORT\n#endif\n#else\n#define LIBQTASEMAN_GUI_EXPORT\n#endif\n\n#endif // ASEMAN_GUI_GLOBAL_H\n"
  },
  {
    "path": "src/gui/asemanimagecoloranalizor.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#define MAX_ACTIVE_THREADS 4\n#define IMAGE_WIDTH 400\n\n#include \"asemanimagecoloranalizor.h\"\n#include \"asemandevices.h\"\n\n#include <QThread>\n#include <QCoreApplication>\n#include <QQueue>\n#include <QSet>\n#include <QImageReader>\n#include <QImage>\n#include <QFileInfo>\n#include <QDebug>\n\nAsemanImageColorAnalizorThread *colorizor_thread = 0;\n\nclass AsemanImageColorAnalizorPrivate\n{\npublic:\n    QUrl source;\n    QColor color;\n    int method;\n};\n\nAsemanImageColorAnalizor::AsemanImageColorAnalizor(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanImageColorAnalizorPrivate;\n    p->method = Normal;\n\n    if( !colorizor_thread )\n        colorizor_thread = new AsemanImageColorAnalizorThread(QCoreApplication::instance());\n\n    connect( colorizor_thread, &AsemanImageColorAnalizorThread::found, this, &AsemanImageColorAnalizor::found);\n}\n\nQUrl AsemanImageColorAnalizor::source() const\n{\n    return p->source;\n}\n\nvoid AsemanImageColorAnalizor::setSource(const QUrl &source)\n{\n    if( p->source == source )\n        return;\n\n    p->source = source;\n    Q_EMIT sourceChanged();\n\n    start();\n}\n\nQString AsemanImageColorAnalizor::sourceString() const\n{\n    QString res = p->source.toString();\n    QString pre = p->source.toString(QUrl::RemovePath);\n    if(res.left(pre.length()) == pre)\n        res = QString::fromUtf8(pre==QStringLiteral(\"qrc:\")?\":\":\"\") + res.mid(pre.length());\n\n    return res;\n}\n\nint AsemanImageColorAnalizor::method() const\n{\n    return p->method;\n}\n\nvoid AsemanImageColorAnalizor::setMethod(int m)\n{\n    if( p->method == m )\n        return;\n\n    p->method = static_cast<Method>(m);\n    Q_EMIT methodChanged();\n\n    start();\n}\n\nQColor AsemanImageColorAnalizor::color() const\n{\n    return p->color;\n}\n\nvoid AsemanImageColorAnalizor::found(int method, const QString &path)\n{\n    if( method != p->method )\n        return;\n    if( path != sourceString() )\n        return;\n\n    const QHash<int, QHash<QString,QColor> > & results = colorizor_thread->results();\n    if( !results.contains(p->method) || !results.value(p->method).contains(sourceString()) )\n        return;\n\n    p->color = results[p->method][sourceString()];\n    Q_EMIT colorChanged();\n}\n\nvoid AsemanImageColorAnalizor::start()\n{\n    if( p->source.isEmpty() )\n        return;\n\n    colorizor_thread->analize(p->method, sourceString());\n    found(p->method,sourceString());\n}\n\nAsemanImageColorAnalizor::~AsemanImageColorAnalizor()\n{\n    delete p;\n}\n\n\nclass AsemanImageColorAnalizorThreadPrivate\n{\npublic:\n    QHash<int, QHash<QString,QColor> > results;\n\n    QQueue< QPair<int,QString> > queue;\n    QSet<AsemanImageColorAnalizorCore*> cores;\n    QQueue<AsemanImageColorAnalizorCore*> free_cores;\n};\n\nAsemanImageColorAnalizorThread::AsemanImageColorAnalizorThread(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanImageColorAnalizorThreadPrivate;\n}\n\nconst QHash<int, QHash<QString,QColor> > &AsemanImageColorAnalizorThread::results() const\n{\n    return p->results;\n}\n\nvoid AsemanImageColorAnalizorThread::analize(int method, const QString &path)\n{\n    if( p->results.contains(method) && p->results.value(method).contains(path) )\n        return;\n\n    AsemanImageColorAnalizorCore *core = getCore();\n    if( !core )\n    {\n        QPair<int,QString> pair(method, path);\n        p->queue.append(pair);\n        return;\n    }\n\n    QMetaObject::invokeMethod( core, \"analize\", Qt::QueuedConnection, Q_ARG(int,method) , Q_ARG(QString,path) );\n}\n\nvoid AsemanImageColorAnalizorThread::found_slt(AsemanImageColorAnalizorCore *c, int method, const QString &source, const QColor & color)\n{\n    p->results[method][source] = color;\n    Q_EMIT found(method, source);\n\n    p->free_cores.append(c);\n    if( p->queue.isEmpty() )\n        return;\n\n    AsemanImageColorAnalizorCore *core = getCore();\n    if( !core )\n        return;\n\n    const QPair<int,QString> & pair = p->queue.takeFirst();\n    QMetaObject::invokeMethod( core, \"analize\", Qt::QueuedConnection, Q_ARG(int,pair.first), Q_ARG(QString,pair.second) );\n}\n\nAsemanImageColorAnalizorCore *AsemanImageColorAnalizorThread::getCore()\n{\n    if( !p->free_cores.isEmpty() )\n        return p->free_cores.takeFirst();\n    if( p->cores.count() > MAX_ACTIVE_THREADS )\n        return 0;\n\n    QThread *thread = new QThread(this);\n\n    AsemanImageColorAnalizorCore *core = new AsemanImageColorAnalizorCore();\n    core->moveToThread(thread);\n\n    connect( core, &AsemanImageColorAnalizorCore::found, this, &AsemanImageColorAnalizorThread::found_slt, Qt::QueuedConnection );\n\n    thread->start(QThread::LowestPriority);\n    p->cores.insert(core);\n\n    return core;\n}\n\nAsemanImageColorAnalizorThread::~AsemanImageColorAnalizorThread()\n{\n    for(AsemanImageColorAnalizorCore *core: p->cores)\n    {\n        QThread *thread = core->thread();\n        thread->quit();\n        thread->wait();\n        core->deleteLater();\n    }\n\n    delete p;\n}\n\n\nclass AsemanImageColorAnalizorCorePrivate\n{\npublic:\n};\n\nAsemanImageColorAnalizorCore::AsemanImageColorAnalizorCore(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanImageColorAnalizorCorePrivate;\n}\n\nvoid AsemanImageColorAnalizorCore::analize(int method, const QString &pt)\n{\n    QString path = pt;\n    if(path.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        path = path.mid(AsemanDevices::localFilesPrePath().size());\n\n    QImageReader image(path);\n\n    QSize image_size = image.size();\n    qreal ratio = image_size.width()/(qreal)image_size.height();\n    image_size.setWidth( IMAGE_WIDTH );\n    image_size.setHeight( IMAGE_WIDTH/ratio );\n\n    image.setScaledSize( image_size );\n    const QImage & img = image.read();\n\n    QColor result;\n\n    switch( method )\n    {\n    case AsemanImageColorAnalizor::Normal:\n    {\n        qreal sum_r = 0;\n        qreal sum_g = 0;\n        qreal sum_b = 0;\n        int count = 0;\n\n        for( int i=0 ; i<image_size.width(); i++ )\n        {\n            for( int j=0 ; j<image_size.height(); j++ )\n            {\n                QColor clr = img.pixel(i,j);\n                qreal mid = (clr.red()+clr.green()+clr.blue())/3;\n                if( mid > 180 || mid < 70 )\n                    continue;\n\n                sum_r += clr.red();\n                sum_g += clr.green();\n                sum_b += clr.blue();\n                count++;\n            }\n        }\n\n        result = QColor( sum_r/count, sum_g/count, sum_b/count );\n    }\n        break;\n\n    case AsemanImageColorAnalizor::MoreSaturation:\n    {\n        qreal sum_r = 0;\n        qreal sum_g = 0;\n        qreal sum_b = 0;\n        int count = 0;\n\n        for( int i=0 ; i<image_size.width(); i++ )\n        {\n            for( int j=0 ; j<image_size.height(); j++ )\n            {\n                QColor clr = img.pixel(i,j);\n                if( clr.saturation() < 150 || clr.lightness() < 50 )\n                    continue;\n\n                sum_r += clr.red();\n                sum_g += clr.green();\n                sum_b += clr.blue();\n                count++;\n            }\n        }\n\n        result = QColor( sum_r/count, sum_g/count, sum_b/count );\n    }\n        break;\n    }\n\n    Q_EMIT found( this, method, path, result );\n}\n\nAsemanImageColorAnalizorCore::~AsemanImageColorAnalizorCore()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/gui/asemanimagecoloranalizor.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANIMAGECOLORANALIZOR_H\n#define ASEMANIMAGECOLORANALIZOR_H\n\n#include <QObject>\n#include <QColor>\n#include <QHash>\n#include <QUrl>\n\n#include \"asemangui_global.h\"\n\nclass AsemanImageColorAnalizorPrivate;\nclass LIBQTASEMAN_GUI_EXPORT AsemanImageColorAnalizor : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)\n    Q_PROPERTY(QColor color READ color NOTIFY colorChanged)\n    Q_PROPERTY(int method READ method WRITE setMethod NOTIFY methodChanged)\n    Q_ENUMS(Method)\n\npublic:\n    enum Method {\n        Normal,\n        MoreSaturation\n    };\n\n    AsemanImageColorAnalizor(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanImageColorAnalizor();\n\n    QUrl source() const;\n    void setSource( const QUrl & source );\n\n    int method() const;\n    void setMethod( int m );\n\n    QColor color() const;\n\nQ_SIGNALS:\n    void sourceChanged();\n    void colorChanged();\n    void methodChanged();\n\nprivate Q_SLOTS:\n    void found(int method, const QString & path );\n    void start();\n\nprivate:\n    QString sourceString() const;\n\nprivate:\n    AsemanImageColorAnalizorPrivate *p;\n};\n\n\nclass AsemanImageColorAnalizorThreadPrivate;\nclass AsemanImageColorAnalizorThread : public QObject\n{\n    Q_OBJECT\npublic:\n    AsemanImageColorAnalizorThread(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanImageColorAnalizorThread();\n\n    const QHash<int, QHash<QString, QColor> > &results() const;\n\npublic Q_SLOTS:\n    void analize(int method, const QString & path );\n\nQ_SIGNALS:\n    void found( int method, const QString & path );\n\nprivate Q_SLOTS:\n    void found_slt(class AsemanImageColorAnalizorCore *core, int method, const QString & path , const QColor &color);\n\nprivate:\n    AsemanImageColorAnalizorCore *getCore();\n\nprivate:\n    AsemanImageColorAnalizorThreadPrivate *p;\n};\n\ntypedef AsemanImageColorAnalizor QAsemanImageColorAnalizor;\n\n\nclass AsemanImageColorAnalizorCorePrivate;\nclass AsemanImageColorAnalizorCore : public QObject\n{\n    Q_OBJECT\npublic:\n    AsemanImageColorAnalizorCore(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanImageColorAnalizorCore();\n\npublic Q_SLOTS:\n    void analize( int method, const QString & path );\n\nQ_SIGNALS:\n    void found(AsemanImageColorAnalizorCore *core, int method, const QString & path , const QColor &color);\n\nprivate:\n    AsemanImageColorAnalizorCorePrivate *p;\n};\n\n#endif // ASEMANIMAGECOLORANALIZOR_H\n"
  },
  {
    "path": "src/gui/asemanjavalayer.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanjavalayer.h\"\n\n#include <QDebug>\n#include <QSet>\n#include <QPair>\n#include <QList>\n#include <QDateTime>\n#include <QFile>\n#include <QCoreApplication>\n#include <QTimer>\n#include <QScreen>\n#include <QGuiApplication>\n#include <QPointer>\n#include <QColor>\n\n#include <jni.h>\n\n#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))\n#include <QJniEnvironment>\n#include <QJniObject>\ntypedef QJniEnvironment QAndroidJniEnvironment;\ntypedef QJniObject QAndroidJniObject;\n#else\n#include <QAndroidJniEnvironment>\n#include <QAndroidJniObject>\n#endif\n\nstatic QSet<AsemanJavaLayer*> java_layers_objects;\nstatic QList< QPair<QString,QString> > java_layer_inc_share_buffer;\nstatic QList< QString > java_layer_inc_image_buffer;\nstatic QList< QString > java_layer_inc_deeplinks_buffer;\n\nstatic bool aseman_jlayer_registerNativeMethods();\nstatic bool aseman_jlayer_native_methods_registered = false;\n\nclass AsemanJavaLayerPrivate\n{\npublic:\n    QAndroidJniObject object;\n    QAndroidJniEnvironment env;\n};\n\nAsemanJavaLayer::AsemanJavaLayer() :\n    QObject()\n{\n    if(!aseman_jlayer_native_methods_registered)\n        aseman_jlayer_registerNativeMethods();\n\n    p = new AsemanJavaLayerPrivate;\n    p->object = QAndroidJniObject(\"io/aseman/android/AsemanJavaLayer\");\n\n#if defined(Q_OS_ANDROID) && defined(ASEMAN_STATIC_BUILD)\n    QMetaObject::invokeMethod( this, \"registerObject\", Qt::QueuedConnection );\n#else\n    registerObject();\n#endif\n\n    QMetaObject::invokeMethod( this, \"load_buffer\", Qt::QueuedConnection );\n\n    setImplemented(true);\n}\n\nvoid AsemanJavaLayer::registerObject()\n{\n    java_layers_objects.insert(this);\n}\n\nAsemanJavaLayer *AsemanJavaLayer::instance()\n{\n    static QPointer<AsemanJavaLayer> java_layer_instance;\n    if( !java_layer_instance )\n    {\n        java_layer_instance = new AsemanJavaLayer();\n        if(QCoreApplication::instance())\n            QObject::connect(QCoreApplication::instance(), &QCoreApplication::destroyed, java_layer_instance, &AsemanJavaLayer::deleteLater);\n    }\n\n    return java_layer_instance;\n}\n\nbool AsemanJavaLayer::sharePaper(const QString &title, const QString &msg)\n{\n    QAndroidJniObject jtitle = QAndroidJniObject::fromString(title.toUtf8());\n    QAndroidJniObject jmsg = QAndroidJniObject::fromString(msg.toUtf8());\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"(Ljava/lang/String;Ljava/lang/String;)Z\", jtitle.object<jstring>(), jmsg.object<jstring>() );\n    return res;\n}\n\nbool AsemanJavaLayer::shareFile(const QString &path, const QString &type)\n{\n    QAndroidJniObject jpath = QAndroidJniObject::fromString(path.toUtf8());\n    QAndroidJniObject jtype = QAndroidJniObject::fromString(type.toUtf8());\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"(Ljava/lang/String;Ljava/lang/String;)Z\", jpath.object<jstring>(), jtype.object<jstring>() );\n    return res;\n}\n\nbool AsemanJavaLayer::openFile(const QString &path, const QString &type)\n{\n    QAndroidJniObject jpath = QAndroidJniObject::fromString(path.toUtf8());\n    QAndroidJniObject jtype = QAndroidJniObject::fromString(type.toUtf8());\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"(Ljava/lang/String;Ljava/lang/String;)Z\", jpath.object<jstring>(), jtype.object<jstring>() );\n    return res;\n}\n\nbool AsemanJavaLayer::startCamera(const QString &output)\n{\n    QAndroidJniObject joutput = QAndroidJniObject::fromString(output.toUtf8());\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"(Ljava/lang/String;)Z\", joutput.object<jstring>() );\n    return res;\n}\n\nbool AsemanJavaLayer::callNumber(const QString &number)\n{\n    QAndroidJniObject jnumber = QAndroidJniObject::fromString(number.toUtf8());\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"(Ljava/lang/String;)Z\", jnumber.object<jstring>() );\n    return res;\n}\n\nbool AsemanJavaLayer::getOpenPictures()\n{\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"()Z\");\n    return res;\n}\n\nbool AsemanJavaLayer::startForeground(qint32 id, const QString &title, const QString &msg, const QString &iconPath, const QString &icon, const QString &channelId)\n{\n    jint jid = id;\n    QAndroidJniObject jtitle = QAndroidJniObject::fromString(title);\n    QAndroidJniObject jmsg = QAndroidJniObject::fromString(msg);\n    QAndroidJniObject jicon = QAndroidJniObject::fromString(icon);\n    QAndroidJniObject jiconPath = QAndroidJniObject::fromString(iconPath);\n    QAndroidJniObject jchannelId = QAndroidJniObject::fromString(channelId);\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z\",\n                                                  jid, jtitle.object<jstring>(), jmsg.object<jstring>(),\n                                                  jiconPath.object<jstring>(), jicon.object<jstring>(),\n                                                  jchannelId.object<jstring>());\n    return res;\n}\n\nbool AsemanJavaLayer::stopForeground(bool removeNotification)\n{\n    jboolean jremoveNotification = removeNotification;\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"(Z)Z\", jremoveNotification);\n    return res;\n}\n\nbool AsemanJavaLayer::startNotification(qint32 id, const QString &title, const QString &msg, const QString &iconPath, const QString &icon, const QString &channelId, bool sound, bool vibrate)\n{\n    jint jid = id;\n    QAndroidJniObject jtitle = QAndroidJniObject::fromString(title);\n    QAndroidJniObject jmsg = QAndroidJniObject::fromString(msg);\n    QAndroidJniObject jicon = QAndroidJniObject::fromString(icon);\n    QAndroidJniObject jiconPath = QAndroidJniObject::fromString(iconPath);\n    QAndroidJniObject jchannelId = QAndroidJniObject::fromString(channelId);\n    jboolean jsound = sound;\n    jboolean jvibrate = vibrate;\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZ)Z\",\n                                                  jid, jtitle.object<jstring>(), jmsg.object<jstring>(),\n                                                  jiconPath.object<jstring>(), jicon.object<jstring>(),\n                                                  jchannelId.object<jstring>(), jsound, jvibrate);\n    return res;\n}\n\nbool AsemanJavaLayer::stopNotification(qint32 id)\n{\n    jint jid = id;\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"(I)Z\", jid);\n    return res;\n}\n\nQString AsemanJavaLayer::createNotificationChannel(const QString &channelId, const QString &channelName, int importance)\n{\n    QAndroidJniObject jchannelId = QAndroidJniObject::fromString(channelId);\n    QAndroidJniObject jchannelName = QAndroidJniObject::fromString(channelName);\n    jint jimportance = importance;\n    QString res = p->object.callObjectMethod(__FUNCTION__, \"(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;\",\n                                             jchannelId.object<jstring>(), jchannelName.object<jstring>(), jimportance).toString();\n    return res;\n}\n\nbool AsemanJavaLayer::transparentStatusBar()\n{\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"()Z\");\n    return res;\n}\n\nbool AsemanJavaLayer::transparentNavigationBar()\n{\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"()Z\");\n    return res;\n}\n\nbool AsemanJavaLayer::startService()\n{\n    return startQtService();\n}\n\nbool AsemanJavaLayer::stopService()\n{\n    return stopQtService();\n}\n\nbool AsemanJavaLayer::killService(const QString &serviceName)\n{\n    QAndroidJniObject jserviceName = QAndroidJniObject::fromString(serviceName.toUtf8());\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"(Ljava/lang/String;)Z\", jserviceName.object<jstring>());\n    return res;\n}\n\nbool AsemanJavaLayer::startQtService()\n{\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"()Z\" );\n    return res;\n}\n\nbool AsemanJavaLayer::stopQtService()\n{\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"()Z\" );\n    return res;\n}\n\nint AsemanJavaLayer::densityDpi()\n{\n    jint res = p->object.callMethod<jint>(__FUNCTION__, \"()I\" );\n    return res;\n}\n\nint AsemanJavaLayer::screenSizeWidth()\n{\n    jint res = p->object.callMethod<jint>(__FUNCTION__, \"()I\" );\n    return res;\n}\n\nint AsemanJavaLayer::screenSizeHeight()\n{\n    jint res = p->object.callMethod<jint>(__FUNCTION__, \"()I\" );\n    return res;\n}\n\nint AsemanJavaLayer::getSizeName()\n{\n    jint res = p->object.callMethod<jint>(__FUNCTION__, \"()I\" );\n    return res;\n}\n\nint AsemanJavaLayer::statusBarHeight()\n{\n    jint res = p->object.callMethod<jint>(__FUNCTION__, \"()I\" );\n    return res;\n}\n\nint AsemanJavaLayer::navigationBarHeight()\n{\n    jint res = p->object.callMethod<jint>(__FUNCTION__, \"()I\" );\n    return res;\n}\n\nbool AsemanJavaLayer::isTablet()\n{\n    jboolean res = p->object.callMethod<jboolean>(__FUNCTION__, \"()Z\");\n    return res;\n}\n\nqreal AsemanJavaLayer::density()\n{\n    jfloat res = p->object.callMethod<jfloat>(__FUNCTION__, \"()F\" );\n    return res;\n}\n\nQString AsemanJavaLayer::packageName()\n{\n    QString res = p->object.callObjectMethod(__FUNCTION__, \"()Ljava/lang/String;\" ).toString();\n    return res;\n}\n\nQString AsemanJavaLayer::deviceName()\n{\n    QString res = p->object.callObjectMethod(__FUNCTION__, \"()Ljava/lang/String;\" ).toString();\n    return res;\n}\n\nQString AsemanJavaLayer::deviceId()\n{\n    QString res = p->object.callObjectMethod(__FUNCTION__, \"()Ljava/lang/String;\" ).toString();\n    return res;\n}\n\nQRect AsemanJavaLayer::keyboardRect()\n{\n    jint jheight = p->object.callMethod<jfloat>(\"menuHeight\", \"()I\" );\n    int menuheight = jheight;\n\n    const QList<QScreen*> & screens = QGuiApplication::screens();\n    if( screens.isEmpty() )\n        return QRect();\n\n    QScreen *screen = screens.first();\n    QRect rect = screen->availableGeometry();\n    QRect geom = screen->geometry();\n\n    rect.moveTop(rect.top() + menuheight);\n    geom.setTop(geom.top() + menuheight);\n\n    QRect final;\n\n    if (rect != geom)\n    {\n        int ftop, fleft, fwidth, fheight;\n\n        geom.getRect(&fleft, &ftop, &fwidth, &fheight);\n\n        if (rect.top() != ftop)\n            fheight = rect.top();\n        else if (rect.left() != fleft)\n            fwidth = rect.left();\n        else if (rect.height() != fheight)\n            ftop = rect.height();\n        else if (rect.width() != fwidth)\n            fleft = rect.width();\n\n        final = QRect(fleft, ftop, fwidth - fleft, fheight - ftop);\n    }\n\n    return final;\n}\n\nQString AsemanJavaLayer::getLastImages(qint32 offset, qint32 count)\n{\n    jint joffset = offset;\n    jint jcount = count;\n    QString res = p->object.callObjectMethod(__FUNCTION__, \"(II)Ljava/lang/String;\", joffset, jcount).toString();\n    return res;\n}\n\nQString AsemanJavaLayer::getContactList()\n{\n    QString res = p->object.callObjectMethod(__FUNCTION__, \"()Ljava/lang/String;\").toString();\n    return res;\n}\n\nvoid AsemanJavaLayer::setKeepScreenOn(bool stt)\n{\n    jboolean jstt = stt;\n    p->object.callMethod<jboolean>(__FUNCTION__, \"(Z)V\", jstt );\n}\n\nvoid AsemanJavaLayer::reloadBuffer()\n{\n    load_buffer();\n}\n\nbool AsemanJavaLayer::setTransparentNavigationBar(bool stt)\n{\n    jboolean jstt = stt;\n    return p->object.callMethod<jboolean>(__FUNCTION__, \"(Z)Z\", jstt );\n}\n\nbool AsemanJavaLayer::setTransparentStatusBar(bool stt)\n{\n    jboolean jstt = stt;\n    return p->object.callMethod<jboolean>(__FUNCTION__, \"(Z)Z\", jstt );\\\n}\n\nvoid AsemanJavaLayer::load_buffer()\n{\n    while( !java_layer_inc_share_buffer.isEmpty() )\n    {\n        const QPair<QString,QString> & pair = java_layer_inc_share_buffer.takeFirst();\n        Q_EMIT incomingShare( pair.first, pair.second );\n    }\n    while( !java_layer_inc_deeplinks_buffer.isEmpty() )\n    {\n        const auto & link = java_layer_inc_deeplinks_buffer.takeFirst();\n        Q_EMIT deepLinkReceived(link);\n    }\n}\n\nvoid AsemanJavaLayer::setImplemented(bool stt)\n{\n    jboolean jstt = stt;\n    p->object.callMethod<jboolean>(__FUNCTION__, \"(Z)Z\", jstt );\n}\n\nAsemanJavaLayer::~AsemanJavaLayer()\n{\n    java_layers_objects.remove(this);\n    delete p;\n}\n\nstatic void noteRecieved( JNIEnv *env, jobject obj ,jstring title, jstring msg )\n{\n    Q_UNUSED(obj)\n    jboolean a;\n    jboolean b;\n    const char *t = env->GetStringUTFChars(title,&a);\n    const char *m = env->GetStringUTFChars(msg,&b);\n\n    for(AsemanJavaLayer *sjl: java_layers_objects)\n        Q_EMIT sjl->incomingShare( QString(t), QString(m) );\n\n    if( java_layers_objects.isEmpty() )\n        java_layer_inc_share_buffer << QPair<QString,QString>( QString(t), QString(m) );\n}\n\nstatic void deepLinkReceived( JNIEnv *env, jobject obj ,jstring link)\n{\n    Q_UNUSED(obj)\n    jboolean a;\n    const char *l = env->GetStringUTFChars(link,&a);\n\n    for(AsemanJavaLayer *sjl: java_layers_objects)\n        Q_EMIT sjl->deepLinkReceived(QString(l));\n\n    if( java_layers_objects.isEmpty() )\n        java_layer_inc_deeplinks_buffer << QString(l);\n}\n\nstatic void imageRecieved( JNIEnv *env, jobject obj ,jstring jpath )\n{\n    Q_UNUSED(obj)\n    jboolean a;\n    const char *p = env->GetStringUTFChars(jpath,&a);\n\n    QString path = QString(\"/sdcard/Aseman/%1.jpeg\").arg(QDateTime::currentDateTime().toMSecsSinceEpoch());\n    QFile().rename(QString(p),path);\n\n    for(AsemanJavaLayer *sjl: java_layers_objects)\n        Q_EMIT sjl->incomingImage(path);\n\n    if( java_layers_objects.isEmpty() )\n        java_layer_inc_image_buffer << path;\n}\n\nstatic void selectImageResult( JNIEnv *env, jobject obj ,jstring path )\n{\n    Q_UNUSED(obj)\n    jboolean a;\n    const char *p = env->GetStringUTFChars(path,&a);\n\n    for(AsemanJavaLayer *sjl: java_layers_objects)\n        Q_EMIT sjl->selectImageResult( QString(p) );\n}\n\nstatic void activityPaused( JNIEnv *env, jobject obj )\n{\n    Q_UNUSED(env)\n    Q_UNUSED(obj)\n    for(AsemanJavaLayer *sjl: java_layers_objects)\n        Q_EMIT sjl->activityPaused();\n}\n\nstatic void activityStopped( JNIEnv *env, jobject obj )\n{\n    Q_UNUSED(env)\n    Q_UNUSED(obj)\n    for(AsemanJavaLayer *sjl: java_layers_objects)\n        Q_EMIT sjl->activityStopped();\n}\n\nstatic void activityResumed( JNIEnv *env, jobject obj )\n{\n    Q_UNUSED(env)\n    Q_UNUSED(obj)\n    for(AsemanJavaLayer *sjl: java_layers_objects)\n        Q_EMIT sjl->activityResumed();\n}\n\nstatic void activityStarted( JNIEnv *env, jobject obj )\n{\n    Q_UNUSED(env)\n    Q_UNUSED(obj)\n    for(AsemanJavaLayer *sjl: java_layers_objects)\n        Q_EMIT sjl->activityStarted();\n}\n\nstatic void activityRestarted( JNIEnv *env, jobject obj )\n{\n    Q_UNUSED(env)\n    Q_UNUSED(obj)\n    for(AsemanJavaLayer *sjl: java_layers_objects)\n        Q_EMIT sjl->activityRestarted();\n}\n\nstatic void activityDestroyed( JNIEnv *env, jobject obj )\n{\n    Q_UNUSED(env)\n    Q_UNUSED(obj)\n    for(AsemanJavaLayer *sjl: java_layers_objects)\n        Q_EMIT sjl->activityDestroyed();\n}\n\nstatic void keyboardVisiblityChanged( JNIEnv *env, jobject obj, jint height )\n{\n    Q_UNUSED(env)\n    Q_UNUSED(obj)\n    for(AsemanJavaLayer *sjl: java_layers_objects)\n        Q_EMIT sjl->keyboardVisiblityChanged(height);\n}\n\nbool aseman_jlayer_registerNativeMethods() {\n    if(aseman_jlayer_native_methods_registered)\n        return true;\n\n    JNINativeMethod methods[] {{\"_sendNote\", \"(Ljava/lang/String;Ljava/lang/String;)V\", reinterpret_cast<void *>(noteRecieved)},\n                               {\"_sendImage\", \"(Ljava/lang/String;)V\", reinterpret_cast<void *>(imageRecieved)},\n                               {\"_sendDeepLink\", \"(Ljava/lang/String;)V\", reinterpret_cast<void *>(deepLinkReceived)},\n                               {\"_selectImageResult\", \"(Ljava/lang/String;)V\", reinterpret_cast<void *>(selectImageResult)},\n                               {\"_activityPaused\", \"()V\", reinterpret_cast<void *>(activityPaused)},\n                               {\"_activityStopped\", \"()V\", reinterpret_cast<void *>(activityStopped)},\n                               {\"_activityResumed\", \"()V\", reinterpret_cast<void *>(activityResumed)},\n                               {\"_activityStarted\", \"()V\", reinterpret_cast<void *>(activityStarted)},\n                               {\"_activityRestarted\", \"()V\", reinterpret_cast<void *>(activityRestarted)},\n                               {\"_activityDestroyed\", \"()V\", reinterpret_cast<void *>(activityDestroyed)},\n                               {\"_keyboardVisiblityChanged\", \"(I)V\", reinterpret_cast<void *>(keyboardVisiblityChanged)}};\n\n    QAndroidJniObject javaClass(\"io/aseman/android/AsemanJavaLayer\");\n    QAndroidJniEnvironment env;\n    jclass objectClass = env->GetObjectClass(javaClass.object<jobject>());\n\n    env->RegisterNatives(objectClass, methods, sizeof(methods) / sizeof(methods[0]));\n\n    env->DeleteLocalRef(objectClass);\n    return true;\n}\n"
  },
  {
    "path": "src/gui/asemanjavalayer.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANJAVALAYER_H\n#define ASEMANJAVALAYER_H\n\n#include <QObject>\n\n#include \"asemancore_global.h\"\n\nclass AsemanJavaLayerPrivate;\nclass LIBQTASEMAN_CORE_EXPORT AsemanJavaLayer : public QObject\n{\n    Q_OBJECT\n    Q_ENUMS(ImportanceTypes)\n\npublic:\n    AsemanJavaLayer();\n    virtual ~AsemanJavaLayer();\n\n    enum ImportanceTypes {\n        ImportanceDefault = 3,\n        ImportanceHigh = 4,\n        ImportanceLow = 2,\n        ImportanceMax = 5,\n        ImportanceMin = 1,\n        ImportanceNone = 0,\n    };\n\n    static AsemanJavaLayer *instance();\n\n    bool sharePaper( const QString & title, const QString & msg );\n    bool shareFile( const QString & path, const QString & type );\n    bool openFile( const QString & path, const QString & type );\n    bool startCamera( const QString & output );\n    bool callNumber( const QString & number );\n    bool getOpenPictures();\n\n    bool transparentStatusBar();\n    bool setTransparentStatusBar(bool stt);\n\n    bool transparentNavigationBar();\n    bool setTransparentNavigationBar(bool stt);\n\n    int densityDpi();\n    int screenSizeWidth();\n    int screenSizeHeight();\n    int getSizeName();\n    int statusBarHeight();\n    int navigationBarHeight();\n    bool isTablet();\n    qreal density();\n\n    QString packageName();\n    QString deviceName();\n    QString deviceId();\n\n    QRect keyboardRect();\n\n    QString getLastImages(qint32 offset, qint32 count);\n    QString getContactList();\n\n    void setKeepScreenOn(bool stt);\n\npublic Q_SLOTS:\n    void reloadBuffer();\n    bool startService();\n    bool stopService();\n    bool killService(const QString &serviceName);\n\n    bool startQtService();\n    bool stopQtService();\n\n    bool startForeground(qint32 id, const QString &title, const QString &msg, const QString &iconPath, const QString &icon, const QString &channelId);\n    bool stopForeground(bool removeNotification);\n    bool startNotification(qint32 id, const QString &title, const QString &msg, const QString &iconPath, const QString &icon, const QString &channelId, bool sound = false, bool vibrate = false);\n    bool stopNotification(qint32 id);\n    QString createNotificationChannel(const QString &channelId ,const QString &channelName, int importance = ImportanceLow);\n\nQ_SIGNALS:\n    void incomingShare( const QString & title, const QString & msg );\n    void incomingImage( const QString & path );\n    void deepLinkReceived(const QString &link);\n    void selectImageResult( const QString & path );\n    void keyboardVisiblityChanged(qint32 height);\n    void activityPaused();\n    void activityStopped();\n    void activityResumed();\n    void activityStarted();\n    void activityRestarted();\n    void activityDestroyed();\n\nprivate Q_SLOTS:\n    void load_buffer();\n    void registerObject();\n\nprotected:\n    void setImplemented(bool stt);\n\nprivate:\n    AsemanJavaLayerPrivate *p;\n};\n\ntypedef AsemanJavaLayer QAsemanJavaLayer;\n\n#endif // ASEMANJAVALAYER_H\n"
  },
  {
    "path": "src/gui/asemankeyhandler.cpp",
    "content": "#include \"asemankeyhandler.h\"\n\n#include <QEvent>\n#include <QKeyEvent>\n#include <QDebug>\n#include <QTimer>\n#include <QPointer>\n\nclass AsemanKeyHandler::Private\n{\npublic:\n    QPointer<QObject> window;\n    qint32 key;\n    qint32 scanCode;\n    qint32 modifiers;\n};\n\nAsemanKeyHandler::AsemanKeyHandler(QObject *parent) :\n    QObject(parent)\n{\n    p = new Private;\n    p->key = 0;\n    p->scanCode = 0;\n    p->modifiers = static_cast<qint32>(Qt::NoModifier);\n}\n\nvoid AsemanKeyHandler::setWindow(QObject *window)\n{\n    if(p->window == window)\n        return;\n\n    if(p->window)\n        p->window->removeEventFilter(this);\n    p->window = window;\n    if(p->window)\n        p->window->installEventFilter(this);\n\n    Q_EMIT windowChanged();\n}\n\nQObject *AsemanKeyHandler::window() const\n{\n    return p->window;\n}\n\nqint32 AsemanKeyHandler::key() const\n{\n    return p->key;\n}\n\nvoid AsemanKeyHandler::setKey(qint32 key)\n{\n    if(p->key == key)\n        return;\n\n    p->key = key;\n    Q_EMIT keyChanged();\n}\n\nqint32 AsemanKeyHandler::modifiers() const\n{\n    return p->modifiers;\n}\n\nqint32 AsemanKeyHandler::scanCode() const\n{\n    return p->scanCode;\n}\n\nvoid AsemanKeyHandler::setScanCode(qint32 scanCode)\n{\n    if(p->scanCode == scanCode)\n        return;\n\n    p->scanCode = scanCode;\n    Q_EMIT scanCodeChanged();\n}\n\nvoid AsemanKeyHandler::setModifiers(qint32 modifiers)\n{\n    if(p->modifiers == modifiers)\n        return;\n\n    p->modifiers = modifiers;\n    Q_EMIT modifiersChanged();\n}\n\nbool AsemanKeyHandler::eventFilter(QObject *watched, QEvent *ev)\n{\n    if(watched != p->window)\n        return QObject::eventFilter(watched, ev);\n\n    switch(static_cast<int>(ev->type()))\n    {\n    case QEvent::ActivationChange:\n    {\n        setModifiers(0);\n        setKey(0);\n        setScanCode(0);\n    }\n        break;\n\n    case QEvent::KeyPress:\n    {\n        QKeyEvent *e = static_cast<QKeyEvent*>(ev);\n        if(e->isAutoRepeat())\n            return QObject::eventFilter(watched, ev);\n\n        qint32 key = e->key();\n        quint32 scanCode = e->nativeScanCode();\n        switch (key) {\n        case Qt::Key_Shift:\n        case Qt::Key_Control:\n        case Qt::Key_Meta:\n            key = 0;\n            scanCode = 0;\n            break;\n        }\n\n        setKey(key);\n        setScanCode(static_cast<qint32>(scanCode));\n        setModifiers(static_cast<int>(e->modifiers()));\n        Q_EMIT pressed(static_cast<int>(e->modifiers()), key, static_cast<qint32>(scanCode));\n    }\n        break;\n\n    case QEvent::KeyRelease: {\n        QKeyEvent *e = static_cast<QKeyEvent*>(ev);\n        if(e->isAutoRepeat())\n            return QObject::eventFilter(watched, ev);\n\n        qint32 key = e->key();\n        quint32 scanCode = e->nativeScanCode();\n        switch (key) {\n        case Qt::Key_Shift:\n        case Qt::Key_Control:\n        case Qt::Key_Meta:\n            key = 0;\n            scanCode = 0;\n            break;\n        }\n        if(key == p->key) {\n            setKey(0);\n            setScanCode(0);\n        }\n\n        setModifiers(static_cast<int>(e->modifiers()));\n        Q_EMIT released(static_cast<int>(e->modifiers()), key, static_cast<qint32>(scanCode));\n    }\n        break;\n    }\n\n    return QObject::eventFilter(watched, ev);\n}\n\nAsemanKeyHandler::~AsemanKeyHandler()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/gui/asemankeyhandler.h",
    "content": "#ifndef ASEMANKEYHANDLER_H\n#define ASEMANKEYHANDLER_H\n\n#include <QObject>\n#include <QWindow>\n\n#include \"asemangui_global.h\"\n\nclass LIBQTASEMAN_GUI_EXPORT AsemanKeyHandler : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QObject* window READ window WRITE setWindow NOTIFY windowChanged)\n    Q_PROPERTY(qint32 modifiers READ modifiers NOTIFY modifiersChanged)\n    Q_PROPERTY(qint32 scanCode READ scanCode WRITE setScanCode NOTIFY scanCodeChanged)\n    Q_PROPERTY(qint32 key READ key WRITE setKey NOTIFY keyChanged)\n\n    class Private;\n\npublic:\n    AsemanKeyHandler(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanKeyHandler();\n\n    void setWindow(QObject *window);\n    QObject *window() const;\n\n    qint32 key() const;\n    qint32 modifiers() const;\n\n    qint32 scanCode() const;\n    void setScanCode(qint32 scanCode);\n\nQ_SIGNALS:\n    void windowChanged();\n    void keyChanged();\n    void modifiersChanged();\n    void scanCodeChanged();\n\n    void pressed(qint32 modifiers, qint32 key, qint32 scanCode);\n    void released(qint32 modifiers, qint32 key, qint32 scanCode);\n\npublic Q_SLOTS:\n\nprotected:\n    bool eventFilter(QObject *watched, QEvent *event) Q_DECL_OVERRIDE;\n    void setKey(qint32 key);\n    void setModifiers(qint32 modifiers);\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanKeyHandler QAsemanKeyHandler;\n\n#endif // ASEMANKEYHANDLER_H\n"
  },
  {
    "path": "src/gui/asemanmacmanager.h",
    "content": "#ifndef MACMANAGER_H\n#define MACMANAGER_H\n\n#include <QGuiApplication>\n#include <QWindow>\n\nclass AsemanMacManager: public QObject\n{\n    Q_OBJECT\npublic:\n    class Private;\n\n    AsemanMacManager(QObject *parent = nullptr);\n    virtual ~AsemanMacManager();\n\n    static void removeTitlebarFromWindow(double r, double g, double b);\n\n    static bool hasBiometric();\n    static bool biometricCheck();\n\nQ_SIGNALS:\n    void deepLinkReceived(const QString &link);\n\nprivate:\n    Private *p;\n};\n#endif // MACMANAGER_H\n"
  },
  {
    "path": "src/gui/asemanmacmanager.mm",
    "content": "#include \"asemanmacmanager.h\"\n\n#include <QDebug>\n\n#ifdef NONBLOCK_BIOMETRIC_METHOD\n#include <QEventLoop>\n#else\n#include <QSemaphore>\n#endif\n\n#import <LocalAuthentication/LocalAuthentication.h>\n#include <Cocoa/Cocoa.h>\n\n@interface AppDelegate : NSObject<NSApplicationDelegate>\n@end\n\nclass AsemanMacManager::Private\n{\npublic:\n    AppDelegate *appDelegate;\n    static QSet<AsemanMacManager*> objects;\n};\nQSet<AsemanMacManager*> AsemanMacManager::Private::objects;\n\n@implementation AppDelegate\n\n- (void)application:(NSApplication *)application openURLs:(NSArray<NSURL *> *)urls {\n    for (NSURL *url in urls) {\n        // Handle the deep link URL here\n        QString str = QString::fromNSString(url.absoluteString);\n\n        for (auto o: AsemanMacManager::Private::objects)\n            QMetaObject::invokeMethod(o, \"deepLinkReceived\", Qt::QueuedConnection, Q_ARG(QString, str));\n\n        qDebug() << \"Received deep link:\" << str;\n    }\n}\n\n@end\n\nAsemanMacManager::AsemanMacManager(QObject *parent)\n    : QObject(parent)\n{\n    Private::objects.insert(this);\n\n    p = new Private;\n    p->appDelegate = [[AppDelegate alloc] init];\n    [[NSApplication sharedApplication] setDelegate:p->appDelegate];\n}\n\nAsemanMacManager::~AsemanMacManager()\n{\n    Private::objects.remove(this);\n    delete p;\n}\n\nvoid AsemanMacManager::removeTitlebarFromWindow(double r, double g, double b)\n{\n    QWindowList windows = QGuiApplication::allWindows();\n    QWindow* win = windows.first();\n    long winId = win->winId();\n\n    auto nativeView = reinterpret_cast<NSView *>(winId);\n    auto nativeWindow = [nativeView window];\n\n    nativeWindow.titlebarAppearsTransparent=YES;\n    nativeWindow.titleVisibility = NSWindowTitleHidden;\n\n    auto color = [NSColor colorWithRed:r green:g blue:b alpha:1.0f];\n    nativeWindow.backgroundColor = color;\n\n    [nativeWindow setStyleMask:[nativeWindow styleMask] | NSWindowTitleHidden];\n    [nativeWindow setTitlebarAppearsTransparent:YES];\n}\n\nbool AsemanMacManager::hasBiometric()\n{\n    LAContext *context = [[LAContext alloc] init];\n    NSError *error = nil;\n\n    if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {\n        return true;\n    } else {\n        return false;\n    }\n}\n\nbool AsemanMacManager::biometricCheck()\n{\n    LAContext *context = [[LAContext alloc] init];\n    NSError *error = nil;\n\n    if (![context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error])\n        return false;\n\n    auto res = new bool;\n#ifdef NONBLOCK_BIOMETRIC_METHOD\n    auto loop = new QEventLoop;\n#else\n    auto semaphore = new QSemaphore;\n#endif\n    [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics\n              localizedReason:@\"Authenticate with Touch ID\"\n                        reply:^(BOOL success, NSError *error) {\n        if (success) {\n            *res = true;\n        } else {\n            *res = false;\n        }\n#ifdef NONBLOCK_BIOMETRIC_METHOD\n        loop->exit();\n#else\n        semaphore->release(1);\n#endif\n    }];\n\n#ifdef NONBLOCK_BIOMETRIC_METHOD\n    loop->exec();\n    delete loop;\n#else\n    semaphore->acquire(1);\n    delete semaphore;\n#endif\n    auto r = *res;\n    delete res;\n    return r;\n}\n"
  },
  {
    "path": "src/gui/asemanmimeapps.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#define GLOBAL_APPS_PATH QStringLiteral(\"/usr/share/applications\")\n#define LOCAL_APPS_PATH QString(QDir::homePath() + QStringLiteral(\"/.local/share/applications\"))\n\n#include \"asemanmimeapps.h\"\n\n#include <QDir>\n#include <QHash>\n#include <QSettings>\n#if !defined(Q_OS_IOS) && !defined(Q_OS_WASM)\n#include <QProcess>\n#endif\n#include <QMimeDatabase>\n#include <QMimeType>\n#include <QFile>\n#include <QRegularExpression>\n#include <QDebug>\n#include <QRegularExpression>\n\nclass AsemanMimeAppsItem\n{\npublic:\n    QString name;\n    QString icon;\n    QString genericName;\n    QString comment;\n    QString path;\n    QString command;\n    QStringList mimes;\n};\n\nQMultiHash<QString,QString> mime_apps_apps;\nQHash<QString,AsemanMimeAppsItem> mime_apps_items;\n\nQStringList filesOf( const QString & path )\n{\n    QStringList res;\n\n    const QStringList & dirs = QDir(path).entryList(QDir::Dirs | QDir::NoDotAndDotDot);\n    for( const QString &d: dirs)\n        res << filesOf( path + \"/\" + d );\n\n    const QStringList & files = QDir(path).entryList(QStringList()<<QStringLiteral(\"*.desktop\"),QDir::Files);\n    for(const QString &f: files)\n        res << path + QStringLiteral(\"/\") + f;\n\n    return res;\n}\n\nQHash<QString,QString> readConfFile( const QString & file )\n{\n    QHash<QString,QString> res;\n\n    QFile f(file);\n    if( !f.open(QFile::ReadOnly) )\n        return res;\n\n    const QString & data = QString::fromUtf8(f.readAll());\n    f.close();\n\n    QRegularExpression mexr(QStringLiteral(\"\\\\[(.*)\\\\]\\\\s((?:\\\\s|.)*)\\\\s(?:\\\\[|$)\"));\n    auto i = mexr.globalMatch(data);\n    while (i.hasNext())\n    {\n        auto m = i.next();\n        const QString & section    = m.captured(1);\n        const QString & properties = m.captured(2);\n\n        QRegularExpression pexr(QStringLiteral(\"(?:\\\\r|\\\\n|^)(.*)\\\\=(.*)(?:\\\\r|\\\\n)\"));\n        auto pi = pexr.globalMatch(properties);\n        while (pi.hasNext())\n        {\n            auto pm = pi.next();\n            const QString & key   = pm.captured(1);\n            const QString & value = pm.captured(2);\n\n            res[ section + \"/\" + key ] = value;\n        }\n    }\n\n    return res;\n}\n\nvoid init_mimeApps()\n{\n    if( !mime_apps_items.isEmpty() )\n        return;\n\n    QStringList desktops;\n    desktops << filesOf(GLOBAL_APPS_PATH);\n    desktops << filesOf(LOCAL_APPS_PATH);\n\n    for(const QString &d: desktops)\n    {\n        const QHash<QString,QString> & conf = readConfFile(d);\n\n        AsemanMimeAppsItem item;\n        item.name        = conf.value(QStringLiteral(\"Desktop Entry/Name\"));\n        item.icon        = conf.value(QStringLiteral(\"Desktop Entry/Icon\"));\n        item.genericName = conf.value(QStringLiteral(\"Desktop Entry/GenericName\"));\n        item.comment     = conf.value(QStringLiteral(\"Desktop Entry/Comment\"));\n        item.path        = conf.value(QStringLiteral(\"Desktop Entry/Path\"));\n        item.command     = conf.value(QStringLiteral(\"Desktop Entry/Exec\"));\n        item.mimes       = conf.value(QStringLiteral(\"Desktop Entry/MimeType\")).split(QRegularExpression(QStringLiteral(\"(\\\\;|\\\\:)\")),Qt::SkipEmptyParts);\n\n        for(const QString &m: item.mimes)\n        {\n            mime_apps_apps.insert( m.toLower(), d );\n            mime_apps_items.insert( d, item );\n        }\n    }\n}\n\nclass AsemanMimeAppsPrivate\n{\npublic:\n    QMimeDatabase mdb;\n};\n\nAsemanMimeApps::AsemanMimeApps(QObject *parent) :\n    QObject(parent)\n{\n    init_mimeApps();\n\n    p = new AsemanMimeAppsPrivate;\n}\n\nQStringList AsemanMimeApps::appsOfMime(const QString &mime)\n{\n    return mime_apps_apps.values(mime.toLower());\n}\n\nQStringList AsemanMimeApps::appsOfFile(const QString &file)\n{\n    const QMimeType & type = p->mdb.mimeTypeForFile(file);\n    return appsOfMime(type.name());\n}\n\nQString AsemanMimeApps::appName(const QString &app) const\n{\n    return mime_apps_items.value(app).name;\n}\n\nQString AsemanMimeApps::appIcon(const QString &app) const\n{\n    return mime_apps_items.value(app).icon;\n}\n\nQString AsemanMimeApps::appGenericName(const QString &app) const\n{\n    return mime_apps_items.value(app).genericName;\n}\n\nQString AsemanMimeApps::appComment(const QString &app) const\n{\n    return mime_apps_items.value(app).comment;\n}\n\nQString AsemanMimeApps::appPath(const QString &app) const\n{\n    return mime_apps_items.value(app).path;\n}\n\nQString AsemanMimeApps::appCommand(const QString &app) const\n{\n    return mime_apps_items.value(app).command;\n}\n\nQStringList AsemanMimeApps::appMimes(const QString &app) const\n{\n    return mime_apps_items.value(app).mimes;\n}\n\nvoid AsemanMimeApps::openFiles(const QString &app, const QStringList &files)\n{\n    if( !mime_apps_items.contains(app) )\n        return;\n\n#if defined(Q_OS_IOS) || defined(Q_OS_WASM)\n    Q_UNUSED(files)\n#else\n    const AsemanMimeAppsItem & item = mime_apps_items.value(app);\n\n    QString cmd;\n    QStringList args;\n\n    const QStringList & command_splits = item.command.split(QStringLiteral(\" \"),Qt::SkipEmptyParts);\n\n    cmd = command_splits.first();\n    args = command_splits.mid(1);\n\n    if( args.contains(QStringLiteral(\"%u\")) )\n    {\n        int index = args.indexOf(QStringLiteral(\"%u\"));\n        for(const QString &f: files)\n        {\n            QStringList targs = args;\n            targs.replace(index,f);\n\n            QProcess::startDetached( cmd, targs );\n        }\n    }\n    else\n    if( args.contains(QStringLiteral(\"%U\")) )\n    {\n        int index = args.indexOf(QStringLiteral(\"%U\"));\n        QStringList targs = args;\n        targs.removeAt(index);\n\n        for(const QString &f: files)\n            targs.insert(index,f);\n\n        QProcess::startDetached( cmd, targs );\n    }\n    else\n    if( args.contains(QStringLiteral(\"%f\")) )\n    {\n        int index = args.indexOf(QStringLiteral(\"%f\"));\n        for(const QString &f: files)\n        {\n            QStringList targs = args;\n            targs.replace(index,f);\n\n            QProcess::startDetached( cmd, targs );\n        }\n    }\n    else\n    if( args.contains(QStringLiteral(\"%F\")) )\n    {\n        int index = args.indexOf(QStringLiteral(\"%F\"));\n        QStringList targs = args;\n        targs.removeAt(index);\n\n        for(const QString &f: files)\n            targs.insert(index,f);\n\n        QProcess::startDetached( cmd, targs );\n    }\n    else\n    {\n        for(const QString &f: files)\n        {\n            QStringList targs = args;\n            targs.append(f);\n\n            QProcess::startDetached( cmd, targs );\n        }\n    }\n#endif\n}\n\nAsemanMimeApps::~AsemanMimeApps()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/gui/asemanmimeapps.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANMIMEAPPS_H\n#define ASEMANMIMEAPPS_H\n\n#include <QObject>\n#include <QStringList>\n\n#include \"asemangui_global.h\"\n\nclass AsemanMimeAppsPrivate;\nclass LIBQTASEMAN_GUI_EXPORT AsemanMimeApps : public QObject\n{\n    Q_OBJECT\npublic:\n    AsemanMimeApps( QObject *parent = Q_NULLPTR );\n    virtual ~AsemanMimeApps();\n\n    Q_INVOKABLE QStringList appsOfMime( const QString & mime );\n    Q_INVOKABLE QStringList appsOfFile( const QString & file );\n\n    Q_INVOKABLE QString appName( const QString & app ) const;\n    Q_INVOKABLE QString appIcon( const QString & app ) const;\n    Q_INVOKABLE QString appGenericName( const QString & app ) const;\n    Q_INVOKABLE QString appComment( const QString & app ) const;\n    Q_INVOKABLE QString appPath( const QString & app ) const;\n    Q_INVOKABLE QString appCommand( const QString & app ) const;\n    Q_INVOKABLE QStringList appMimes( const QString & app ) const;\n\npublic Q_SLOTS:\n    void openFiles( const QString & app, const QStringList & files );\n\nprivate:\n    AsemanMimeAppsPrivate *p;\n};\n\ntypedef AsemanMimeApps QAsemanMimeApps;\n\n#endif // ASEMANMIMEAPPS_H\n"
  },
  {
    "path": "src/gui/asemanmimedata.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanmimedata.h\"\n\n#include <QClipboard>\n#include <QDataStream>\n#include <QGuiApplication>\n#include <QIODevice>\n#include <QMimeData>\n\nclass AsemanMimeDataPrivate\n{\npublic:\n    QString text;\n    QString html;\n    QList<QUrl> urls;\n    QVariantMap dataMap;\n};\n\nAsemanMimeData::AsemanMimeData(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanMimeDataPrivate;\n}\n\nvoid AsemanMimeData::setText(const QString &txt)\n{\n    if(p->text == txt)\n        return;\n\n    p->text = txt;\n    Q_EMIT textChanged();\n}\n\nQString AsemanMimeData::text() const\n{\n    return p->text;\n}\n\nvoid AsemanMimeData::setHtml(const QString &html)\n{\n    if(p->html == html)\n        return;\n\n    p->html = html;\n    Q_EMIT htmlChanged();\n}\n\nQString AsemanMimeData::html() const\n{\n    return p->html;\n}\n\nvoid AsemanMimeData::setUrls(const QList<QUrl> &urls)\n{\n    if(p->urls == urls)\n        return;\n\n    p->urls = urls;\n    Q_EMIT urlsChanged();\n}\n\nQList<QUrl> AsemanMimeData::urls() const\n{\n    return p->urls;\n}\n\nvoid AsemanMimeData::setDataMap(const QVariantMap &map)\n{\n    if(p->dataMap == map)\n        return;\n\n    p->dataMap = map;\n    Q_EMIT dataMapChanged();\n}\n\nQVariantMap AsemanMimeData::dataMap() const\n{\n    return p->dataMap;\n}\n\nQStringList AsemanMimeData::formats() const\n{\n    return p->dataMap.keys();\n}\n\nvoid AsemanMimeData::fetchClipboard()\n{\n    QClipboard *clipboard = QGuiApplication::clipboard();\n    if(!clipboard) return;\n    const QMimeData *mime = clipboard->mimeData();\n    if(!mime) return;\n\n    setUrls(mime->urls());\n    setText(mime->text());\n    setHtml(mime->html());\n\n    QVariantMap data;\n    for(const QString &format: mime->formats())\n    {\n        QVariant var;\n        QByteArray bytes = mime->data(format);\n        QDataStream stream(&bytes, QIODevice::ReadOnly);\n        stream >> var;\n\n        data[format] = var;\n    }\n    setDataMap(data);\n}\n\nQString AsemanMimeData::getDataAsString(const QString &type)\n{\n    return p->dataMap.value(type).toString();\n}\n\nAsemanMimeData::~AsemanMimeData()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/gui/asemanmimedata.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANMIMEDATA_H\n#define ASEMANMIMEDATA_H\n\n#include <QObject>\n#include <QUrl>\n#include <QVariantMap>\n\n#include \"asemangui_global.h\"\n\nclass AsemanMimeDataPrivate;\nclass LIBQTASEMAN_GUI_EXPORT AsemanMimeData : public QObject\n{\n    Q_OBJECT\n\n    Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)\n    Q_PROPERTY(QString html READ html WRITE setHtml NOTIFY htmlChanged)\n    Q_PROPERTY(QList<QUrl> urls READ urls WRITE setUrls NOTIFY urlsChanged)\n    Q_PROPERTY(QVariantMap dataMap READ dataMap WRITE setDataMap NOTIFY dataMapChanged)\n    Q_PROPERTY(QStringList formats READ formats NOTIFY dataMapChanged)\n\npublic:\n    AsemanMimeData(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanMimeData();\n\n    void setText(const QString &txt);\n    QString text() const;\n\n    void setHtml(const QString &html);\n    QString html() const;\n\n    void setUrls(const QList<QUrl> &urls);\n    QList<QUrl> urls() const;\n\n    void setDataMap(const QVariantMap &map);\n    QVariantMap dataMap() const;\n    QStringList formats() const;\n\npublic Q_SLOTS:\n    void fetchClipboard();\n    QString getDataAsString(const QString &type);\n\nQ_SIGNALS:\n    void textChanged();\n    void htmlChanged();\n    void urlsChanged();\n    void dataMapChanged();\n\nprivate:\n    AsemanMimeDataPrivate *p;\n};\n\ntypedef AsemanMimeData QAsemanMimeData;\n\nQ_DECLARE_METATYPE(AsemanMimeData*)\n\n#endif // ASEMANMIMEDATA_H\n"
  },
  {
    "path": "src/gui/asemanobjectiveclayer.h",
    "content": "#ifndef ASEMANOBJECTIVECLAYER_H\n#define ASEMANOBJECTIVECLAYER_H\n\n#include <QString>\n#include <QVariantList>\n#include <QObject>\n\n#include <functional>\n\nclass AsemanObjectiveCLayer: public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(qreal keyboardHeight READ keyboardHeight WRITE setKeyboardHeight NOTIFY keyboardHeightChanged)\n\npublic:\n    class Private;\n\n    AsemanObjectiveCLayer(QObject *parent = nullptr);\n    virtual ~AsemanObjectiveCLayer();\n\n    static qreal statusBarHeight();\n    static qreal navigationBarHeight();\n    static bool saveToCameraRoll(const QString &filePath);\n    static void getContactList(std::function<void(const QVariantList &res)> asyncCallback = Q_NULLPTR);\n    static void sharePaper(const QString &text);\n    static QString deviceId();\n    static bool openUrlInSafari(const QString &str);\n    static void triggerVibrateFeedback();\n\n    static bool hasBiometric();\n    static bool biometricCheck();\n\n    qreal keyboardHeight() const;\n    void setKeyboardHeight(const qreal &keyboardHeight);\n\nQ_SIGNALS:\n    void keyboardHeightChanged();\n    void deepLinkReceived(const QString &link);\n\nprivate:\n    qreal mKeyboardHeight = 0;\n    Private *p;\n};\n\ntypedef AsemanObjectiveCLayer QAsemanObjectiveCLayer;\n\n#endif // ASEMANOBJECTIVECLAYER_H\n"
  },
  {
    "path": "src/gui/asemanobjectiveclayer.mm",
    "content": "#include \"asemanobjectiveclayer.h\"\n#include \"asemantools.h\"\n\n#import <UIKit/UIKit.h>\n#import <SafariServices/SafariServices.h>\n#import <Foundation/Foundation.h>\n#import <LocalAuthentication/LocalAuthentication.h>\n\n#ifndef DISABLE_IOS_CONTACTS_SUPPORT\n#import <Contacts/Contacts.h>\n#endif\n\n#include <QSet>\n#include <QUrl>\n#include <QDesktopServices>\n#include <QDebug>\n#include <QTimer>\n\n#include <QEventLoop>\n#ifndef NONBLOCK_BIOMETRIC_METHOD\n#include <QSemaphore>\n#endif\n\nQSet<AsemanObjectiveCLayer*> ObjectiveCLayer_mObjects;\n\n@interface AsemanObjectiveCLayer_core : NSObject;\n@end\n\n@implementation AsemanObjectiveCLayer_core\n\n#pragma mark - Methods\n\n- (void)keyboardWillShow:(NSNotification *)notification\n{\n    CGFloat height = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;\n    for (auto o: ObjectiveCLayer_mObjects)\n        o->setKeyboardHeight(height);\n}\n\n@end\n\n\n\n@interface AppDelegate : UIResponder <UIApplicationDelegate>\n@end\n\nclass AsemanObjectiveCLayer::Private\n{\npublic:\n    AppDelegate *appDelegate;\n};\n\n@implementation AppDelegate\n\n- (void)handleDeepLink:(NSURL *)deepLinkURL {\n    // Handle the deep link URL here\n\n    for (auto o: ObjectiveCLayer_mObjects) {\n        NSString *urlString = [deepLinkURL absoluteString];\n        auto str = QString::fromNSString(urlString);\n        QMetaObject::invokeMethod(o, \"deepLinkReceived\", Qt::QueuedConnection, Q_ARG(QString, str));\n    }\n}\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n    // Check if the app was launched from a deep link\n    NSURL *deepLinkURL = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];\n    if (deepLinkURL) {\n        [self handleDeepLink:deepLinkURL];\n    }\n\n    // Other code...\n\n    return YES;\n}\n\n- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {\n    // Handle the deep link\n    [self handleDeepLink:url];\n\n    // Return YES if the deep link was successfully handled, or NO otherwise\n    return YES;\n}\n\n@end\n\nAsemanObjectiveCLayer::AsemanObjectiveCLayer(QObject *parent)\n    : QObject(parent)\n{\n    ObjectiveCLayer_mObjects.insert(this);\n\n    p = new Private;\n    p->appDelegate = [[AppDelegate alloc] init];\n    [[UIApplication sharedApplication] setDelegate:p->appDelegate];\n\n    static AsemanObjectiveCLayer_core *core = [AsemanObjectiveCLayer_core alloc];\n\n    [[NSNotificationCenter defaultCenter] addObserver:core selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];\n}\n\nAsemanObjectiveCLayer::~AsemanObjectiveCLayer()\n{\n    ObjectiveCLayer_mObjects.remove(this);\n    delete p;\n}\n\nqreal AsemanObjectiveCLayer::statusBarHeight()\n{\n    CGFloat menuBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;\n    return menuBarHeight;\n}\n\nqreal AsemanObjectiveCLayer::navigationBarHeight()\n{\n    CGFloat navBarHeight = 0;\n    if (statusBarHeight() > 24)\n        return 22;\n    return navBarHeight;\n}\n\nbool AsemanObjectiveCLayer::saveToCameraRoll(const QString &filePath)\n{\n    auto path = AsemanTools::urlToLocalPath(filePath);\n\n    NSString *imagePath = path.toNSString();\n    UIImage *image = [[UIImage alloc] initWithContentsOfFile:imagePath];\n\n    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);\n    return true;\n}\n\nvoid AsemanObjectiveCLayer::getContactList(std::function<void(const QVariantList &res)> asyncCallback)\n{\n#ifndef DISABLE_IOS_CONTACTS_SUPPORT\n    CNContactStore *store = [[CNContactStore alloc] init];\n    [store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError * _Nullable) {\n        QMap<QString, QVariantList> sorted;\n        if (granted)\n        {\n            NSArray *keys = @[CNContactNamePrefixKey, CNContactFamilyNameKey, CNContactGivenNameKey, CNContactPhoneNumbersKey, CNContactImageDataKey, CNContactEmailAddressesKey];\n\n            NSString *containerId = store.defaultContainerIdentifier;\n            NSPredicate *predicate = [CNContact predicateForContactsInContainerWithIdentifier:containerId];\n            NSArray *cnContacts = [store unifiedContactsMatchingPredicate:predicate keysToFetch:keys error:nil];\n\n            for (CNContact *contact in cnContacts)\n            {\n                QString name = QString(QString::fromNSString(contact.givenName) + \" \" + QString::fromNSString(contact.familyName)).trimmed();\n                for (CNLabeledValue *label in contact.phoneNumbers)\n                {\n                    NSString *phone = [label.value stringValue];\n                    if ([phone length] > 0)\n                        sorted[name] << QVariantMap({{\"name\", name}, {\"phone\", QString::fromNSString(phone)}});\n                }\n            }\n        }\n\n        QVariantList result;\n        for (const auto &vals: sorted)\n            result << vals;\n        asyncCallback(result);\n    }];\n#else\n    asyncCallback(QVariantList());\n#endif\n}\n\nvoid AsemanObjectiveCLayer::sharePaper(const QString &text)\n{\n    UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController;\n    NSString *textToShare = text.toNSString();\n    UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[textToShare] applicationActivities:nil];\n    activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll]; //Exclude whichever aren't relevant\n            [controller presentViewController:activityVC animated:YES completion:nil];\n}\n\nQString AsemanObjectiveCLayer::deviceId()\n{\n    UIDevice *device = [UIDevice currentDevice];\n    NSString  *currentDeviceId = [[device identifierForVendor]UUIDString];\n    return QString::fromNSString(currentDeviceId);\n}\n\nbool AsemanObjectiveCLayer::openUrlInSafari(const QString &str)\n{\n    auto url = QUrl(str).toNSURL();\n\n    if ([SFSafariViewController class]) {\n\n        QEventLoop loop;\n\n        UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController;\n        SFSafariViewController *viewController = [[SFSafariViewController alloc] initWithURL:url];\n        [controller presentViewController:viewController animated:YES completion: nil];\n\n        auto t = new QTimer;\n        t->connect(t, &QTimer::timeout, [&](){\n            if (viewController.beingDismissed)\n                loop.exit();\n        });\n        t->start(100);\n\n        loop.exec();\n\n        delete t;\n        return true;\n    } else {\n        return false;\n    }\n}\n\nvoid AsemanObjectiveCLayer::triggerVibrateFeedback()\n{\n    // Create an instance of the feedback generator\n    auto generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleLight];\n\n    // Trigger the feedback\n    [generator impactOccurred];\n}\n\nqreal AsemanObjectiveCLayer::keyboardHeight() const\n{\n    return mKeyboardHeight;\n}\n\nvoid AsemanObjectiveCLayer::setKeyboardHeight(const qreal &keyboardHeight)\n{\n    if (mKeyboardHeight == keyboardHeight)\n        return;\n    mKeyboardHeight = keyboardHeight;\n    Q_EMIT keyboardHeightChanged();\n}\n\nbool AsemanObjectiveCLayer::hasBiometric()\n{\n    LAContext *context = [[LAContext alloc] init];\n    NSError *error = nil;\n\n    if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {\n        return true;\n    } else {\n        return false;\n    }\n}\n\nbool AsemanObjectiveCLayer::biometricCheck()\n{\n    LAContext *context = [[LAContext alloc] init];\n    NSError *error = nil;\n\n    if (![context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error])\n        return false;\n\n    auto res = new bool;\n#ifdef NONBLOCK_BIOMETRIC_METHOD\n    auto loop = new QEventLoop;\n#else\n    auto semaphore = new QSemaphore;\n#endif\n    [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics\n              localizedReason:@\"Authenticating\"\n                        reply:^(BOOL success, NSError *error) {\n        if (success) {\n            *res = true;\n        } else {\n            *res = false;\n        }\n#ifdef NONBLOCK_BIOMETRIC_METHOD\n        loop->exit();\n#else\n        semaphore->release(1);\n#endif\n    }];\n\n#ifdef NONBLOCK_BIOMETRIC_METHOD\n    loop->exec();\n    delete loop;\n#else\n    semaphore->acquire(1);\n    delete semaphore;\n#endif\n    auto r = *res;\n    delete res;\n    return r;\n}\n"
  },
  {
    "path": "src/gui/asemantexttools.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemantexttools.h\"\n#include \"asemantools.h\"\n\n#include <QTextDocument>\n\nclass AsemanTextToolsPrivate\n{\npublic:\n    QTextDocument *doc;\n};\n\nAsemanTextTools::AsemanTextTools(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanTextToolsPrivate;\n    p->doc = new QTextDocument(this);\n}\n\nqreal AsemanTextTools::htmlWidth(const QString &html)\n{\n    p->doc->setHtml(html);\n    return p->doc->size().width() + 10;\n}\n\nQt::LayoutDirection AsemanTextTools::directionOf(const QString &str)\n{\n    return AsemanTools::directionOf(str);\n}\n\nAsemanTextTools::~AsemanTextTools()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/gui/asemantexttools.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANTEXTTOOLS_H\n#define ASEMANTEXTTOOLS_H\n\n#include <QObject>\n\n#include \"asemangui_global.h\"\n\nclass AsemanTextToolsPrivate;\nclass LIBQTASEMAN_GUI_EXPORT AsemanTextTools : public QObject\n{\n    Q_OBJECT\npublic:\n    AsemanTextTools(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanTextTools();\n\npublic Q_SLOTS:\n    qreal htmlWidth(const QString &html);\n    static Qt::LayoutDirection directionOf( const QString & str );\n\nprivate:\n    AsemanTextToolsPrivate *p;\n};\n\ntypedef AsemanTextTools QAsemanTextTools;\n\n#endif // ASEMANTEXTTOOLS_H\n"
  },
  {
    "path": "src/gui/asemantitlebarcolorgrabber.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemantitlebarcolorgrabber.h\"\n\n#include <QScreen>\n#include <QPointer>\n#include <QTimer>\n#include <QDebug>\n#include <QGuiApplication>\n\nclass AsemanTitleBarColorGrabberPrivate\n{\npublic:\n    QPointer<QWindow> window;\n    QColor color;\n    QColor defaultColor;\n    bool autoRefresh;\n    int firstAttemps;\n\n    QTimer *normalTimer;\n    QTimer *activeTimer;\n};\n\nAsemanTitleBarColorGrabber::AsemanTitleBarColorGrabber(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanTitleBarColorGrabberPrivate;\n    p->firstAttemps = 0;\n    p->autoRefresh = false;\n\n    p->normalTimer = new QTimer(this);\n    p->normalTimer->setSingleShot(false);\n    p->normalTimer->setInterval(10000);\n\n    p->activeTimer = new QTimer(this);\n    p->activeTimer->setSingleShot(true);\n    p->activeTimer->setInterval(500);\n\n    connect(p->normalTimer, &QTimer::timeout, this, &AsemanTitleBarColorGrabber::refresh);\n    connect(p->activeTimer, &QTimer::timeout, this, &AsemanTitleBarColorGrabber::refresh);\n}\n\nvoid AsemanTitleBarColorGrabber::setWindow(QWindow *win)\n{\n    if(p->window == win)\n        return;\n    if(p->window)\n        disconnect(win, &QWindow::activeChanged, this, &AsemanTitleBarColorGrabber::activeChanged);\n\n    p->window = win;\n    if(p->window)\n        connect(win, &QWindow::activeChanged, this, &AsemanTitleBarColorGrabber::activeChanged);\n\n    Q_EMIT windowChanged();\n\n    p->color = QColor();\n    Q_EMIT colorChanged();\n\n    p->firstAttemps = 0;\n    refresh();\n}\n\nQWindow *AsemanTitleBarColorGrabber::window() const\n{\n    return p->window;\n}\n\nvoid AsemanTitleBarColorGrabber::setAutoRefresh(bool stt)\n{\n    if(p->autoRefresh == stt)\n        return;\n\n    p->autoRefresh = stt;\n    if(p->autoRefresh)\n        p->normalTimer->start();\n    else\n        p->normalTimer->stop();\n\n    Q_EMIT autoRefreshChanged();\n}\n\nbool AsemanTitleBarColorGrabber::autoRefresh() const\n{\n    return p->autoRefresh;\n}\n\nvoid AsemanTitleBarColorGrabber::setDefaultColor(const QColor &defaultColor)\n{\n    if(p->defaultColor == defaultColor)\n        return;\n\n    p->defaultColor = defaultColor;\n    Q_EMIT defaultColorChanged();\n    Q_EMIT colorChanged();\n}\n\nQColor AsemanTitleBarColorGrabber::defaultColor() const\n{\n    return p->defaultColor;\n}\n\nQColor AsemanTitleBarColorGrabber::color() const\n{\n    return p->color.isValid()? p->color : p->defaultColor;\n}\n\nvoid AsemanTitleBarColorGrabber::refresh()\n{\n    if(!p->window)\n    {\n        QColor color;\n        if(p->color == color)\n            return;\n\n        p->color = color;\n        Q_EMIT colorChanged();\n        return;\n    }\n    if(!p->window->isActive() || QGuiApplication::focusWindow() != p->window)\n    {\n        if(p->color == QColor())\n            QTimer::singleShot(100, this, SLOT(refresh()));\n\n        return;\n    }\n    p->firstAttemps++;\n    if(p->firstAttemps < 6)\n        QTimer::singleShot(300, this, SLOT(refresh()));\n\n    QImage img = p->window->screen()->grabWindow(0, p->window->x()+100, p->window->y()-4, 1, 1).toImage();\n    QColor color = img.pixel(0,0);\n    if(p->color == color)\n        return;\n\n    p->color = color;\n    Q_EMIT colorChanged();\n}\n\nvoid AsemanTitleBarColorGrabber::activeChanged()\n{\n    p->activeTimer->stop();\n    p->activeTimer->start();\n}\n\nAsemanTitleBarColorGrabber::~AsemanTitleBarColorGrabber()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/gui/asemantitlebarcolorgrabber.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANTITLEBARCOLORGRABBER_H\n#define ASEMANTITLEBARCOLORGRABBER_H\n\n#include <QObject>\n#include <QWindow>\n\n#include \"asemangui_global.h\"\n\nclass AsemanTitleBarColorGrabberPrivate;\nclass LIBQTASEMAN_GUI_EXPORT AsemanTitleBarColorGrabber : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QWindow* window READ window WRITE setWindow NOTIFY windowChanged)\n    Q_PROPERTY(bool autoRefresh READ autoRefresh WRITE setAutoRefresh NOTIFY autoRefreshChanged)\n    Q_PROPERTY(QColor defaultColor READ defaultColor WRITE setDefaultColor NOTIFY defaultColorChanged)\n    Q_PROPERTY(QColor color READ color NOTIFY colorChanged)\n\npublic:\n    AsemanTitleBarColorGrabber(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanTitleBarColorGrabber();\n\n    void setWindow(QWindow *win);\n    QWindow *window() const;\n\n    void setAutoRefresh(bool stt);\n    bool autoRefresh() const;\n\n    void setDefaultColor(const QColor &color);\n    QColor defaultColor() const;\n\n    QColor color() const;\n\npublic Q_SLOTS:\n    void refresh();\n\nQ_SIGNALS:\n    void windowChanged();\n    void colorChanged();\n    void autoRefreshChanged();\n    void defaultColorChanged();\n\nprivate Q_SLOTS:\n    void activeChanged();\n\nprivate:\n    AsemanTitleBarColorGrabberPrivate *p;\n};\n\ntypedef AsemanTitleBarColorGrabber QAsemanTitleBarColorGrabber;\n\n#endif // ASEMANTITLEBARCOLORGRABBER_H\n"
  },
  {
    "path": "src/gui/asemantools.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemantools.h\"\n#include \"asemandevices.h\"\n\n#include <QMetaMethod>\n#include <QMetaObject>\n#include <QCryptographicHash>\n#include <QCoreApplication>\n#include <QColor>\n#include <QTimer>\n#include <QFile>\n#include <QDebug>\n#include <QFileInfo>\n#include <QDir>\n#include <QStringList>\n#include <QTextDocument>\n#include <QRegularExpression>\n#if !defined(Q_OS_IOS) && !defined(Q_OS_WASM)\n#include <QProcess>\n#endif\n#include <QTimerEvent>\n#include <QUuid>\n#include <QMimeDatabase>\n#include <QImageReader>\n#include <QJsonDocument>\n#include <QThread>\n#include <QImageWriter>\n\n#ifndef Q_OS_WASM\n#include <QRegularExpression>\n#include <QRunnable>\n#include <QThreadPool>\n#endif\n\nclass AsemanToolsPrivate\n{\npublic:\n};\n\nAsemanTools::AsemanTools(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanToolsPrivate;\n}\n\nvoid AsemanTools::debug(const QVariant &var)\n{\n    qDebug() << var;\n}\n\nQDateTime AsemanTools::currentDate()\n{\n    return QDateTime::currentDateTime();\n}\n\nQString AsemanTools::dateToMSec(const QDateTime &dt)\n{\n    return QString::number(dt.toMSecsSinceEpoch());\n}\n\nQDateTime AsemanTools::mSecToDate(const QString &ms)\n{\n    return QDateTime::fromMSecsSinceEpoch(ms.toLongLong());\n}\n\nqint64 AsemanTools::dateToSec(const QDateTime &dt)\n{\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0))\n    return dt.toSecsSinceEpoch();\n#else\n   return dt.toMSecsSinceEpoch()/1000;\n#endif\n}\n\nQDateTime AsemanTools::dateFromSec(qint64 date)\n{\n    return QDateTime::fromSecsSinceEpoch(date);\n}\n\nQString AsemanTools::dateToString(const QDateTime &dt, const QString & format)\n{\n    if(format.isEmpty())\n        return dt.toString();\n    else\n        return dt.toString(format);\n}\n\nQDateTime AsemanTools::datefromString(const QString &dt, const QString &format)\n{\n    if(format.isEmpty())\n        return QDateTime::fromString(dt);\n    else\n        return QDateTime::fromString(dt, format);\n}\n\nQString AsemanTools::msecToTimeString(qint32 msec, const QString &format)\n{\n    return QTime::fromMSecsSinceStartOfDay(msec).toString(format);\n}\n\nQDate AsemanTools::dateAddDays(const QDate &date, int days)\n{\n    return date.addDays(days);\n}\n\nQDateTime AsemanTools::daysToDate(qint32 days)\n{\n    return QDateTime(QDate::fromJulianDay(days), QTime(0,0,0));\n}\n\nQStringList AsemanTools::toStringList(const QVariant &value)\n{\n    return value.toStringList();\n}\n\nQVariantMap AsemanTools::toVariantMap(const QVariant &value)\n{\n    return value.toMap();\n}\n\nQVariantList AsemanTools::toVariantList(const QVariant &value)\n{\n    return value.toList();\n}\n\nQString AsemanTools::byteArrayToString(const QVariant &value)\n{\n    return QString::fromUtf8(value.toByteArray());\n}\n\nQByteArray AsemanTools::compress(const QByteArray &data, int level)\n{\n    return qCompress(data, level);\n}\n\nQByteArray AsemanTools::uncompress(const QByteArray &data)\n{\n    return qUncompress(data);\n}\n\nQVariant AsemanTools::bytesToVariant(const QByteArray &_data)\n{\n    QVariant result;\n    QByteArray data = _data;\n    QDataStream stream(&data, QIODevice::ReadOnly);\n    stream >> result;\n    return result;\n}\n\nQByteArray AsemanTools::variantToBytes(const QVariant &var)\n{\n    QByteArray result;\n    QDataStream stream(&result, QIODevice::WriteOnly);\n    stream << var;\n    return result;\n}\n\nQString AsemanTools::fileName(const QString &_path)\n{\n    QString path = _path;\n    if(path.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        path = path.mid(AsemanDevices::localFilesPrePath().size());\n    return QFileInfo(path).baseName();\n}\n\nQString AsemanTools::fileSuffix(const QString &_path)\n{\n    QString path = _path;\n    if(path.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        path = path.mid(AsemanDevices::localFilesPrePath().size());\n\n    QString pathRight = path.right(10);\n    QString result = pathRight.mid(pathRight.lastIndexOf(QStringLiteral(\".\"))+1);\n    if(!result.isEmpty())\n        return result;\n\n    result = QFileInfo(path).suffix().toLower();\n    if(!result.isEmpty())\n        return result;\n\n    QMimeDatabase db;\n    const QStringList &suffixes = db.mimeTypeForFile(path).suffixes();\n    if(!suffixes.isEmpty())\n        result = suffixes.first().toLower();\n\n    return result;\n}\n\nQString AsemanTools::fileMime(const QString &path)\n{\n    QMimeDatabase db;\n    return db.mimeTypeForFile(path).name();\n}\n\nQString AsemanTools::fileParent(const QString &path)\n{\n    if(path.count() == 1 && path[0] == '/')\n        return path;\n#ifdef Q_OS_WIN\n    if(path.count() == 3 && path[0].isLetter() && path[1] == ':')\n        return path;\n#endif\n    QString res = path.mid(0, path.lastIndexOf(QStringLiteral(\"/\")));\n#ifndef Q_OS_WIN\n    if(res.isEmpty())\n        res += \"/\";\n#endif\n    return res;\n}\n\nQString AsemanTools::fileSize(const QString &_path)\n{\n    QString path = _path;\n    if(path.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        path = path.mid(AsemanDevices::localFilesPrePath().size());\n    return QString::number(QFileInfo(path).size());\n}\n\nQString AsemanTools::readText(const QString &path)\n{\n    QFile file(path);\n    if( !file.open(QFile::ReadOnly) )\n        return QString();\n\n    QString res = QString::fromUtf8(file.readAll());\n    return res;\n}\n\nbool AsemanTools::writeText(const QString &path, const QString &text)\n{\n    QFile file(path);\n    if( !file.open(QFile::WriteOnly) )\n        return false;\n\n    file.write(text.toUtf8());\n    file.close();\n    return true;\n}\n\nbool AsemanTools::fileExists(const QString &_path)\n{\n    QString path = _path;\n    if(path.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        path = path.mid(AsemanDevices::localFilesPrePath().size());\n\n    return QFileInfo::exists(path);\n}\n\nQStringList AsemanTools::filesOf(const QString &path)\n{\n    return QDir(path).entryList(QDir::Files);\n}\n\nQSize AsemanTools::imageSize(const QString &_path)\n{\n    QString path = _path;\n    if(path.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        path = path.mid(AsemanDevices::localFilesPrePath().size());\n\n    QImageReader image(path);\n    return image.size();\n}\n\nvoid AsemanTools::imageResize(const QString &_path, const QSize &size, const QString &dest, QObject *base, std::function<void (bool)> callback)\n{\n#ifndef Q_OS_WASM\n    QString path = _path;\n    if(path.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        path = path.mid(AsemanDevices::localFilesPrePath().size());\n\n    class ResizeRunnable: public QRunnable {\n        void run() {\n            QImageReader reader(_path);\n            reader.setScaledSize(_size);\n\n            QImage img = reader.read();\n            QImageWriter writer(_dest);\n            bool res = writer.write(img);\n\n            if(!_base)\n                return;\n\n            QObject *obj = new QObject;\n\n            auto callback = _callback;\n            obj->connect(obj, &QObject::destroyed, _base, [callback, res](){\n                callback(res);\n            }, Qt::QueuedConnection);\n\n            delete obj;\n        }\n\n    public:\n        QString _path;\n        QSize _size;\n        QString _dest;\n        QPointer<QObject> _base;\n        std::function<void (bool)> _callback;\n    };\n\n    ResizeRunnable *run = new ResizeRunnable;\n    run->setAutoDelete(true);\n    run->_path = path;\n    run->_size = size;\n    run->_dest = dest;\n    run->_base = base;\n    run->_callback = callback;\n\n    QThreadPool::globalInstance()->start(run);\n#endif\n}\n\nbool AsemanTools::writeFile(const QString &path, const QVariant &data, bool compress)\n{\n    QString dir = path.left(path.lastIndexOf(QStringLiteral(\"/\"))+1);\n    QDir().mkpath(dir);\n\n    QFile file(path);\n    if(!file.open(QFile::WriteOnly))\n        return false;\n\n    QByteArray bytes;\n    if(data.type() == QVariant::ByteArray)\n        bytes = data.toByteArray();\n    else\n    {\n        QDataStream stream(&bytes, QIODevice::WriteOnly);\n        stream << data;\n    }\n\n    if(compress)\n        bytes = qCompress(bytes);\n\n    file.write(bytes);\n    file.close();\n    return true;\n}\n\nQByteArray AsemanTools::readFile(const QString &path, bool uncompress)\n{\n    QFile file(path);\n    if(!file.open(QFile::ReadOnly))\n        return QByteArray();\n\n    QByteArray res = file.readAll();\n    file.close();\n\n    if(uncompress)\n        res = qUncompress(res);\n\n    return res;\n}\n\nQString AsemanTools::className(QObject *obj)\n{\n    QString result;\n    if(obj)\n        result = QString::fromUtf8(obj->metaObject()->className());\n\n    int idx = result.indexOf(QStringLiteral(\"_QMLTYPE\"));\n    if(idx >= 0)\n        result = result.left(idx+8);\n    return result;\n}\n\nQStringList AsemanTools::stringLinks(const QString &str)\n{\n    QStringList links;\n    QRegularExpression links_rxp(QStringLiteral(\"((?:(?:\\\\w\\\\S*\\\\/\\\\S*|\\\\/\\\\S+|\\\\:\\\\/)(?:\\\\/\\\\S*\\\\w|\\\\w))|(?:\\\\w+\\\\.(?:com|org|co|net)))\"));\n    auto i = links_rxp.globalMatch(str);\n    while (i.hasNext())\n    {\n        auto m = i.next();\n        QString link = m.captured(1);\n        if(link.indexOf(QRegularExpression(QStringLiteral(\"\\\\w+\\\\:\\\\/\\\\/\"))) == -1)\n            link = QStringLiteral(\"http://\") + link;\n\n        links << link;\n    }\n\n    return links;\n}\n\nQUrl AsemanTools::stringToUrl(const QString &path)\n{\n    return QUrl(path);\n}\n\nQString AsemanTools::urlToLocalPath(const QUrl &url)\n{\n    QString res = url.toLocalFile();\n    if(res.isEmpty() || url.toString().contains(QStringLiteral(\"#\")))\n        res = url.toString();\n\n#ifdef Q_OS_WIN\n    if (url.toLocalFile().left(2) == QStringLiteral(\"//\"))\n        return QStringLiteral(\"//\") + res.mid(res.indexOf(QStringLiteral(\"//\")) + 2);\n#endif\n    if(res.left(6) == QStringLiteral(\"file:/\"))\n        res = res.mid(6);\n\n    int idx1 = res.indexOf(QStringLiteral(\":/\"));\n    if(idx1 != -1)\n    {\n        int idx2 = res.lastIndexOf(QStringLiteral(\":/\"));\n        if(idx2 != -1)\n            res.remove(idx1, idx2-idx1);\n    }\n\n    if(res.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        res = res.mid(AsemanDevices::localFilesPrePath().size());\n    if(res.left(5) == QStringLiteral(\"qrc:/\"))\n        res = res.mid(3);\n\n#ifdef Q_OS_WIN\n    while(res.count() && res[0] == '/')\n#else\n    while(res.count() > 1 && res[0] == '/' && res[1] == '/')\n#endif\n          res = res.mid(1);\n\n    return res;\n}\n\nQString AsemanTools::qtVersion()\n{\n    return QString::fromUtf8(qVersion());\n}\n\nQString AsemanTools::aboutAseman()\n{\n    return tr(\"Aseman is a not-for-profit research and software development team launched in February 2014 focusing on development of products, technologies and solutions in order to publish them as open-source projects accessible to all people in the universe. Currently, we are focusing on design and development of software applications and tools which have direct connection with end users.\") + \"\\n\\n\" +\n           tr(\"By enabling innovative projects and distributing software to millions of users globally, the lab is working to accelerate the growth of high-impact open source software projects and promote an open source culture of accessibility and increased productivity around the world. The lab partners with industry leaders and policy makers to bring open source technologies to new sectors, including education, health and government.\");\n}\n\nvoid AsemanTools::deleteItemDelay(QObject *o, int ms)\n{\n    QTimer::singleShot( ms, o, SLOT(deleteLater()) );\n}\n\nqreal AsemanTools::colorHue(const QColor &clr)\n{\n    return clr.hue()/359.0;\n}\n\nqreal AsemanTools::colorLightness(const QColor &clr)\n{\n    return clr.lightness()/255.0;\n}\n\nqreal AsemanTools::colorSaturation(const QColor &clr)\n{\n    return clr.saturation()/255.0;\n}\n\nvoid AsemanTools::mkDir(const QString &pt)\n{\n    QString path = pt;\n    if(path.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        path = path.mid(AsemanDevices::localFilesPrePath().size());\n\n    QDir().mkpath(path);\n}\n\nQVariantMap AsemanTools::colorHsl(const QColor &clr)\n{\n    QVariantMap res;\n    res[QStringLiteral(\"hue\")] = colorHue(clr);\n    res[QStringLiteral(\"lightness\")] = colorLightness(clr);\n    res[QStringLiteral(\"saturation\")] = colorSaturation(clr);\n\n    return res;\n}\n\nbool AsemanTools::createVideoThumbnail(const QString &video, const QString &output, QString ffmpegPath)\n{\n#if defined(Q_OS_IOS) || defined(Q_OS_WASM)\n    Q_UNUSED(video)\n    Q_UNUSED(output)\n    Q_UNUSED(ffmpegPath)\n    return false;\n#else\n    if(ffmpegPath.isEmpty())\n#ifdef Q_OS_WIN\n        ffmpegPath = QCoreApplication::applicationDirPath() + \"/ffmpeg.exe\";\n#else\n#ifdef Q_OS_MAC\n        ffmpegPath = QCoreApplication::applicationDirPath() + \"/ffmpeg\";\n#else\n    {\n        if(QFileInfo::exists(QStringLiteral(\"/usr/bin/avconv\")))\n            ffmpegPath = QStringLiteral(\"/usr/bin/avconv\");\n        else\n            ffmpegPath = QStringLiteral(\"ffmpeg\");\n    }\n#endif\n#endif\n\n    QStringList args;\n    args << QStringLiteral(\"-itsoffset\");\n    args << QStringLiteral(\"-4\");\n    args << QStringLiteral(\"-i\");\n    args << video;\n    args << QStringLiteral(\"-vcodec\");\n    args << QStringLiteral(\"mjpeg\");\n    args << QStringLiteral(\"-vframes\");\n    args << QStringLiteral(\"1\");\n    args << QStringLiteral(\"-an\");\n    args << QStringLiteral(\"-f\");\n    args << QStringLiteral(\"rawvideo\");\n    args << output;\n    args << QStringLiteral(\"-y\");\n\n    QProcess prc;\n    prc.start(ffmpegPath, args);\n    prc.waitForStarted();\n    prc.waitForFinished();\n\n    return prc.exitCode() == 0;\n#endif\n}\n\nQString AsemanTools::translateNumbers(QString input)\n{\n    input.replace(QStringLiteral(\"0\"), AsemanTools::tr(\"0\"));\n    input.replace(QStringLiteral(\"1\"), AsemanTools::tr(\"1\"));\n    input.replace(QStringLiteral(\"2\"), AsemanTools::tr(\"2\"));\n    input.replace(QStringLiteral(\"3\"), AsemanTools::tr(\"3\"));\n    input.replace(QStringLiteral(\"4\"), AsemanTools::tr(\"4\"));\n    input.replace(QStringLiteral(\"5\"), AsemanTools::tr(\"5\"));\n    input.replace(QStringLiteral(\"6\"), AsemanTools::tr(\"6\"));\n    input.replace(QStringLiteral(\"7\"), AsemanTools::tr(\"7\"));\n    input.replace(QStringLiteral(\"8\"), AsemanTools::tr(\"8\"));\n    input.replace(QStringLiteral(\"9\"), AsemanTools::tr(\"9\"));\n    return input;\n}\n\nQString AsemanTools::trNums(QString input)\n{\n    return AsemanTools::translateNumbers(input);\n}\n\nQString AsemanTools::passToMd5(const QString &pass)\n{\n    if( pass.isEmpty() )\n        return QString();\n\n    return md5(pass);\n}\n\nQString AsemanTools::md5(const QString &str)\n{\n    return hash(str, Md5);\n}\n\nQString AsemanTools::passToHash(const QString &pass, int method)\n{\n    if( pass.isEmpty() )\n        return QString();\n\n    return hash(pass, method);\n}\n\nQString AsemanTools::hash(const QString &str, int method)\n{\n    QCryptographicHash::Algorithm alg = QCryptographicHash::Md5;\n    switch (method)\n    {\n    case Md5:\n        alg = QCryptographicHash::Md5;\n        break;\n    case Sha224:\n        alg = QCryptographicHash::Sha224;\n        break;\n    case Sha256:\n        alg = QCryptographicHash::Sha256;\n        break;\n    case Sha384:\n        alg = QCryptographicHash::Sha384;\n        break;\n    case Sha512:\n        alg = QCryptographicHash::Sha512;\n        break;\n    case Sha3_224:\n        alg = QCryptographicHash::Sha3_224;\n        break;\n    case Sha3_256:\n        alg = QCryptographicHash::Sha3_256;\n        break;\n    case Sha3_384:\n        alg = QCryptographicHash::Sha3_384;\n        break;\n    case Sha3_512:\n        alg = QCryptographicHash::Sha3_512;\n        break;\n    }\n\n    return QString::fromUtf8(QCryptographicHash::hash(str.toUtf8(), alg).toHex());\n}\n\nQString AsemanTools::createUuid()\n{\n    return QUuid::createUuid().toString();\n}\n\nQString AsemanTools::stringRemove(QString str, const QString &text, bool regExp)\n{\n    if(regExp)\n        return str.remove( QRegularExpression(text) );\n    else\n        return str.remove(text);\n}\n\nQString AsemanTools::stringReplace(QString str, const QString &text, const QString &replace, bool regExp)\n{\n    if(regExp)\n        return str.replace(QRegularExpression(text), replace);\n    else\n        return str.replace(text, replace);\n}\n\nQVariantList AsemanTools::stringRegExp(QString str, const QString &regExp, bool)\n{\n    QRegularExpression rx(regExp);\n\n    QVariantList res;\n    auto i = rx.globalMatch(str);\n    while (i.hasNext()) {\n        auto m = i.next();\n        res << m.capturedTexts();\n    }\n\n    return res;\n}\n\nQString AsemanTools::htmlToPlaintText(const QString &html)\n{\n    QTextDocument doc;\n    doc.setHtml(html);\n    return doc.toPlainText();\n}\n\nvoid AsemanTools::copyDirectory(const QString &_src, const QString &_dst)\n{\n    QString src = _src;\n    if(src.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        src = src.mid(AsemanDevices::localFilesPrePath().size());\n    QString dst = _dst;\n    if(dst.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        dst = dst.mid(AsemanDevices::localFilesPrePath().size());\n\n    QDir().mkpath(dst);\n\n    const QStringList & dirs = QDir(src).entryList(QDir::Dirs|QDir::NoDotAndDotDot);\n    for(const QString &d: dirs)\n        copyDirectory(src+\"/\"+d, dst+\"/\"+d);\n\n    const QStringList & files = QDir(src).entryList(QDir::Files);\n    for(const QString &f: files)\n        QFile::copy(src+\"/\"+f, dst+\"/\"+f);\n}\n\nbool AsemanTools::copy(const QString &_src, const QString &_dst)\n{\n    QString src = _src;\n    if(src.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        src = src.mid(AsemanDevices::localFilesPrePath().size());\n    QString dst = _dst;\n    if(dst.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        dst = dst.mid(AsemanDevices::localFilesPrePath().size());\n\n    return QFile::copy(src, dst);\n}\n\nbool AsemanTools::rename(const QString &_src, const QString &_dst)\n{\n    QString src = _src;\n    if(src.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        src = src.mid(AsemanDevices::localFilesPrePath().size());\n    QString dst = _dst;\n    if(dst.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        dst = dst.mid(AsemanDevices::localFilesPrePath().size());\n\n    return QFile::rename(src, dst);\n}\n\nvoid AsemanTools::deleteFile(const QString &pt)\n{\n    QString path = pt;\n    if(path.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        path = path.mid(AsemanDevices::localFilesPrePath().size());\n\n    QFile::remove(path);\n}\n\nvoid AsemanTools::clearDirectory(const QString &pt)\n{\n    QString path = pt;\n    if(path.left(AsemanDevices::localFilesPrePath().size()) == AsemanDevices::localFilesPrePath())\n        path = path.mid(AsemanDevices::localFilesPrePath().size());\n\n    const QStringList & files = QDir(path).entryList(QDir::Files);\n    for(const QString &f: files)\n        deleteFile(path+\"/\"+f);\n}\n\nQVariantMap AsemanTools::decodeJwt(const QString &token)\n{\n    QVariantMap res;\n\n    QStringList parts = token.split(\".\");\n    if (parts.length() > 0) res[\"header\"] = QJsonDocument::fromJson( QByteArray::fromBase64( parts[0].toUtf8() ) ).toVariant();\n    if (parts.length() > 1) res[\"body\"] = QJsonDocument::fromJson( QByteArray::fromBase64( parts[1].toUtf8() ) ).toVariant();\n\n    return res;\n}\n\nvoid AsemanTools::setProperty(QObject *obj, const QString &property, const QVariant &v)\n{\n    if( !obj || property.isEmpty() )\n        return;\n\n    obj->setProperty( property.toUtf8(), v );\n}\n\nQVariant AsemanTools::property(QObject *obj, const QString &property)\n{\n    if( !obj || property.isEmpty() )\n        return QVariant();\n\n    return obj->property(property.toUtf8());\n}\n\nQt::LayoutDirection AsemanTools::directionOf(const QString &str)\n{\n    Qt::LayoutDirection res = Qt::LeftToRight;\n    if( str.isEmpty() )\n        return res;\n\n    int ltr = 0;\n    int rtl = 0;\n\n    for(const QChar &ch: str)\n    {\n        QChar::Direction dir = ch.direction();\n        switch( static_cast<int>(dir) )\n        {\n        case QChar::DirL:\n        case QChar::DirLRE:\n        case QChar::DirLRO:\n        case QChar::DirEN:\n            ltr++;\n            break;\n\n        case QChar::DirR:\n        case QChar::DirRLE:\n        case QChar::DirRLO:\n        case QChar::DirAL:\n            rtl++;\n            break;\n        }\n    }\n\n    if( ltr >= rtl )\n        res = Qt::LeftToRight;\n    else\n        res = Qt::RightToLeft;\n\n    return res;\n}\n\nQVariant AsemanTools::call(QObject *obj, const QString &member, Qt::ConnectionType ctype, const QVariant &v0, const QVariant &v1, const QVariant &v2, const QVariant &v3, const QVariant &v4, const QVariant &v5, const QVariant &v6, const QVariant &v7, const QVariant &v8, const QVariant &v9)\n{\n    const QMetaObject *meta_obj = obj->metaObject();\n    QMetaMethod meta_method;\n    for( int i=0; i<meta_obj->methodCount(); i++ )\n    {\n        QMetaMethod mtd = meta_obj->method(i);\n        if( mtd.name() == member.toUtf8() )\n            meta_method = mtd;\n    }\n    if( !meta_method.isValid() )\n        return QVariant();\n\n    QList<QByteArray> param_types = meta_method.parameterTypes();\n    QList<QByteArray> param_names = meta_method.parameterNames();\n\n    QString ret_type = QString::fromUtf8(meta_method.typeName());\n    QList< QPair<QString,QString> > m_args;\n    for( int i=0 ; i<param_types.count() ; i++ )\n        m_args << QPair<QString,QString>( QString::fromUtf8(param_types.at(i)) , QString::fromUtf8(param_names.at(i)) );\n\n    QVariantList vals;\n        vals << v0 << v1 << v2 << v3 << v4 << v5 << v6 << v7 << v8 << v9;\n\n    QVariantList tr_vals;\n\n    QList< QPair<QString,const void*> > args;\n    for( int i=0 ; i<vals.count() ; i++ )\n    {\n        if( i<m_args.count() )\n        {\n            QString type = m_args.at(i).first;\n\n            if( type != QString::fromUtf8(vals.at(i).typeName()) )\n            {\n                if( !vals[i].canConvert( QVariant::nameToType(type.toLatin1()) ) )\n                    ;\n                else\n                    vals[i].convert( QVariant::nameToType(type.toLatin1()) );\n            }\n\n            args << QPair<QString,const void*>( type, vals.at(i).data() );\n            tr_vals << vals[i];\n        }\n        else\n        {\n            args << QPair<QString,const void*>( QString::fromUtf8(vals.at(i).typeName()) , vals.at(i).data() );\n        }\n    }\n\n    int type = QMetaType::type(ret_type.toLatin1());\n    void *res = QMetaType::create( type );\n    bool is_pointer = ret_type.contains('*');\n\n    bool done;\n    switch( static_cast<int>(ctype) )\n    {\n    case Qt::QueuedConnection:\n        done = QMetaObject::invokeMethod( obj , member.toLatin1() , Qt::QueuedConnection ,\n                                  QGenericArgument( args.at(0).first.toLatin1() , args.at(0).second ) ,\n                                  QGenericArgument( args.at(1).first.toLatin1() , args.at(1).second ) ,\n                                  QGenericArgument( args.at(2).first.toLatin1() , args.at(2).second ) ,\n                                  QGenericArgument( args.at(3).first.toLatin1() , args.at(3).second ) ,\n                                  QGenericArgument( args.at(4).first.toLatin1() , args.at(4).second ) ,\n                                  QGenericArgument( args.at(5).first.toLatin1() , args.at(5).second ) ,\n                                  QGenericArgument( args.at(6).first.toLatin1() , args.at(6).second ) ,\n                                  QGenericArgument( args.at(7).first.toLatin1() , args.at(7).second ) ,\n                                  QGenericArgument( args.at(8).first.toLatin1() , args.at(8).second ) ,\n                                  QGenericArgument( args.at(9).first.toLatin1() , args.at(9).second ) );\n        return QVariant();\n        break;\n\n    default:\n        done = QMetaObject::invokeMethod( obj , member.toLatin1() , ctype, QGenericReturnArgument( ret_type.toLatin1() , (is_pointer)? &res : res ) ,\n                                  QGenericArgument( args.at(0).first.toLatin1() , args.at(0).second ) ,\n                                  QGenericArgument( args.at(1).first.toLatin1() , args.at(1).second ) ,\n                                  QGenericArgument( args.at(2).first.toLatin1() , args.at(2).second ) ,\n                                  QGenericArgument( args.at(3).first.toLatin1() , args.at(3).second ) ,\n                                  QGenericArgument( args.at(4).first.toLatin1() , args.at(4).second ) ,\n                                  QGenericArgument( args.at(5).first.toLatin1() , args.at(5).second ) ,\n                                  QGenericArgument( args.at(6).first.toLatin1() , args.at(6).second ) ,\n                                  QGenericArgument( args.at(7).first.toLatin1() , args.at(7).second ) ,\n                                  QGenericArgument( args.at(8).first.toLatin1() , args.at(8).second ) ,\n                                  QGenericArgument( args.at(9).first.toLatin1() , args.at(9).second ) );\n        break;\n    }\n\n    QVariant result;\n    if( !done )\n    {\n        QMetaType::destroy(type, res);\n        return result;\n    }\n\n    if( type == QMetaType::Void )\n        result = QVariant();\n    else\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n    if( is_pointer )\n        result = QVariant( type , &res );\n    else\n        result = QVariant( type , res );\n#else\n    if( is_pointer )\n        result = QVariant( QMetaType(type) , &res );\n    else\n        result = QVariant( QMetaType(type) , res );\n#endif\n\n    if( type == QMetaType::type(\"QVariant\") )\n        return result.value<QVariant>();\n    else\n        return result;\n}\n\nAsemanTools::~AsemanTools()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/gui/asemantools.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANTOOLS_H\n#define ASEMANTOOLS_H\n\n#include <QObject>\n#include <QVariant>\n#include <QVariantMap>\n#include <QDateTime>\n#include <QSize>\n#include <QStringList>\n#include <QUrl>\n\n#define ASEMAN_TYPE_NAME(TYPE) #TYPE\n\n#include \"asemangui_global.h\"\n\nclass AsemanToolsPrivate;\nclass LIBQTASEMAN_GUI_EXPORT AsemanTools : public QObject\n{\n    Q_OBJECT\n    Q_ENUMS(HashMethod)\n\npublic:\n    AsemanTools(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanTools();\n\n    enum HashMethod {\n        Md5,\n        Sha224,\n        Sha256,\n        Sha384,\n        Sha512,\n        Sha3_224,\n        Sha3_256,\n        Sha3_384,\n        Sha3_512\n    };\n\n    static void imageResize(const QString &path, const QSize &size, const QString &dest, QObject *base, std::function<void(bool)> callback);\n\npublic Q_SLOTS:\n    static void debug( const QVariant & var );\n\n    static QDateTime currentDate();\n    static QString dateToMSec(const QDateTime &dt);\n    static QDateTime mSecToDate(const QString &ms);\n    static qint64 dateToSec(const QDateTime &dt);\n    static QDateTime dateFromSec(qint64 date);\n    static QString dateToString(const QDateTime &dt, const QString &format = QString());\n    static QDateTime datefromString(const QString &dt, const QString &format = QString());\n    static QString msecToTimeString(qint32 msec, const QString &format = QString());\n    static QDate dateAddDays(const QDate &date, int days);\n    static QDateTime daysToDate(qint32 days);\n\n    static QStringList toStringList(const QVariant &value);\n    static QVariantMap toVariantMap(const QVariant &value);\n    static QVariantList toVariantList(const QVariant &value);\n\n    static QString byteArrayToString(const QVariant &value);\n\n    static QByteArray compress(const QByteArray &data, int level = -1);\n    static QByteArray uncompress(const QByteArray &data);\n\n    QVariant bytesToVariant(const QByteArray &data);\n    QByteArray variantToBytes(const QVariant &var);\n\n    static QString fileName( const QString & path );\n    static QString fileSuffix( const QString & path );\n    static QString fileMime(const QString &path);\n    static QString fileParent( const QString & path );\n    static QString fileSize( const QString & path );\n    static QString readText( const QString & path );\n    static bool writeText(const QString & path , const QString &text);\n    static bool fileExists(const QString & path);\n    static QStringList filesOf(const QString &path);\n\n    static QSize imageSize(const QString &path);\n\n    static bool writeFile(const QString &path, const QVariant &data, bool compress = false);\n    static QByteArray readFile(const QString &path, bool uncompress = false);\n\n    static QString className(QObject *obj);\n\n    static QStringList stringLinks(const QString &str);\n    static QString stringRemove(QString str, const QString &text, bool regExp = false);\n    static QString stringReplace(QString str, const QString &text, const QString &replace, bool regExp = false);\n    static QVariantList stringRegExp(QString str, const QString &regExp, bool minimal = true);\n\n    static QUrl stringToUrl(const QString &path);\n    static QString urlToLocalPath(const QUrl &url);\n\n    static QString qtVersion();\n    static QString aboutAseman();\n\n    static void deleteItemDelay( QObject *o, int ms );\n\n    static qreal colorHue( const QColor & clr );\n    static qreal colorLightness( const QColor & clr );\n    static qreal colorSaturation( const QColor & clr );\n\n    static void mkDir(const QString &dir);\n\n    static QVariantMap colorHsl( const QColor & clr );\n\n    static bool createVideoThumbnail(const QString &video, const QString &output, QString ffmpegPath = QString());\n\n    static QString translateNumbers( QString input );\n    static QString trNums(QString input);\n    static QString passToMd5( const QString & pass );\n    static QString md5(const QString & str );\n    static QString passToHash(const QString &pass, int method);\n    static QString hash(const QString &str, int method);\n    static QString createUuid();\n\n    static QString htmlToPlaintText(const QString &html);\n\n    static void copyDirectory( const QString & src, const QString & dst );\n    static bool copy( const QString & src, const QString & dst );\n    static bool rename( const QString & src, const QString & dst );\n    static void deleteFile(const QString &file);\n    static void clearDirectory(const QString &dir);\n\n    static QVariantMap decodeJwt(const QString &token);\n\n    static void setProperty( QObject *obj, const QString & property, const QVariant & v );\n    static QVariant property( QObject *obj, const QString & property );\n\n    static Qt::LayoutDirection directionOf( const QString & str );\n    static QVariant call( QObject *obj, const QString & member, Qt::ConnectionType type,\n                                                                const QVariant & v0 = QVariant(),\n                                                                const QVariant & v1 = QVariant(),\n                                                                const QVariant & v2 = QVariant(),\n                                                                const QVariant & v3 = QVariant(),\n                                                                const QVariant & v4 = QVariant(),\n                                                                const QVariant & v5 = QVariant(),\n                                                                const QVariant & v6 = QVariant(),\n                                                                const QVariant & v7 = QVariant(),\n                                                                const QVariant & v8 = QVariant(),\n                                                                const QVariant & v9 = QVariant() );\n\nprivate:\n    AsemanToolsPrivate *p;\n};\n\ntypedef AsemanTools QAsemanTools;\n\n#endif // ASEMANTOOLS_H\n"
  },
  {
    "path": "src/gui/asemantranslationmanager.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemantranslationmanager.h\"\n#include \"asemantools.h\"\n#include \"asemanglobaltranslations.h\"\n\n#include <QCoreApplication>\n#include <QLocale>\n#include <QTranslator>\n#include <QDir>\n#include <QDebug>\n#include <QRegularExpression>\n\nclass AsemanTranslationManager::Private\n{\npublic:\n    QTranslator *translator;\n    QUrl sourceDirectory;\n    QString localeName;\n    QString fileName;\n    QString delimiters;\n};\n\nAsemanTranslationManager::AsemanTranslationManager(QObject *parent) :\n    QObject(parent)\n{\n    p = new Private;\n    p->translator = 0;\n}\n\nvoid AsemanTranslationManager::setSourceDirectory(const QUrl &sourceDirectory)\n{\n    if(p->sourceDirectory == sourceDirectory)\n        return;\n\n    p->sourceDirectory = sourceDirectory;\n    refresh();\n    Q_EMIT sourceDirectoryChanged();\n}\n\nQUrl AsemanTranslationManager::sourceDirectory() const\n{\n    return p->sourceDirectory;\n}\n\nvoid AsemanTranslationManager::setLocaleName(const QString &localeName)\n{\n    if(p->localeName == localeName)\n        return;\n\n    p->localeName = localeName;\n    refresh();\n    Q_EMIT localeNameChanged();\n}\n\nQString AsemanTranslationManager::localeName() const\n{\n    return p->localeName;\n}\n\nvoid AsemanTranslationManager::setFileName(const QString &fileName)\n{\n    if(p->fileName == fileName)\n        return;\n\n    p->fileName = fileName;\n    refresh();\n    Q_EMIT fileNameChanged();\n}\n\nQString AsemanTranslationManager::fileName() const\n{\n    return p->fileName;\n}\n\nvoid AsemanTranslationManager::setDelimiters(const QString &delimiters)\n{\n    if(p->delimiters == delimiters)\n        return;\n\n    p->delimiters = delimiters;\n    refresh();\n    Q_EMIT delimitersChanged();\n}\n\nQString AsemanTranslationManager::delimiters() const\n{\n    return p->delimiters;\n}\n\nint AsemanTranslationManager::textDirection() const\n{\n    return QLocale(p->localeName).textDirection();\n}\n\nQMap<QString, QVariant> AsemanTranslationManager::translations() const\n{\n    QMap<QString, QVariant> res;\n    QString path = AsemanTools::urlToLocalPath(p->sourceDirectory);\n\n    QRegularExpression rx(p->fileName + p->delimiters + QStringLiteral(\"(\\\\w+)\\\\.qm\"));\n    QStringList files = QDir(path).entryList(QStringList()<<QStringLiteral(\"*.qm\"), QDir::Files);\n    for(const QString &file: files)\n    {\n        auto i = rx.match(file);\n        if (!i.hasMatch())\n            continue;\n\n        QString cap = i.captured(1);\n        res[cap] = QLocale(cap).nativeLanguageName();\n    }\n\n    return res;\n}\n\nvoid AsemanTranslationManager::refresh()\n{\n    if(p->sourceDirectory.isEmpty() || p->fileName.isEmpty() || p->delimiters.isEmpty() || p->localeName.isEmpty())\n        return;\n\n    QString path = AsemanTools::urlToLocalPath(p->sourceDirectory);\n    if(p->translator)\n    {\n        QCoreApplication::removeTranslator(p->translator);\n        delete p->translator;\n    }\n\n    p->translator = new QTranslator(this);\n    p->translator->load( QLocale(p->localeName), p->fileName, p->delimiters, path);\n\n    QCoreApplication::installTranslator(p->translator);\n\n    Q_EMIT refreshed();\n    Q_EMIT textDirectionChanged();\n    Q_EMIT translationsChanged();\n    AsemanGlobalTranslations::refresh();\n}\n\nAsemanTranslationManager::~AsemanTranslationManager()\n{\n    if(p->translator)\n        QCoreApplication::removeTranslator(p->translator);\n\n    delete p;\n}\n"
  },
  {
    "path": "src/gui/asemantranslationmanager.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANTRANSLATIONMANAGER_H\n#define ASEMANTRANSLATIONMANAGER_H\n\n#include <QUrl>\n#include <QObject>\n#include <QMap>\n#include <QVariant>\n\n#include \"asemangui_global.h\"\n\nclass LIBQTASEMAN_GUI_EXPORT AsemanTranslationManager : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QUrl sourceDirectory READ sourceDirectory WRITE setSourceDirectory NOTIFY sourceDirectoryChanged)\n    Q_PROPERTY(QString localeName READ localeName WRITE setLocaleName NOTIFY localeNameChanged)\n    Q_PROPERTY(QString fileName READ fileName WRITE setFileName NOTIFY fileNameChanged)\n    Q_PROPERTY(QString delimiters READ delimiters WRITE setDelimiters NOTIFY delimitersChanged)\n    Q_PROPERTY(QString refresher READ refresher NOTIFY refreshed)\n    Q_PROPERTY(int textDirection READ textDirection NOTIFY textDirectionChanged)\n    Q_PROPERTY(QVariantMap translations READ translations NOTIFY translationsChanged)\n\n    class Private;\n\npublic:\n    AsemanTranslationManager(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanTranslationManager();\n\n    void setSourceDirectory(const QUrl &source);\n    QUrl sourceDirectory() const;\n\n    void setLocaleName(const QString &localeName);\n    QString localeName() const;\n\n    void setFileName(const QString &fileName);\n    QString fileName() const;\n\n    void setDelimiters(const QString &delimiters);\n    QString delimiters() const;\n\n    QString refresher() const { return QString(); }\n\n    int textDirection() const;\n\n    QMap<QString, QVariant> translations() const;\n\nQ_SIGNALS:\n    void sourceDirectoryChanged();\n    void localeNameChanged();\n    void fileNameChanged();\n    void delimitersChanged();\n    void refreshed();\n    void textDirectionChanged();\n    void translationsChanged();\n\npublic Q_SLOTS:\n\nprivate:\n    void refresh();\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanTranslationManager QAsemanTranslationManager;\n\n#endif // ASEMANTRANSLATIONMANAGER_H\n"
  },
  {
    "path": "src/gui/asemanwindowdetails.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanwindowdetails.h\"\n\n#include <QPointer>\n#include <QGuiApplication>\n\nclass AsemanWindowDetailsPrivate\n{\npublic:\n    QPointer<QWindow> window;\n};\n\nAsemanWindowDetails::AsemanWindowDetails(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanWindowDetailsPrivate;\n}\n\nQWindow *AsemanWindowDetails::window() const\n{\n    return p->window;\n}\n\nvoid AsemanWindowDetails::setWindow(QWindow *window)\n{\n    if(p->window == window)\n        return;\n\n    if(p->window)\n        disconnect(p->window, &QWindow::screenChanged, this, &AsemanWindowDetails::screenChanged);\n\n    p->window = window;\n    if(p->window)\n        connect(p->window, &QWindow::screenChanged, this, &AsemanWindowDetails::screenChanged);\n\n    Q_EMIT windowChanged();\n    Q_EMIT screenChanged();\n}\n\nQScreen *AsemanWindowDetails::screen() const\n{\n    if(p->window)\n        return p->window->screen();\n    else\n        return QGuiApplication::primaryScreen();\n}\n\nAsemanWindowDetails::~AsemanWindowDetails()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/gui/asemanwindowdetails.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANWINDOWDETAILS_H\n#define ASEMANWINDOWDETAILS_H\n\n#include <QObject>\n#include <QWindow>\n#include <QScreen>\n\n#include \"asemangui_global.h\"\n\nclass AsemanWindowDetailsPrivate;\nclass LIBQTASEMAN_GUI_EXPORT AsemanWindowDetails : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QWindow* window READ window WRITE setWindow NOTIFY windowChanged)\n    Q_PROPERTY(QScreen* screen READ screen NOTIFY screenChanged)\n\npublic:\n    AsemanWindowDetails(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanWindowDetails();\n\n    QWindow *window() const;\n    void setWindow(QWindow *window);\n\n    QScreen *screen() const;\n\nQ_SIGNALS:\n    void windowChanged();\n    void screenChanged();\n\nprivate:\n    AsemanWindowDetailsPrivate *p;\n};\n\ntypedef AsemanWindowDetails QAsemanWindowDetails;\n\n#endif // ASEMANWINDOWDETAILS_H\n"
  },
  {
    "path": "src/gui/gui.pri",
    "content": "INCLUDEPATH += $$PWD\nDEPENDPATH += $$PWD\nQT += core gui\n\nstatic: DEFINES += ASEMAN_STATIC_BUILD\n\nHEADERS += \\\n    $$PWD/asemanapplication.h \\\n    $$PWD/asemandevices.h \\\n    $$PWD/asemanimagecoloranalizor.h \\\n    $$PWD/asemanmimeapps.h \\\n    $$PWD/asemanmimedata.h \\\n    $$PWD/asemantexttools.h \\\n    $$PWD/asemantitlebarcolorgrabber.h \\\n    $$PWD/asemantools.h \\\n    $$PWD/asemantranslationmanager.h \\\n    $$PWD/asemanwindowdetails.h \\\n    $$PWD/asemangui_global.h \\\n    $$PWD/asemankeyhandler.h \\\n    $$PWD/asemanglobaltranslations.h\n\nSOURCES += \\\n    $$PWD/asemanapplication.cpp \\\n    $$PWD/asemandevices.cpp \\\n    $$PWD/asemanimagecoloranalizor.cpp \\\n    $$PWD/asemanmimeapps.cpp \\\n    $$PWD/asemanmimedata.cpp \\\n    $$PWD/asemantexttools.cpp \\\n    $$PWD/asemantitlebarcolorgrabber.cpp \\\n    $$PWD/asemantools.cpp \\\n    $$PWD/asemantranslationmanager.cpp \\\n    $$PWD/asemanwindowdetails.cpp \\\n    $$PWD/asemankeyhandler.cpp \\\n    $$PWD/asemanglobaltranslations.cpp\n\nandroid: {\n    lessThan(QT_MAJOR_VERSION, 6) QT += androidextras\n    SOURCES += \\\n        $$PWD/asemanjavalayer.cpp\n    HEADERS += \\\n        $$PWD/asemanjavalayer.h\n}\n\nios {\n    SOURCES += \\\n        $$PWD/asemanobjectiveclayer.mm\n    HEADERS += \\\n        $$PWD/asemanobjectiveclayer.h\n\n    LIBS += -framework SafariServices -lobjc\n    LIBS += -framework LocalAuthentication\n    enable-ios-contacts-support {\n        LIBS += -framework Contacts\n    } else {\n        DEFINES += DISABLE_IOS_CONTACTS_SUPPORT\n    }\n}\n\nmacx {\n    HEADERS += \\\n        $$PWD/asemanmacmanager.h\n    SOURCES += \\\n        $$PWD/asemanmacmanager.mm\n    LIBS += -framework LocalAuthentication\n}\n"
  },
  {
    "path": "src/gui/gui.pro",
    "content": "CONFIG += no_app_extension_api_only\nload(qt_build_config)\n\nTARGET = QAsemanGui\nQT += asemancore\n\nMODULE = asemangui\n\nload(qt_module)\n\nstatic: DEFINES += ASEMAN_STATIC_BUILD\n\nDEFINES += LIBQTASEMAN_GUI_LIBRARY\n\ninclude (gui.pri)\n"
  },
  {
    "path": "src/httpserver/asemanhttpserver.cpp",
    "content": "#include \"asemanhttpserver.h\"\n#include \"qhttpserver.hpp\"\n\n#include \"qhttpserverrequest.hpp\"\n#include \"qhttpserverresponse.hpp\"\n\n#include <QRunnable>\n#include <QThreadPool>\n\nusing namespace qhttp::server;\n\nQList<AsemanHttpServer::Responder*> AsemanHttpServer::Responder::mGarbages;\nQMutex AsemanHttpServer::Responder::mMutex;\n\nclass AsemanHttpServer::Private\n{\npublic:\n    class CallbackPack {\n    public:\n        AsyncRouteCallback async;\n        SyncRouteCallback sync;\n        bool thread;\n        QString path;\n        AsemanHttpServer::HttpMethod method;\n    };\n\n    QHttpServer *server;\n    QHash<int, QHash<QString, QList<CallbackPack>>> routes;\n    QHash<QHttpRequest*, QByteArray> requestsData;\n\n    QThreadPool *pool;\n\n    void route(CallbackPack callback);\n    void handle(AsemanHttpServer *parent, QHttpRequest* req, QHttpResponse* res);\n    void call_auto(AsemanHttpServer *parent, const CallbackPack &pk, QHttpRequest *, QHttpResponse *res);\n    void call(AsemanHttpServer *parent, const CallbackPack &pk, QHttpRequest *, QHttpResponse *res, const QByteArray &data);\n};\n\nAsemanHttpServer::AsemanHttpServer(QObject *parent)\n    : QObject(parent)\n{\n    p = new Private;\n    p->server = Q_NULLPTR;\n    p->pool = Q_NULLPTR;\n}\n\nvoid AsemanHttpServer::listen(const QString &host, quint16 port)\n{\n    if (p->server)\n        stop();\n    if (!p->pool)\n        p->pool = new QThreadPool(this);\n\n    p->server = new QHttpServer(this);\n\n    connect(p->server, &QHttpServer::newRequest, this, [this](QHttpRequest* req, QHttpResponse* res){\n        p->handle(this, req, res);\n    });\n\n    p->server->listen(QHostAddress(host), port);\n}\n\nvoid AsemanHttpServer::stop()\n{\n    p->server->stopListening();\n    p->server->deleteLater();\n    p->server = Q_NULLPTR;\n}\n\nvoid AsemanHttpServer::response(void *core, const QByteArray &data, int status, const QString &contentType)\n{\n    auto responder = static_cast<QHttpResponse*>(core);\n\n    if (contentType.length())\n        responder->addHeader(\"Content-Type\", contentType.toUtf8());\n\n    responder->setStatusCode(static_cast<qhttp::TStatusCode>(status));\n    responder->end(data);\n}\n\nvoid AsemanHttpServer::cleanGarbages()\n{\n    QMutexLocker locker(&AsemanHttpServer::Responder::mMutex);\n    for (auto g: AsemanHttpServer::Responder::mGarbages)\n        delete g;\n\n    AsemanHttpServer::Responder::mGarbages.clear();\n}\n\nAsemanHttpServer::~AsemanHttpServer()\n{\n    delete p->server;\n    delete p;\n}\n\nvoid AsemanHttpServer::route(const QString &path, HttpMethod method, AsemanHttpServer::AsyncRouteCallback callback, bool threaded)\n{\n    Private::CallbackPack pack;\n    pack.async = callback;\n    pack.sync = Q_NULLPTR;\n    pack.thread = threaded;\n    pack.path = path;\n    pack.method = method;\n\n    p->route(pack);\n}\n\nvoid AsemanHttpServer::route(const QString &path, HttpMethod method, AsemanHttpServer::SyncRouteCallback callback, bool threaded)\n{\n    Private::CallbackPack pack;\n    pack.async = Q_NULLPTR;\n    pack.sync = callback;\n    pack.thread = threaded;\n    pack.path = path;\n    pack.method = method;\n\n    p->route(pack);\n}\n\nvoid AsemanHttpServer::Private::route(AsemanHttpServer::Private::CallbackPack callback)\n{\n    auto path = callback.path;\n    auto idx = path.indexOf(QStringLiteral(\"<\"));\n    if (idx > -1)\n        path = path.left(idx);\n\n    routes[static_cast<int>(callback.method)][path] << callback;\n}\n\nvoid AsemanHttpServer::Private::handle(AsemanHttpServer *parent, QHttpRequest *req, QHttpResponse *res)\n{\n    const auto &url = req->url();\n    const auto &methodString = url.path();\n    const auto routesList = routes[static_cast<int>(req->method())];\n    if (routesList.isEmpty())\n    {\n        res->setStatusCode(qhttp::ESTATUS_NOT_FOUND);\n        res->end();\n        return;\n    }\n\n    if (routesList.contains(methodString))\n    {\n        const auto &pks = routesList.value(methodString);\n        for (const auto &pk: pks)\n            if (pk.path == methodString)\n            {\n                call_auto(parent, pk, req, res);\n                return;\n            }\n    }\n\n    QString adrs;\n    QStringList parts = methodString.split('/');\n    const auto cnt = parts.count();\n    for (int idx=0; idx<cnt; idx++)\n    {\n        adrs += parts.at(idx) + QStringLiteral(\"/\");\n\n        const auto &packs = routesList.value(adrs);\n        for (const auto &pk: packs)\n        {\n            auto pk_parts = pk.path.split('/');\n            if (cnt == pk_parts.count())\n            {\n                bool is_that = true;\n                for (int i=0; i<cnt; i++)\n                {\n                    auto parts_item = parts.at(i);\n                    auto pk_item = pk_parts.at(i);\n                    if (parts_item == pk_item)\n                        continue;\n                    if (pk_item.count() > 2 && pk_item.left(1) == QStringLiteral(\"<\") && pk_item.right(1) == QStringLiteral(\">\"))\n                        continue;\n\n                    is_that = false;\n                    break;\n                }\n\n                if (is_that)\n                {\n                    call_auto(parent, pk, req, res);\n                    return;\n                }\n            }\n        }\n    }\n\n    res->setStatusCode(qhttp::ESTATUS_NOT_FOUND);\n    res->end();\n}\n\nvoid AsemanHttpServer::Private::call_auto(AsemanHttpServer *parent, const AsemanHttpServer::Private::CallbackPack &pk, QHttpRequest *req, QHttpResponse *res)\n{\n    QObject::connect(req, &QHttpRequest::data, parent, [this, req](QByteArray data){\n        requestsData[req] += data;\n    });\n\n    QObject::connect(req, &QHttpRequest::end, parent, [parent, pk, req, res, this](){\n        if (pk.thread)\n        {\n            class CallRunnable: public QRunnable\n            {\n            public:\n                AsemanHttpServer *parent;\n                AsemanHttpServer::Private::CallbackPack pk;\n                QHttpRequest *req;\n                QHttpResponse *res;\n                QByteArray data;\n\n                void run() {\n                    parent->p->call(parent, pk, req, res, data);\n                }\n            };\n\n            auto r = new CallRunnable;\n            r->parent = parent;\n            r->pk = pk;\n            r->req = req;\n            r->res = res;\n            r->data = requestsData.take(req);\n            r->setAutoDelete(true);\n\n            pool->start(r);\n        }\n        else\n            call(parent, pk, req, res, requestsData.take(req));\n    });\n}\n\nvoid AsemanHttpServer::Private::call(AsemanHttpServer *parent, const AsemanHttpServer::Private::CallbackPack &pk, QHttpRequest *req, QHttpResponse *res, const QByteArray &data)\n{\n    Request request;\n    request.mUrl = req->url();\n    request.mQuery = QUrlQuery(request.mUrl);\n    request.mHeaders = req->headers();\n    request.mMethod = static_cast<AsemanHttpServer::HttpMethod>(req->method());\n    request.mRemoteAddress = req->remoteAddress();\n    request.mBody = data;\n    request.mRoutePath = pk.path;\n\n    if (pk.async)\n    {\n        auto responder = new Responder(parent, res, pk.thread);\n        pk.async(request, responder);\n    }\n    else\n    if (pk.sync)\n    {\n        auto responder = pk.sync(request);\n        int status_int = static_cast<int>(responder.mStatus);\n        if (pk.thread)\n            QMetaObject::invokeMethod(parent, \"response\", Qt::QueuedConnection, Q_ARG(void*, res), Q_ARG(QByteArray, responder.mData), Q_ARG(int, status_int), Q_ARG(QString, responder.mContentType));\n        else\n            parent->response(res, responder.mData, status_int, responder.mContentType);\n    }\n}\n\nvoid AsemanHttpServer::Responder::write(const QByteArray &data, StatusCode status, const QString &contentType)\n{\n    auto responder = static_cast<QHttpResponse*>(mResponseCore);\n    int status_int = static_cast<int>(status);\n    if (mThreaded)\n        QMetaObject::invokeMethod(mParent, \"response\", Qt::QueuedConnection, Q_ARG(void*, responder), Q_ARG(QByteArray, data), Q_ARG(int, status_int), Q_ARG(QString, contentType));\n    else\n        mParent->response(responder, data, status_int, contentType);\n\n    QMutexLocker locker(&mMutex);\n    mGarbages << this;\n}\n"
  },
  {
    "path": "src/httpserver/asemanhttpserver.h",
    "content": "#ifndef ASEMANHTTPSERVER_H\n#define ASEMANHTTPSERVER_H\n\n#include <QJsonDocument>\n#include <QMutex>\n#include <QObject>\n#include <QUrlQuery>\n#include <QVariant>\n\n#include <functional>\n\n#include \"asemanhttpserver_global.h\"\n\nclass LIBQTASEMAN_HTTPSERVER_EXPORT AsemanHttpServer : public QObject\n{\n    Q_OBJECT\n    class Private;\npublic:\n    enum class HttpMethod {\n        DELETE         =  0,        ///< DELETE\n        GET            =  1,        ///< GET\n        HEAD           =  2,        ///< HEAD\n        POST           =  3,        ///< POST\n        PUT            =  4,        ///< PUT\n        /* pathological */\n        CONNECT        =  5,        ///< CONNECT\n        OPTIONS        =  6,        ///< OPTIONS\n        TRACE          =  7,        ///< TRACE\n        /* webdav */\n        COPY           =  8,        ///< COPY\n        LOCK           =  9,        ///< LOCK\n        MKCOL          = 10,        ///< MKCOL\n        MOVE           = 11,        ///< MOVE\n        PROPFIND       = 12,        ///< PROPFIND\n        PROPPATCH      = 13,        ///< PROPPATCH\n        SEARCH         = 14,        ///< SEARCH\n        UNLOCK         = 15,        ///< UNLOCK\n        BIND           = 16,        ///< BIND\n        REBIND         = 17,        ///< REBIND\n        UNBIND         = 18,        ///< UNBIND\n        ACL            = 19,        ///< ACL\n        /* subversion */\n        REPORT         = 20,        ///< REPORT\n        MKACTIVITY     = 21,        ///< MKACTIVITY\n        CHECKOUT       = 22,        ///< CHECKOUT\n        MERGE          = 23,        ///< MERGE\n        /* upnp */\n        MSEARCH        = 24,        ///< M-SEARCH\n        NOTIFY         = 25,        ///< NOTIFY\n        SUBSCRIBE      = 26,        ///< SUBSCRIBE\n        UNSUBSCRIBE    = 27,        ///< UNSUBSCRIBE\n        /* RFC-5789 */\n        PATCH          = 28,        ///< PATCH\n        PURGE          = 29,        ///< PURGE\n        /* CalDAV */\n        MKCALENDAR     = 30,        ///< MKCALENDAR\n        /* RFC-2068, section 19.6.1.2 */\n        LINK           = 31,        ///< LINK\n        UNLINK         = 32,        ///< UNLINK\n    };\n    enum class StatusCode {\n         CONTINUE                           = 100,\n         SWITCH_PROTOCOLS                   = 101,\n         OK                                 = 200,\n         CREATED                            = 201,\n         ACCEPTED                           = 202,\n         NON_AUTHORITATIVE_INFORMATION      = 203,\n         NO_CONTENT                         = 204,\n         RESET_CONTENT                      = 205,\n         PARTIAL_CONTENT                    = 206,\n         MULTI_STATUS                       = 207,\n         MULTIPLE_CHOICES                   = 300,\n         MOVED_PERMANENTLY                  = 301,\n         FOUND                              = 302,\n         SEE_OTHER                          = 303,\n         NOT_MODIFIED                       = 304,\n         USE_PROXY                          = 305,\n         TEMPORARY_REDIRECT                 = 307,\n         BAD_REQUEST                        = 400,\n         UNAUTHORIZED                       = 401,\n         PAYMENT_REQUIRED                   = 402,\n         FORBIDDEN                          = 403,\n         NOT_FOUND                          = 404,\n         METHOD_NOT_ALLOWED                 = 405,\n         NOT_ACCEPTABLE                     = 406,\n         PROXY_AUTHENTICATION_REQUIRED      = 407,\n         REQUEST_TIMEOUT                    = 408,\n         CONFLICT                           = 409,\n         GONE                               = 410,\n         LENGTH_REQUIRED                    = 411,\n         PRECONDITION_FAILED                = 412,\n         REQUEST_ENTITY_TOO_LARGE           = 413,\n         REQUEST_URI_TOO_LONG               = 414,\n         REQUEST_UNSUPPORTED_MEDIA_TYPE     = 415,\n         REQUESTED_RANGE_NOT_SATISFIABLE    = 416,\n         EXPECTATION_FAILED                 = 417,\n         INTERNAL_SERVER_ERROR              = 500,\n         NOT_IMPLEMENTED                    = 501,\n         BAD_GATEWAY                        = 502,\n         SERVICE_UNAVAILABLE                = 503,\n         GATEWAY_TIMEOUT                    = 504,\n         HTTP_VERSION_NOT_SUPPORTED         = 505\n    };\n\n    class Responder;\n    class Request;\n    class SyncResponder;\n\n    AsemanHttpServer(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanHttpServer();\n\n    using AsyncRouteCallback = std::function<void (const Request &request, Responder *responder)>;\n    using SyncRouteCallback = std::function<SyncResponder (const Request &request)>;\n\n    void route(const QString &path, HttpMethod method, AsyncRouteCallback callback, bool threaded = false);\n    void route(const QString &path, HttpMethod method, SyncRouteCallback callback, bool threaded = false);\n\npublic Q_SLOTS:\n    void listen(const QString &host, quint16 port);\n    void stop();\n\nQ_SIGNALS:\n\nprivate Q_SLOTS:\n    void response(void *core, const QByteArray &data, int status, const QString &contentType);\n\nprotected:\n    void cleanGarbages();\n\nprivate:\n    Private *p;\n};\n\n\nclass LIBQTASEMAN_HTTPSERVER_EXPORT AsemanHttpServer::SyncResponder\n{\n    friend class AsemanHttpServer;\npublic:\n    SyncResponder(const QJsonDocument &doc, StatusCode status = StatusCode::OK) : SyncResponder(doc.toJson(QJsonDocument::Compact), status, QStringLiteral(\"application/json\")) {}\n    SyncResponder(const QString &text, StatusCode status = StatusCode::OK, const QString &contentType = QString()) : SyncResponder(text.toUtf8(), status, contentType) {}\n    SyncResponder(const char *data, StatusCode status = StatusCode::OK, const QString &contentType = QString()) : SyncResponder(QByteArray(data), status, contentType) {}\n    SyncResponder(const QByteArray &data, StatusCode status = StatusCode::OK, const QString &contentType = QString()) : mData(data), mStatus(status), mContentType(contentType) {}\n\nprivate:\n    QByteArray mData;\n    StatusCode mStatus;\n    QString mContentType;\n};\n\nclass LIBQTASEMAN_HTTPSERVER_EXPORT AsemanHttpServer::Responder\n{\n    friend class AsemanHttpServer;\npublic:\n    void write(const QJsonDocument &doc, StatusCode status = StatusCode::OK) { write(doc.toJson(QJsonDocument::Compact), status, QStringLiteral(\"application/json\")); }\n    void write(const QString &text, StatusCode status = StatusCode::OK, const QString &contentType = QString()) { write(text.toUtf8(), status, contentType); }\n    void write(const QByteArray &data, StatusCode status = StatusCode::OK, const QString &contentType = QString());\n\nprivate:\n    Responder(AsemanHttpServer *parent, void *responseCore, bool threaded)\n        : mParent(parent), mResponseCore(responseCore), mThreaded(threaded) {}\n\n    AsemanHttpServer *mParent;\n    void *mResponseCore;\n    bool mThreaded;\n    static QList<Responder*> mGarbages;\n    static QMutex mMutex;\n};\n\nclass LIBQTASEMAN_HTTPSERVER_EXPORT AsemanHttpServer::Request\n{\n    friend class AsemanHttpServer;\npublic:\n    QByteArray body() const { return mBody; };\n    QHash<QByteArray, QByteArray> headers() const { return mHeaders; };\n    AsemanHttpServer::HttpMethod method() const { return mMethod; };\n    QString remoteAddress() const { return mRemoteAddress; };\n    QUrl url() const { return mUrl; };\n    QUrlQuery query() const { return mQuery; }\n\n    template<typename T>\n    T arg(const QString &key) const {\n        const auto &path = mUrl.path();\n\n        const auto &pathParts = path.split('/');\n        const auto &routePathParts = mRoutePath.split('/');\n\n        const QString &lookup = QStringLiteral(\"<\") + key + QStringLiteral(\">\");\n        int idx = routePathParts.indexOf(lookup);\n        if (idx > -1 && idx < pathParts.count())\n            return qvariant_cast<T>(QVariant::fromValue(pathParts.value(idx)));\n        else\n            return qvariant_cast<T>(QVariant());\n    }\n\n    template<typename T>\n    T query(const QString &key) const {\n        return qvariant_cast<T>(QVariant::fromValue(mQuery.queryItemValue(key)));\n    }\n\n    template<typename T>\n    T query(const QString &key, T defaultValue) const {\n        auto val = mQuery.queryItemValue(key);\n        if (val.isEmpty())\n            return defaultValue;\n\n        return qvariant_cast<T>(QVariant::fromValue(val));\n    }\n\nprivate:\n    Request() {}\n\n    QByteArray mBody;\n    QHash<QByteArray, QByteArray> mHeaders;\n    AsemanHttpServer::HttpMethod mMethod;\n    QString mRemoteAddress;\n    QUrl mUrl;\n    QUrlQuery mQuery;\n    QString mRoutePath;\n\n};\n\ntypedef AsemanHttpServer QAsemanHttpServer;\n\n#endif // ASEMANHTTPSERVER_H\n"
  },
  {
    "path": "src/httpserver/asemanhttpserver_global.h",
    "content": "#ifndef ASEMANHTTPSERVER_GLOBAL_H\n#define ASEMANHTTPSERVER_GLOBAL_H\n\n#include <QtCore/qglobal.h>\n\n#if !defined(QT_STATIC) && !defined(QASEMAN_STATIC)\n#if defined(LIBQTASEMAN_HTTPSERVER_LIBRARY)\n#  define LIBQTASEMAN_HTTPSERVER_EXPORT Q_DECL_EXPORT\n#else\n#  define LIBQTASEMAN_HTTPSERVER_EXPORT Q_DECL_IMPORT\n#endif\n#else\n#define LIBQTASEMAN_HTTPSERVER_EXPORT\n#endif\n\n#endif // ASEMANHTTPSERVER_GLOBAL_H\n"
  },
  {
    "path": "src/httpserver/httpserver.pro",
    "content": "load(qt_build_config)\n\nINCLUDEPATH += $$PWD $$PWD/qhttp/src $$PWD/qhttp/3rdparty $$PWD/qhttp/src/private/\nDEPENDPATH += $$PWD\n\nQT += core network\nQT -= gui\n\nTARGET = QAsemanHttpServer\nMODULE = asemanhttpserver\n\nload(qt_module)\n\nDEFINES *= QHTTP_MEMORY_LOG=0\nDEFINES *= QHTTP_EXPORT\nDEFINES *= LIBQTASEMAN_HTTPSERVER_LIBRARY\n\n# Joyent http_parser\nSOURCES  += $$PWD/qhttp/3rdparty/http-parser/http_parser.c\nHEADERS  += $$PWD/qhttp/3rdparty/http-parser/http_parser.h \\\n    asemanhttpserver_global.h\n\nSOURCES  += \\\n    qhttp/src/qhttpabstracts.cpp \\\n    qhttp/src/qhttpserverconnection.cpp \\\n    qhttp/src/qhttpserverrequest.cpp \\\n    qhttp/src/qhttpserverresponse.cpp \\\n    qhttp/src/qhttpserver.cpp \\\n    asemanhttpserver.cpp\n\nHEADERS  += \\\n    qhttp/src/qhttpfwd.hpp \\\n    qhttp/src/qhttpabstracts.hpp \\\n    qhttp/src/qhttpserverconnection.hpp \\\n    qhttp/src/qhttpserverrequest.hpp \\\n    qhttp/src/qhttpserverresponse.hpp \\\n    qhttp/src/qhttpserver.hpp \\\n    asemanhttpserver.h\n"
  },
  {
    "path": "src/multimedia/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanaudioencodersettings.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanaudiorecorder.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemancameracapture.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmultimedia_global.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanabstractcameracapturecore.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/private/asemannullcameracapturecore.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmultimediadatabase.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanaudioencodersettings.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanaudiorecorder.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemancameracapture.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanabstractcameracapturecore.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/private/asemannullcameracapturecore.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmultimediadatabase.cpp\n    PARENT_SCOPE)\n\nif (ANDROID)\n    set(SOURCE\n        ${SOURCE}\n        ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanandroidcameracapturecore.h\n        ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanandroidcameracapturecore.cpp\n        ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanandroidmultimedia.h\n        ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanandroidmultimedia.cpp\n        PARENT_SCOPE)\nendif ()\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/multimedia/asemanandroidmultimedia.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanandroidmultimedia.h\"\n\n#include <QDebug>\n#include <QSet>\n#include <QPair>\n#include <QList>\n#include <QDateTime>\n#include <QFile>\n#include <QCoreApplication>\n#include <QTimer>\n#include <QScreen>\n#include <QGuiApplication>\n#include <QPointer>\n#include <QColor>\n\n#include <jni.h>\n\n#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))\n#include <QJniEnvironment>\n#include <QJniObject>\ntypedef QJniEnvironment QAndroidJniEnvironment;\ntypedef QJniObject QAndroidJniObject;\n#else\n#include <QAndroidJniEnvironment>\n#include <QAndroidJniObject>\n#endif\n\nstatic QSet<AsemanAndroidMultimedia*> android_multimedia_objects;\nstatic QList< QPair<QString,QString> > java_layer_inc_share_buffer;\nstatic QList< QString > java_layer_inc_image_buffer;\n\nstatic bool aseman_jlayer_registerNativeMethods();\nstatic bool aseman_jlayer_native_methods_registered = aseman_jlayer_registerNativeMethods();\n\nclass AsemanAndroidMultimediaPrivate\n{\npublic:\n    QAndroidJniObject object;\n    QAndroidJniEnvironment env;\n};\n\nAsemanAndroidMultimedia::AsemanAndroidMultimedia() :\n    QObject()\n{\n    p = new AsemanAndroidMultimediaPrivate;\n    p->object = QAndroidJniObject(\"io/aseman/android/AsemanMultimedia\");\n\n#if defined(Q_OS_ANDROID) && defined(ASEMAN_STATIC_BUILD)\n    QMetaObject::invokeMethod( this, \"registerObject\", Qt::QueuedConnection );\n#else\n    registerObject();\n#endif\n\n    setImplemented(true);\n}\n\nvoid AsemanAndroidMultimedia::registerObject()\n{\n    android_multimedia_objects.insert(this);\n}\n\nAsemanAndroidMultimedia *AsemanAndroidMultimedia::instance()\n{\n    if(!aseman_jlayer_native_methods_registered)\n        aseman_jlayer_registerNativeMethods();\n\n    static QPointer<AsemanAndroidMultimedia> java_layer_instance;\n    if( !java_layer_instance )\n    {\n        java_layer_instance = new AsemanAndroidMultimedia();\n        if(QCoreApplication::instance())\n            QObject::connect(QCoreApplication::instance(), &QCoreApplication::destroyed, java_layer_instance, &AsemanAndroidMultimedia::deleteLater);\n    }\n\n    return java_layer_instance;\n}\n\nQString AsemanAndroidMultimedia::getAllMusics()\n{\n    QString res = p->object.callObjectMethod(__FUNCTION__, \"()Ljava/lang/String;\" ).toString();\n    return res;\n}\n\nQString AsemanAndroidMultimedia::getAllAlbums()\n{\n    QString res = p->object.callObjectMethod(__FUNCTION__, \"()Ljava/lang/String;\" ).toString();\n    return res;\n}\n\nQString AsemanAndroidMultimedia::getAllArtists()\n{\n    QString res = p->object.callObjectMethod(__FUNCTION__, \"()Ljava/lang/String;\" ).toString();\n    return res;\n}\n\nQString AsemanAndroidMultimedia::getArtistAlbums(const QString &artistId)\n{\n    QAndroidJniObject jartistId = QAndroidJniObject::fromString(artistId);\n    QString res = p->object.callObjectMethod(__FUNCTION__, \"(Ljava/lang/String;)Ljava/lang/String;\", jartistId.object<jstring>()).toString();\n    return res;\n}\n\nQString AsemanAndroidMultimedia::getArtistSongs(const QString &artistId)\n{\n    QAndroidJniObject jartistId = QAndroidJniObject::fromString(artistId);\n    QString res = p->object.callObjectMethod(__FUNCTION__, \"(Ljava/lang/String;)Ljava/lang/String;\", jartistId.object<jstring>()).toString();\n    return res;\n}\n\nQString AsemanAndroidMultimedia::getAlbumSongs(const QString &albumId)\n{\n    QAndroidJniObject jalbumId = QAndroidJniObject::fromString(albumId);\n    QString res = p->object.callObjectMethod(__FUNCTION__, \"(Ljava/lang/String;)Ljava/lang/String;\", jalbumId.object<jstring>()).toString();\n    return res;\n}\n\nvoid AsemanAndroidMultimedia::setImplemented(bool stt)\n{\n    jboolean jstt = stt;\n    p->object.callMethod<jboolean>(__FUNCTION__, \"(Z)Z\", jstt);\n}\n\nAsemanAndroidMultimedia::~AsemanAndroidMultimedia()\n{\n    android_multimedia_objects.remove(this);\n    delete p;\n}\n\nbool aseman_jlayer_registerNativeMethods() {\n    if(aseman_jlayer_native_methods_registered)\n        return true;\n\n    QAndroidJniObject javaClass(\"io/aseman/android/AsemanMultimedia\");\n    QAndroidJniEnvironment env;\n    jclass objectClass = env->GetObjectClass(javaClass.object<jobject>());\n\n    env->DeleteLocalRef(objectClass);\n    return true;\n}\n"
  },
  {
    "path": "src/multimedia/asemanandroidmultimedia.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANJAVALAYER_H\n#define ASEMANJAVALAYER_H\n\n#include <QObject>\n\n#include \"asemanmultimedia_global.h\"\n\nclass AsemanAndroidMultimediaPrivate;\nclass LIBQTASEMAN_MULTIMEDIA_EXPORT AsemanAndroidMultimedia : public QObject\n{\n    Q_OBJECT\npublic:\n    AsemanAndroidMultimedia();\n    virtual ~AsemanAndroidMultimedia();\n\n    static AsemanAndroidMultimedia *instance();\n\npublic Q_SLOTS:\n    QString getAllMusics();\n    QString getAllAlbums();\n    QString getAllArtists();\n    QString getArtistAlbums(const QString &artistId);\n    QString getArtistSongs(const QString &artistId);\n    QString getAlbumSongs(const QString &albumId);\n\nprivate Q_SLOTS:\n    void registerObject();\n\nprotected:\n    void setImplemented(bool stt);\n\nprivate:\n    AsemanAndroidMultimediaPrivate *p;\n};\n\ntypedef AsemanAndroidMultimedia QAsemanAndroidMultimedia;\n\n#endif // ASEMANJAVALAYER_H\n"
  },
  {
    "path": "src/multimedia/asemanaudioencodersettings.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanaudioencodersettings.h\"\n\n#include <QAudioEncoderSettings>\n\nclass AsemanAudioEncoderSettingsPrivate\n{\npublic:\n    QAudioEncoderSettings settings;\n};\n\nAsemanAudioEncoderSettings::AsemanAudioEncoderSettings(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanAudioEncoderSettingsPrivate;\n}\n\nint AsemanAudioEncoderSettings::bitRate() const\n{\n    return p->settings.bitRate();\n}\n\nvoid AsemanAudioEncoderSettings::setBitRate(int rate)\n{\n    if(p->settings.bitRate() == rate)\n        return;\n\n    p->settings.setBitRate(rate);\n    Q_EMIT bitRateChanged();\n}\n\nint AsemanAudioEncoderSettings::channelCount() const\n{\n    return p->settings.channelCount();\n}\n\nvoid AsemanAudioEncoderSettings::setChannelCount(int channels)\n{\n    if(p->settings.channelCount() == channels)\n        return;\n\n    p->settings.setChannelCount(channels);\n    Q_EMIT channelCountChanged();\n}\n\nQString AsemanAudioEncoderSettings::codec() const\n{\n    return p->settings.codec();\n}\n\nvoid AsemanAudioEncoderSettings::setCodec(const QString &cdc)\n{\n    if(p->settings.codec() == cdc)\n        return;\n\n    p->settings.setCodec(cdc);\n    Q_EMIT codecChanged();\n}\n\nint AsemanAudioEncoderSettings::encodingMode() const\n{\n    return p->settings.encodingMode();\n}\n\nvoid AsemanAudioEncoderSettings::setEncodingMode(int mode)\n{\n    if(p->settings.encodingMode() == mode)\n        return;\n\n    p->settings.setEncodingMode(static_cast<QMultimedia::EncodingMode>(mode));\n    Q_EMIT encodingModeChanged();\n}\n\nQVariantMap AsemanAudioEncoderSettings::encodingOptions() const\n{\n    return p->settings.encodingOptions();\n}\n\nvoid AsemanAudioEncoderSettings::setEncodingOptions(const QVariantMap &options)\n{\n    if(p->settings.encodingOptions() == options)\n        return;\n\n    p->settings.setEncodingOptions(options);\n    Q_EMIT encodingOptionsChanged();\n}\n\nint AsemanAudioEncoderSettings::quality() const\n{\n    return p->settings.quality();\n}\n\nvoid AsemanAudioEncoderSettings::setQuality(int quality)\n{\n    if(p->settings.quality() == quality)\n        return;\n\n    p->settings.setQuality(static_cast<QMultimedia::EncodingQuality>(quality));\n    Q_EMIT qualityChanged();\n}\n\nint AsemanAudioEncoderSettings::sampleRate() const\n{\n    return p->settings.sampleRate();\n}\n\nvoid AsemanAudioEncoderSettings::setSampleRate(int rate)\n{\n    if(p->settings.sampleRate() == rate)\n        return;\n\n    p->settings.setSampleRate(rate);\n    Q_EMIT sampleRateChanged();\n}\n\nQAudioEncoderSettings AsemanAudioEncoderSettings::exportSettings() const\n{\n    return p->settings;\n}\n\nAsemanAudioEncoderSettings::~AsemanAudioEncoderSettings()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/multimedia/asemanaudioencodersettings.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANAUDIOENCODERSETTINGS_H\n#define ASEMANAUDIOENCODERSETTINGS_H\n\n#include <QObject>\n#include <QVariant>\n#include <QMultimedia>\n\n#include \"asemanmultimedia_global.h\"\n\nclass QAudioEncoderSettings;\nclass AsemanAudioEncoderSettingsPrivate;\nclass LIBQTASEMAN_MULTIMEDIA_EXPORT AsemanAudioEncoderSettings : public QObject\n{\n    Q_OBJECT\n    Q_ENUMS(EncodingQuality)\n    Q_ENUMS(EncodingMode)\n\n    Q_PROPERTY(int bitRate READ bitRate WRITE setBitRate NOTIFY bitRateChanged)\n    Q_PROPERTY(int channelCount READ channelCount WRITE setChannelCount NOTIFY channelCountChanged)\n    Q_PROPERTY(QString codec READ codec WRITE setCodec NOTIFY codecChanged)\n    Q_PROPERTY(int encodingMode READ encodingMode WRITE setEncodingMode NOTIFY encodingModeChanged)\n    Q_PROPERTY(QVariantMap encodingOptions READ encodingOptions WRITE setEncodingOptions NOTIFY encodingOptionsChanged)\n    Q_PROPERTY(int quality READ quality WRITE setQuality NOTIFY qualityChanged)\n    Q_PROPERTY(int sampleRate READ sampleRate WRITE setSampleRate NOTIFY sampleRateChanged)\n\npublic:\n    enum EncodingQuality\n    {\n        VeryLowQuality = QMultimedia::VeryLowQuality,\n        LowQuality = QMultimedia::LowQuality,\n        NormalQuality = QMultimedia::NormalQuality,\n        HighQuality = QMultimedia::HighQuality,\n        VeryHighQuality = QMultimedia::VeryHighQuality\n    };\n\n    enum EncodingMode\n    {\n        ConstantQualityEncoding = QMultimedia::ConstantQualityEncoding,\n        ConstantBitRateEncoding = QMultimedia::ConstantBitRateEncoding,\n        AverageBitRateEncoding = QMultimedia::AverageBitRateEncoding,\n        TwoPassEncoding = QMultimedia::TwoPassEncoding\n    };\n\n    AsemanAudioEncoderSettings(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanAudioEncoderSettings();\n\n    int bitRate() const;\n    void setBitRate(int rate);\n\n    int channelCount() const;\n    void setChannelCount(int channels);\n\n    QString codec() const;\n    void setCodec(const QString & codec);\n\n    int encodingMode() const;\n    void setEncodingMode(int mode);\n\n    QVariantMap encodingOptions() const;\n    void setEncodingOptions(const QVariantMap & options);\n\n    int quality() const;\n    void setQuality(int quality);\n\n    int sampleRate() const;\n    void setSampleRate(int rate);\n\n    QAudioEncoderSettings exportSettings() const;\n\nQ_SIGNALS:\n    void bitRateChanged();\n    void channelCountChanged();\n    void codecChanged();\n    void encodingModeChanged();\n    void encodingOptionsChanged();\n    void qualityChanged();\n    void sampleRateChanged();\n\nprivate:\n    AsemanAudioEncoderSettingsPrivate *p;\n};\n\ntypedef AsemanAudioEncoderSettings QAsemanAudioEncoderSettings;\n\n#endif // ASEMANAUDIOENCODERSETTINGS_H\n"
  },
  {
    "path": "src/multimedia/asemanaudiorecorder.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanaudiorecorder.h\"\n#include \"asemanaudioencodersettings.h\"\n\n#include <QAudioRecorder>\n#include <QPointer>\n#include <QDebug>\n\nclass AsemanAudioRecorderPrivate\n{\npublic:\n    QPointer<AsemanAudioEncoderSettings> encoderSettings;\n    QAudioRecorder *recorder;\n};\n\nAsemanAudioRecorder::AsemanAudioRecorder(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanAudioRecorderPrivate;\n    p->recorder = new QAudioRecorder(this);\n\n    connect(p->recorder, &QAudioRecorder::stateChanged, this, &AsemanAudioRecorder::stateChanged);\n    connect(p->recorder, &QAudioRecorder::statusChanged, this, &AsemanAudioRecorder::statusChanged);\n    connect(p->recorder, static_cast<void (QAudioRecorder::*)(bool)>(&QAudioRecorder::availabilityChanged), this, &AsemanAudioRecorder::availableChanged);\n    connect(p->recorder, &QAudioRecorder::mutedChanged, this, &AsemanAudioRecorder::muteChanged);\n    connect(p->recorder, &QAudioRecorder::volumeChanged, this, &AsemanAudioRecorder::volumeChanged);\n    connect(p->recorder, static_cast<void (QAudioRecorder::*)(bool)>(&QAudioRecorder::availabilityChanged), this, &AsemanAudioRecorder::availabilityChanged);\n}\n\nAsemanAudioEncoderSettings *AsemanAudioRecorder::encoderSettings() const\n{\n    return p->encoderSettings;\n}\n\nvoid AsemanAudioRecorder::setEncoderSettings(AsemanAudioEncoderSettings *settings)\n{\n    if(p->encoderSettings == settings)\n        return;\n\n    p->encoderSettings = settings;\n    Q_EMIT encoderSettingsChanged();\n}\n\nvoid AsemanAudioRecorder::setOutput(const QUrl &url)\n{\n    if(p->recorder->outputLocation() == url)\n        return;\n\n    p->recorder->setOutputLocation(url);\n    Q_EMIT outputChanged();\n}\n\nQUrl AsemanAudioRecorder::output() const\n{\n    return p->recorder->outputLocation();\n}\n\nbool AsemanAudioRecorder::mute() const\n{\n    return p->recorder->isMuted();\n}\n\nvoid AsemanAudioRecorder::setMute(bool stt)\n{\n    if(p->recorder->isMuted() == stt)\n        return;\n\n    p->recorder->setMuted(stt);\n}\n\nqreal AsemanAudioRecorder::volume() const\n{\n    return p->recorder->volume();\n}\n\nvoid AsemanAudioRecorder::setVolume(qreal vol)\n{\n    if(p->recorder->volume() == vol)\n        return;\n\n    p->recorder->setVolume(vol);\n}\n\nvoid AsemanAudioRecorder::setAudioInput(const QString &input)\n{\n    if(p->recorder->audioInput() == input)\n        return;\n\n    p->recorder->setAudioInput(input);\n    Q_EMIT audioInputChanged();\n}\n\nQString AsemanAudioRecorder::audioInput() const\n{\n    return p->recorder->audioInput();\n}\n\nQStringList AsemanAudioRecorder::audioInputs() const\n{\n    return p->recorder->audioInputs();\n}\n\nbool AsemanAudioRecorder::available() const\n{\n    return p->recorder->isAvailable();\n}\n\nint AsemanAudioRecorder::availability() const\n{\n    return p->recorder->availability();\n}\n\nint AsemanAudioRecorder::state() const\n{\n    return p->recorder->state();\n}\n\nint AsemanAudioRecorder::status() const\n{\n    return p->recorder->status();\n}\n\nvoid AsemanAudioRecorder::stop()\n{\n    p->recorder->stop();\n}\n\nvoid AsemanAudioRecorder::pause()\n{\n    p->recorder->pause();\n}\n\nvoid AsemanAudioRecorder::record()\n{\n    p->recorder->setEncodingSettings( p->encoderSettings? p->encoderSettings->exportSettings() : QAudioEncoderSettings() );\n    p->recorder->record();\n}\n\nAsemanAudioRecorder::~AsemanAudioRecorder()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/multimedia/asemanaudiorecorder.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANAUDIORECORDER_H\n#define ASEMANAUDIORECORDER_H\n\n#include <QObject>\n#include <QUrl>\n#include <QMediaRecorder>\n#include <QStringList>\n\n#include \"asemanmultimedia_global.h\"\n\nclass AsemanAudioEncoderSettings;\nclass AsemanAudioRecorderPrivate;\nclass LIBQTASEMAN_MULTIMEDIA_EXPORT AsemanAudioRecorder : public QObject\n{\n    Q_OBJECT\n    Q_ENUMS(State)\n    Q_ENUMS(Status)\n\n    Q_PROPERTY(AsemanAudioEncoderSettings* encoderSettings READ encoderSettings WRITE setEncoderSettings NOTIFY encoderSettingsChanged)\n    Q_PROPERTY(QUrl output READ output WRITE setOutput NOTIFY outputChanged)\n    Q_PROPERTY(bool mute READ mute WRITE setMute NOTIFY muteChanged)\n    Q_PROPERTY(bool available READ available NOTIFY availableChanged)\n    Q_PROPERTY(int availability READ availability NOTIFY availabilityChanged)\n    Q_PROPERTY(int state READ state NOTIFY stateChanged)\n    Q_PROPERTY(int status READ status NOTIFY statusChanged)\n    Q_PROPERTY(qreal volume READ volume WRITE setVolume NOTIFY volumeChanged)\n    Q_PROPERTY(QString audioInput READ audioInput WRITE setAudioInput NOTIFY audioInputChanged)\n    Q_PROPERTY(QStringList audioInputs READ audioInputs NOTIFY audioInputsChanged)\n\npublic:\n    enum State\n    {\n        StoppedState = QMediaRecorder::StoppedState,\n        RecordingState = QMediaRecorder::RecordingState,\n        PausedState = QMediaRecorder::PausedState\n    };\n\n    enum Status {\n        UnavailableStatus = QMediaRecorder::UnavailableStatus,\n        UnloadedStatus = QMediaRecorder::UnloadedStatus,\n        LoadingStatus = QMediaRecorder::LoadingStatus,\n        LoadedStatus = QMediaRecorder::LoadedStatus,\n        StartingStatus = QMediaRecorder::StartingStatus,\n        RecordingStatus = QMediaRecorder::RecordingStatus,\n        PausedStatus = QMediaRecorder::PausedStatus,\n        FinalizingStatus = QMediaRecorder::FinalizingStatus\n    };\n\n    AsemanAudioRecorder(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanAudioRecorder();\n\n    AsemanAudioEncoderSettings *encoderSettings() const;\n    void setEncoderSettings(AsemanAudioEncoderSettings *settings);\n\n    void setOutput(const QUrl &url);\n    QUrl output() const;\n\n    bool mute() const;\n    void setMute(bool stt);\n\n    qreal volume() const;\n    void setVolume(qreal vol);\n\n    void setAudioInput(const QString &input);\n    QString audioInput() const;\n    QStringList audioInputs() const;\n\n    bool available() const;\n    int availability() const;\n    int state() const;\n    int status() const;\n\npublic Q_SLOTS:\n    void stop();\n    void pause();\n    void record();\n\nQ_SIGNALS:\n    void encoderSettingsChanged();\n    void outputChanged();\n    void muteChanged();\n    void volumeChanged();\n    void availableChanged();\n    void availabilityChanged();\n    void stateChanged();\n    void statusChanged();\n    void audioInputChanged();\n    void audioInputsChanged();\n\nprivate:\n    AsemanAudioRecorderPrivate *p;\n};\n\ntypedef AsemanAudioRecorder QAsemanAudioRecorder;\n\n#endif // ASEMANAUDIORECORDER_H\n"
  },
  {
    "path": "src/multimedia/asemancameracapture.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemancameracapture.h\"\n\n#ifdef Q_OS_ANDROID\n#include \"private/asemanandroidcameracapturecore.h\"\ntypedef AsemanAndroidCameraCaptureCore CameraCaptureCore;\n#else\n#include \"private/asemannullcameracapturecore.h\"\ntypedef AsemanNullCameraCaptureCore CameraCaptureCore;\n#endif\n\nclass AsemanCameraCapturePrivate\n{\npublic:\n    AsemanAbstractCameraCaptureCore *core;\n};\n\nAsemanCameraCapture::AsemanCameraCapture(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanCameraCapturePrivate;\n    p->core = new CameraCaptureCore(this);\n\n    connect(p->core, &AsemanAbstractCameraCaptureCore::imageCaptured,\n            this, &AsemanCameraCapture::imageCaptured, Qt::QueuedConnection);\n}\n\nint AsemanCameraCapture::capture(const QString &dest, AsemanCameraCapture::CameraFace face)\n{\n    return p->core->capture(dest, face);\n}\n\nAsemanCameraCapture::~AsemanCameraCapture()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/multimedia/asemancameracapture.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANCAMERACAPTURE_H\n#define ASEMANCAMERACAPTURE_H\n\n#include <QObject>\n\n#include \"asemanmultimedia_global.h\"\n\nclass AsemanCameraCapturePrivate;\nclass LIBQTASEMAN_MULTIMEDIA_EXPORT AsemanCameraCapture : public QObject\n{\n    Q_OBJECT\npublic:\n    enum CameraFace {\n        CameraFacingFront,\n        CameraFacingBack\n    };\n\n    AsemanCameraCapture(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanCameraCapture();\n\npublic Q_SLOTS:\n    int capture(const QString &dest, AsemanCameraCapture::CameraFace face);\n\nQ_SIGNALS:\n    void imageCaptured(int id, const QString &path);\n\nprivate:\n    AsemanCameraCapturePrivate *p;\n};\n\ntypedef AsemanCameraCapture QAsemanCameraCapture;\n\n#endif // ASEMANCAMERACAPTURE_H\n"
  },
  {
    "path": "src/multimedia/asemanmultimedia_global.h",
    "content": "#ifndef ASEMAN_MULTIMEDIA_GLOBAL_H\n#define ASEMAN_MULTIMEDIA_GLOBAL_H\n\n#include <QtCore/qglobal.h>\n\n#if !defined(QT_STATIC) && !defined(QASEMAN_STATIC)\n#if defined(LIBQTASEMAN_MULTIMEDIA_LIBRARY)\n#  define LIBQTASEMAN_MULTIMEDIA_EXPORT Q_DECL_EXPORT\n#else\n#  define LIBQTASEMAN_MULTIMEDIA_EXPORT Q_DECL_IMPORT\n#endif\n#else\n#define LIBQTASEMAN_MULTIMEDIA_EXPORT\n#endif\n\n#endif // ASEMAN_MULTIMEDIA_GLOBAL_H\n"
  },
  {
    "path": "src/multimedia/asemanmultimediadatabase.cpp",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanmultimediadatabase.h\"\n\n#include <QJsonDocument>\n\n#ifdef Q_OS_ANDROID\n#include \"asemanandroidmultimedia.h\"\n#endif\n\nclass AsemanMultimediaDatabase::Private\n{\npublic:\n};\n\nAsemanMultimediaDatabase::AsemanMultimediaDatabase(QObject *parent) :\n    QObject(parent)\n{\n    p = new Private;\n}\n\nQVariantList AsemanMultimediaDatabase::getAllMusics() const\n{\n#ifdef Q_OS_ANDROID\n    return QJsonDocument::fromJson( AsemanAndroidMultimedia::instance()->getAllMusics().toUtf8() ).toVariant().toList();\n#else\n    return QVariantList();\n#endif\n}\n\nQVariantList AsemanMultimediaDatabase::getAllAlbums() const\n{\n#ifdef Q_OS_ANDROID\n    return QJsonDocument::fromJson( AsemanAndroidMultimedia::instance()->getAllAlbums().toUtf8() ).toVariant().toList();\n#else\n    return QVariantList();\n#endif\n}\n\nQVariantList AsemanMultimediaDatabase::getAllArtists() const\n{\n#ifdef Q_OS_ANDROID\n    return QJsonDocument::fromJson( AsemanAndroidMultimedia::instance()->getAllArtists().toUtf8() ).toVariant().toList();\n#else\n    return QVariantList();\n#endif\n}\n\nQVariantList AsemanMultimediaDatabase::getArtistAlbums(const QString &artistId) const\n{\n#ifdef Q_OS_ANDROID\n    return QJsonDocument::fromJson( AsemanAndroidMultimedia::instance()->getArtistAlbums(artistId).toUtf8() ).toVariant().toList();\n#else\n    return QVariantList();\n#endif\n}\n\nQVariantList AsemanMultimediaDatabase::getArtistSongs(const QString &artistId) const\n{\n#ifdef Q_OS_ANDROID\n    return QJsonDocument::fromJson( AsemanAndroidMultimedia::instance()->getArtistSongs(artistId).toUtf8() ).toVariant().toList();\n#else\n    return QVariantList();\n#endif\n}\n\nQVariantList AsemanMultimediaDatabase::getAlbumSongs(const QString &albumId) const\n{\n#ifdef Q_OS_ANDROID\n    return QJsonDocument::fromJson( AsemanAndroidMultimedia::instance()->getAlbumSongs(albumId).toUtf8() ).toVariant().toList();\n#else\n    return QVariantList();\n#endif\n}\n\nAsemanMultimediaDatabase::~AsemanMultimediaDatabase()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/multimedia/asemanmultimediadatabase.h",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANMULTIMEDIADATABASE_H\n#define ASEMANMULTIMEDIADATABASE_H\n\n#include <QObject>\n#include <QVariant>\n\n#include \"asemanmultimedia_global.h\"\n\nclass LIBQTASEMAN_MULTIMEDIA_EXPORT AsemanMultimediaDatabase : public QObject\n{\n    Q_OBJECT\n    class Private;\n\npublic:\n    AsemanMultimediaDatabase(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanMultimediaDatabase();\n\nQ_SIGNALS:\n\npublic Q_SLOTS:\n    QVariantList getAllMusics() const;\n    QVariantList getAllAlbums() const;\n    QVariantList getAllArtists() const;\n    QVariantList getArtistAlbums(const QString &artistId) const;\n    QVariantList getArtistSongs(const QString &artistId) const;\n    QVariantList getAlbumSongs(const QString &albumId) const;\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanMultimediaDatabase QAsemanMultimediaDatabase;\n\n#endif // ASEMANMULTIMEDIADATABASE_H\n"
  },
  {
    "path": "src/multimedia/multimedia.pri",
    "content": "INCLUDEPATH += $$PWD\nDEPENDPATH += $$PWD\n\nQT += core multimedia\n\nHEADERS += \\\n    $$PWD/asemanaudioencodersettings.h \\\n    $$PWD/asemanaudiorecorder.h \\\n    $$PWD/asemancameracapture.h \\\n    $$PWD/asemanmultimedia_global.h \\\n    $$PWD/private/asemanabstractcameracapturecore.h \\\n    $$PWD/private/asemannullcameracapturecore.h \\\n    $$PWD/asemanmultimediadatabase.h\n\nSOURCES += \\\n    $$PWD/asemanaudioencodersettings.cpp \\\n    $$PWD/asemanaudiorecorder.cpp \\\n    $$PWD/asemancameracapture.cpp \\\n    $$PWD/private/asemanabstractcameracapturecore.cpp \\\n    $$PWD/private/asemannullcameracapturecore.cpp \\\n    $$PWD/asemanmultimediadatabase.cpp\n\nandroid: {\n    lessThan(QT_MAJOR_VERSION, 6) QT += androidextras\n    HEADERS += \\\n        $$PWD/private/asemanandroidcameracapturecore.h \\\n        $$PWD/asemanandroidmultimedia.h\n    SOURCES += \\\n        $$PWD/private/asemanandroidcameracapturecore.cpp \\\n        $$PWD/asemanandroidmultimedia.cpp\n}\n\n"
  },
  {
    "path": "src/multimedia/multimedia.pro",
    "content": "load(qt_build_config)\n\nTARGET = QAsemanMultimedia\nQT += asemancore\n\nMODULE = asemanmultimedia\n\nload(qt_module)\n\nDEFINES += LIBQTASEMAN_MULTIMEDIA_LIBRARY\n\ninclude (multimedia.pri)\n\n"
  },
  {
    "path": "src/multimedia/private/asemanabstractcameracapturecore.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanabstractcameracapturecore.h\"\n\nAsemanAbstractCameraCaptureCore::AsemanAbstractCameraCaptureCore(QObject *parent) :\n    QObject(parent)\n{\n\n}\n\nAsemanAbstractCameraCaptureCore::~AsemanAbstractCameraCaptureCore()\n{\n\n}\n"
  },
  {
    "path": "src/multimedia/private/asemanabstractcameracapturecore.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANABSTRACTCAMERACAPTURECORE_H\n#define ASEMANABSTRACTCAMERACAPTURECORE_H\n\n#include <QObject>\n#include \"../asemancameracapture.h\"\n\n#include \"asemanmultimedia_global.h\"\n\nclass LIBQTASEMAN_MULTIMEDIA_EXPORT AsemanAbstractCameraCaptureCore : public QObject\n{\n    Q_OBJECT\npublic:\n    AsemanAbstractCameraCaptureCore(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanAbstractCameraCaptureCore();\n\n    virtual int capture(const QString &dest, AsemanCameraCapture::CameraFace face) = 0;\n\nQ_SIGNALS:\n    void imageCaptured(int id, const QString &path);\n};\n\n#endif // ASEMANABSTRACTCAMERACAPTURECORE_H\n"
  },
  {
    "path": "src/multimedia/private/asemanandroidcameracapturecore.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanandroidcameracapturecore.h\"\n\n#include <QDebug>\n#include <QPointer>\n#include <QString>\n#include <QThread>\n#include <QCoreApplication>\n\n#include <jni.h>\n\n#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))\n#include <QJniEnvironment>\n#include <QJniObject>\ntypedef QJniEnvironment QAndroidJniEnvironment;\ntypedef QJniObject QAndroidJniObject;\n#else\n#include <QAndroidJniEnvironment>\n#include <QAndroidJniObject>\n#endif\n\nQHash<jobject, AsemanAndroidCameraCaptureCore*> android_camera_capture_objects;\n\nAsemanAndroidCameraCaptureCore *getCameraCaptureObject(jobject obj)\n{\n    QHashIterator<jobject, AsemanAndroidCameraCaptureCore*> i(android_camera_capture_objects);\n    while(i.hasNext())\n    {\n        i.next();\n        if(QAndroidJniObject(i.key()) == QAndroidJniObject(obj))\n            return i.value();\n    }\n\n    return 0;\n}\n\nclass AsemanAndroidCameraCaptureCorePrivate\n{\npublic:\n    QAndroidJniObject object;\n    QAndroidJniEnvironment env;\n    int idIndexs;\n};\n\nAsemanAndroidCameraCaptureCore::AsemanAndroidCameraCaptureCore(QObject *parent) :\n    AsemanAbstractCameraCaptureCore(parent)\n{\n    p = new AsemanAndroidCameraCaptureCorePrivate;\n    p->idIndexs = 1000;\n    p->object = QAndroidJniObject(\"io/aseman/android/extra/AsemanCameraCapture\");\n    android_camera_capture_objects.insert(p->object.object<jobject>(), this);\n}\n\nint AsemanAndroidCameraCaptureCore::capture(const QString &dest, AsemanCameraCapture::CameraFace face)\n{\n    p->idIndexs++;\n    jboolean jface = (face==AsemanCameraCapture::CameraFacingFront?true:false);\n    jstring jdest = p->env->NewString(reinterpret_cast<const jchar*>(dest.constData()), dest.length());\n    p->object.callMethod<void>(__FUNCTION__, \"(ILjava/lang/String;Z)V\", p->idIndexs, jdest, jface);\n    return p->idIndexs;\n}\n\nAsemanAndroidCameraCaptureCore::~AsemanAndroidCameraCaptureCore()\n{\n    android_camera_capture_objects.remove(p->object.object<jobject>());\n    delete p;\n}\n\nstatic void imageCaptured( JNIEnv *env, jobject obj, jint id, jstring path)\n{\n    AsemanAndroidCameraCaptureCore *smc = getCameraCaptureObject(obj);\n    if(!smc)\n        return;\n\n    jboolean a;\n    QString qpath = env->GetStringUTFChars(path,&a);\n    int cid = id;\n    QMetaObject::invokeMethod(smc, \"imageCaptured\", Q_ARG(int,cid), Q_ARG(QString, qpath));\n}\n\nbool aseman_android_camcap_registerNativeMethods() {\n    JNINativeMethod methods[] {{\"_imageCaptured\", \"(ILjava/lang/String;)V\", reinterpret_cast<void *>(imageCaptured)}};\n\n    QAndroidJniObject javaClass(\"io/aseman/android/extra/AsemanCameraCapture\");\n    QAndroidJniEnvironment env;\n    jclass objectClass = env->GetObjectClass(javaClass.object<jobject>());\n\n    env->RegisterNatives(objectClass, methods, sizeof(methods) / sizeof(methods[0]));\n\n    env->DeleteLocalRef(objectClass);\n    return true;\n}\n\nconst bool aseman_android_camcap_native_methods_registered = aseman_android_camcap_registerNativeMethods();\n"
  },
  {
    "path": "src/multimedia/private/asemanandroidcameracapturecore.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANANDROIDCAMERACAPTURE_H\n#define ASEMANANDROIDCAMERACAPTURE_H\n\n#include \"asemanabstractcameracapturecore.h\"\n\n#include \"asemanmultimedia_global.h\"\n\nclass AsemanAndroidCameraCaptureCorePrivate;\nclass LIBQTASEMAN_MULTIMEDIA_EXPORT AsemanAndroidCameraCaptureCore : public AsemanAbstractCameraCaptureCore\n{\n    Q_OBJECT\npublic:\n    AsemanAndroidCameraCaptureCore(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanAndroidCameraCaptureCore();\n\n    int capture(const QString &dest, AsemanCameraCapture::CameraFace face);\n\nQ_SIGNALS:\n    void imageCaptured(int id, const QString &path);\n\nprivate:\n    AsemanAndroidCameraCaptureCorePrivate *p;\n};\n\n#endif // ASEMANANDROIDCAMERACAPTURE_H\n"
  },
  {
    "path": "src/multimedia/private/asemannullcameracapturecore.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemannullcameracapturecore.h\"\n\nAsemanNullCameraCaptureCore::AsemanNullCameraCaptureCore(QObject *parent) :\n    AsemanAbstractCameraCaptureCore(parent)\n{\n\n}\n\nint AsemanNullCameraCaptureCore::capture(const QString &dest, AsemanCameraCapture::CameraFace face)\n{\n    Q_UNUSED(face)\n    Q_EMIT imageCaptured(0, dest);\n    return 0;\n}\n\nAsemanNullCameraCaptureCore::~AsemanNullCameraCaptureCore()\n{\n\n}\n"
  },
  {
    "path": "src/multimedia/private/asemannullcameracapturecore.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANNULLCAMERACAPTURECORE_H\n#define ASEMANNULLCAMERACAPTURECORE_H\n\n#include \"asemanabstractcameracapturecore.h\"\n\n#include \"asemanmultimedia_global.h\"\n\nclass LIBQTASEMAN_MULTIMEDIA_EXPORT AsemanNullCameraCaptureCore : public AsemanAbstractCameraCaptureCore\n{\n    Q_OBJECT\npublic:\n    AsemanNullCameraCaptureCore(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanNullCameraCaptureCore();\n\n    int capture(const QString &dest, AsemanCameraCapture::CameraFace face);\n};\n\n#endif // ASEMANNULLCAMERACAPTURECORE_H\n"
  },
  {
    "path": "src/network/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandownloader.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanfiledownloaderqueue.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanfiledownloaderqueueitem.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanhostchecker.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkproxy.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemannetwork_global.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemansocketinterface.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkrequestobject.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkrequestmanager.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkquickobject.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkrequestreply.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandownloader.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanfiledownloaderqueue.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanfiledownloaderqueueitem.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanhostchecker.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkproxy.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemansocketinterface.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkrequestobject.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkrequestmanager.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkquickobject.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkrequestreply.cpp\n    PARENT_SCOPE)\n\nif (!WASM)\n    set(SOURCE\n        ${SOURCE}\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkmanager.h\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworksleepmanager.h\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkmanageritem.h\n\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkmanager.cpp\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworksleepmanager.cpp\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemannetworkmanageritem.cpp\n        PARENT_SCOPE)\nendif ()\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/network/asemandownloader.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemandownloader.h\"\n\n#include <QNetworkAccessManager>\n#include <QNetworkReply>\n#include <QNetworkRequest>\n#include <QUrl>\n#include <QSslError>\n#include <QFile>\n#include <QDir>\n\nclass AsemanDownloaderPrivate\n{\npublic:\n    QNetworkAccessManager *manager;\n    QNetworkReply *reply;\n\n    qint64 recieved_bytes;\n    qint64 total_bytes;\n\n    QString dest;\n    QString path;\n\n    int downloader_id;\n    QVariantMap header;\n    bool ignoreSslErrors;\n};\n\nAsemanDownloader::AsemanDownloader(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanDownloaderPrivate;\n    p->reply = 0;\n    p->recieved_bytes = 0;\n    p->total_bytes = 1;\n    p->manager = 0;\n    p->downloader_id = -1;\n    p->ignoreSslErrors = false;\n}\n\nqint64 AsemanDownloader::recievedBytes() const\n{\n    return p->recieved_bytes;\n}\n\nqint64 AsemanDownloader::totalBytes() const\n{\n    return p->total_bytes;\n}\n\nvoid AsemanDownloader::setDestination(const QString &dest)\n{\n    if( p->dest == dest )\n        return;\n\n    p->dest = dest;\n    Q_EMIT destinationChanged();\n}\n\nQString AsemanDownloader::destination() const\n{\n    return p->dest;\n}\n\nvoid AsemanDownloader::setPath(const QString &path)\n{\n    if( p->path == path )\n        return;\n\n    p->path = path;\n    Q_EMIT pathChanged();\n}\n\nQString AsemanDownloader::path() const\n{\n    return p->path;\n}\n\nvoid AsemanDownloader::setDownloaderId(int id)\n{\n    if( p->downloader_id == id )\n        return;\n\n    p->downloader_id = id;\n    Q_EMIT downloaderIdChanged();\n}\n\nint AsemanDownloader::downloaderId() const\n{\n    return p->downloader_id;\n}\n\nvoid AsemanDownloader::setHeader(const QVariantMap &header)\n{\n    if (p->header == header)\n        return;\n\n    p->header = header;\n    Q_EMIT headerChanged();\n}\n\nQVariantMap AsemanDownloader::header() const\n{\n    return p->header;\n}\n\nbool AsemanDownloader::downloading() const\n{\n    return p->reply;\n}\n\nvoid AsemanDownloader::start()\n{\n    if( p->path.isEmpty() )\n        return;\n    if( p->reply )\n        return;\n\n    init_manager();\n\n    QNetworkRequest request = QNetworkRequest(QUrl(p->path));\n    for (auto pair: p->header.toStdMap())\n    {\n        auto key = pair.first;\n        auto value = pair.second;\n        if (value.type() != QVariant::String)\n            value.convert(QVariant::String);\n\n        request.setRawHeader(key.toUtf8(), value.toString().toUtf8());\n    }\n\n    p->reply = p->manager->get(request);\n\n#ifndef QT_NO_SSL\n    connect(p->reply, &QNetworkReply::sslErrors, this, &AsemanDownloader::sslErrors);\n#endif\n    connect(p->reply, &QNetworkReply::downloadProgress, this, &AsemanDownloader::downloadProgress);\n\n    Q_EMIT downloadingChanged();\n}\n\nvoid AsemanDownloader::stop()\n{\n    if( !p->reply )\n        return;\n\n    p->reply->deleteLater();\n    p->reply = 0;\n    p->recieved_bytes = 0;\n    p->total_bytes = 1;\n    Q_EMIT downloadingChanged();\n    Q_EMIT finished( QByteArray() );\n    Q_EMIT finishedWithId( p->downloader_id, QByteArray() );\n    Q_EMIT totalBytesChanged();\n    Q_EMIT recievedBytesChanged();\n}\n\nvoid AsemanDownloader::downloadFinished(QNetworkReply *reply)\n{\n    if( reply != p->reply )\n        return;\n\n    p->reply->deleteLater();\n    p->reply = 0;\n    if (reply->error())\n    {\n        Q_EMIT error( QStringList()<<QStringLiteral(\"Failed\") );\n        Q_EMIT failed();\n        Q_EMIT downloadingChanged();\n        return;\n    }\n\n    p->recieved_bytes = 0;\n    p->total_bytes = 1;\n\n    if( !p->dest.isEmpty() )\n    {\n        QDir().mkpath( QFileInfo(p->dest).dir().path() );\n        if( QFile::exists(p->dest) )\n            QFile::remove(p->dest);\n\n        QFile file(p->dest);\n        if( !file.open(QFile::WriteOnly) )\n        {\n            Q_EMIT error( QStringList()<<QStringLiteral(\"Can't write to file.\") );\n            Q_EMIT failed();\n            Q_EMIT downloadingChanged();\n            Q_EMIT totalBytesChanged();\n            Q_EMIT recievedBytesChanged();\n            return;\n        }\n\n        file.write( reply->readAll() );\n        file.flush();\n    }\n\n    const QByteArray & res = reply->readAll();\n\n    Q_EMIT finished( res );\n    Q_EMIT finishedWithId( p->downloader_id, res );\n    Q_EMIT downloadingChanged();\n    Q_EMIT totalBytesChanged();\n    Q_EMIT recievedBytesChanged();\n}\n\nvoid AsemanDownloader::sslErrors(const QList<QSslError> &list)\n{\n    QStringList res;\n#ifndef Q_OS_IOS\n#ifndef QT_NO_SSL\n    auto reply = qobject_cast<QNetworkReply*>(sender());\n    if (reply && p->ignoreSslErrors)\n        reply->ignoreSslErrors(list);\n\n    for(const QSslError &error: list)\n        res << error.errorString();\n#endif\n#endif\n    Q_EMIT error(res);\n}\n\nvoid AsemanDownloader::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)\n{\n    if( p->total_bytes != bytesTotal )\n    {\n        p->total_bytes = bytesTotal;\n        Q_EMIT totalBytesChanged();\n    }\n    if( p->recieved_bytes != bytesReceived )\n    {\n        p->recieved_bytes = bytesReceived;\n        Q_EMIT recievedBytesChanged();\n    }\n}\n\nvoid AsemanDownloader::init_manager()\n{\n    if( p->manager )\n        return;\n\n    p->manager = new QNetworkAccessManager(this);\n    connect(p->manager, &QNetworkAccessManager::finished, this, &AsemanDownloader::downloadFinished);\n}\n\nbool AsemanDownloader::ignoreSslErrors() const\n{\n    return p->ignoreSslErrors;\n}\n\nvoid AsemanDownloader::setIgnoreSslErrors(bool newIgnoreSslErrors)\n{\n    if (p->ignoreSslErrors == newIgnoreSslErrors)\n        return;\n    p->ignoreSslErrors = newIgnoreSslErrors;\n    Q_EMIT ignoreSslErrorsChanged();\n}\n\nAsemanDownloader::~AsemanDownloader()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/network/asemandownloader.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANDOWNLOADER_H\n#define ASEMANDOWNLOADER_H\n\n#include <QObject>\n#include <QStringList>\n#include <QVariantMap>\n#include <QSslError>\n\n#include \"asemannetwork_global.h\"\n\nclass QNetworkReply;\nclass QSslError;\nclass AsemanDownloaderPrivate;\nclass LIBQTASEMAN_NETWORK_EXPORT AsemanDownloader : public QObject\n{\n    Q_PROPERTY(qint64 recievedBytes READ recievedBytes NOTIFY recievedBytesChanged)\n    Q_PROPERTY(qint64 totalBytes READ totalBytes NOTIFY totalBytesChanged)\n    Q_PROPERTY(QString destination READ destination WRITE setDestination NOTIFY destinationChanged)\n    Q_PROPERTY(QString path READ path WRITE setPath NOTIFY pathChanged)\n    Q_PROPERTY(int downloaderId READ downloaderId WRITE setDownloaderId NOTIFY downloaderIdChanged)\n    Q_PROPERTY(bool downloading READ downloading NOTIFY downloadingChanged)\n    Q_PROPERTY(QVariantMap header READ header WRITE setHeader NOTIFY headerChanged)\n    Q_PROPERTY(bool ignoreSslErrors READ ignoreSslErrors WRITE setIgnoreSslErrors NOTIFY ignoreSslErrorsChanged)\n\n    Q_OBJECT\npublic:\n    AsemanDownloader(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanDownloader();\n\n    qint64 recievedBytes() const;\n    qint64 totalBytes() const;\n\n    void setDestination( const QString & dest );\n    QString destination() const;\n\n    void setPath( const QString & path );\n    QString path() const;\n\n    void setDownloaderId( int id );\n    int downloaderId() const;\n\n    void setHeader(const QVariantMap &header);\n    QVariantMap header() const;\n\n    bool downloading() const;\n\n    bool ignoreSslErrors() const;\n    void setIgnoreSslErrors(bool newIgnoreSslErrors);\n\npublic Q_SLOTS:\n    void start();\n    void stop();\n\nQ_SIGNALS:\n    void recievedBytesChanged();\n    void totalBytesChanged();\n    void destinationChanged();\n    void downloaderIdChanged();\n    void pathChanged();\n    void downloadingChanged();\n    void headerChanged();\n    void error( const QStringList & error );\n    void finished( const QByteArray & data );\n    void finishedWithId( int id, const QByteArray & data );\n    void failed();\n    void ignoreSslErrorsChanged();\n\nprivate Q_SLOTS:\n    void downloadFinished(QNetworkReply *reply);\n    void sslErrors(const QList<QSslError> &list);\n    void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);\n\nprivate:\n    void init_manager();\n\nprivate:\n    AsemanDownloaderPrivate *p;\n};\n\ntypedef AsemanDownloader QAsemanDownloader;\n\n#endif // ASEMANDOWNLOADER_H\n"
  },
  {
    "path": "src/network/asemanfiledownloaderqueue.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanfiledownloaderqueue.h\"\n#include \"asemandownloader.h\"\n\n#include <QQueue>\n#include <QStack>\n#include <QSet>\n#include <QFile>\n#include <QFileInfo>\n#include <QDir>\n#include <QDebug>\n\nclass AsemanFileDownloaderQueuePrivate\n{\npublic:\n    struct QueueItem\n    {\n        QSet<QString> fileNames;\n        QVariantMap headers;\n        bool ignoreSslErrors = false;\n    };\n\n    QStack<AsemanDownloader*> inactiveItems;\n    QSet<AsemanDownloader*> activeItems;\n    QQueue<QString> queue;\n    QHash<QString, QueueItem> names;\n\n    int capacity;\n    QString destination;\n};\n\nAsemanFileDownloaderQueue::AsemanFileDownloaderQueue(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanFileDownloaderQueuePrivate;\n    p->capacity = 10;\n}\n\nvoid AsemanFileDownloaderQueue::setCapacity(int cap)\n{\n    if(p->capacity == cap)\n        return;\n\n    p->capacity = cap;\n    Q_EMIT capacityChanged();\n}\n\nint AsemanFileDownloaderQueue::capacity() const\n{\n    return p->capacity;\n}\n\nvoid AsemanFileDownloaderQueue::setDestination(const QString &dest)\n{\n    if(p->destination == dest)\n        return;\n\n    p->destination = dest;\n    QDir().mkpath(p->destination);\n\n    Q_EMIT destinationChanged();\n}\n\nQString AsemanFileDownloaderQueue::destination() const\n{\n    return p->destination;\n}\n\nvoid AsemanFileDownloaderQueue::download(const QString &url, const QString &fileName, const QVariantMap &header, bool ignoreSslErrors)\n{\n    if( QFileInfo((p->destination.count()? p->destination + QStringLiteral(\"/\") : QStringLiteral(\"\")) + fileName).exists() )\n    {\n        Q_EMIT progressChanged(url, fileName, 100);\n        Q_EMIT finished(url, fileName);\n        return;\n    }\n\n    auto &pair = p->names[url];\n    pair.fileNames.insert(fileName);\n    pair.headers = header;\n    pair.ignoreSslErrors = ignoreSslErrors;\n\n    if(p->queue.contains(url))\n        return;\n\n    p->queue.append(url);\n    next();\n}\n\nvoid AsemanFileDownloaderQueue::finishedSlt(const QByteArray &data)\n{\n    AsemanDownloader *downloader = static_cast<AsemanDownloader*>(sender());\n    if(!downloader)\n        return;\n\n    const QString &url = downloader->path();\n    auto names = p->names.value(url).fileNames;\n    for (auto name: names)\n    {\n        QFile file((p->destination.count()? p->destination + QStringLiteral(\"/\") : QStringLiteral(\"\")) + name);\n        if(!file.open(QFile::WriteOnly))\n            continue;\n\n        file.write(data);\n        file.close();\n        Q_EMIT finished(url, name);\n    }\n\n    p->names.remove(url);\n    p->activeItems.remove(downloader);\n    p->inactiveItems.push(downloader);\n    next();\n}\n\nvoid AsemanFileDownloaderQueue::failedSlt()\n{\n    AsemanDownloader *downloader = static_cast<AsemanDownloader*>(sender());\n    if(!downloader)\n        return;\n\n    const QString &url = downloader->path();\n\n    p->names.remove(url);\n    p->activeItems.remove(downloader);\n    p->inactiveItems.push(downloader);\n    next();\n}\n\nvoid AsemanFileDownloaderQueue::recievedBytesChanged()\n{\n    AsemanDownloader *downloader = static_cast<AsemanDownloader*>(sender());\n    if(!downloader)\n        return;\n\n    const qint64 total = downloader->totalBytes();\n    const qint64 recieved = downloader->recievedBytes();\n    const qreal percent = ((qreal)recieved/total)*100;\n    const QString &url = downloader->path();\n    const QSet<QString> names = p->names.value(url).fileNames;\n    for(const QString &name: names)\n        Q_EMIT progressChanged(url, name, percent);\n}\n\nvoid AsemanFileDownloaderQueue::next()\n{\n    while(!p->inactiveItems.isEmpty() && p->inactiveItems.count()+p->activeItems.count()>p->capacity)\n        p->inactiveItems.pop()->deleteLater();\n    if(p->queue.isEmpty())\n        return;\n\n    AsemanDownloader *downloader = getDownloader();\n    if(!downloader)\n        return;\n\n    const QString &url = p->queue.takeFirst();\n    auto item = p->names.value(url);\n\n    downloader->setPath(url);\n    downloader->setIgnoreSslErrors(item.ignoreSslErrors);\n    downloader->setHeader(item.headers);\n    downloader->start();\n}\n\nAsemanDownloader *AsemanFileDownloaderQueue::getDownloader()\n{\n    if(!p->inactiveItems.isEmpty())\n        return p->inactiveItems.pop();\n    if(p->activeItems.count() >= p->capacity)\n        return 0;\n\n    AsemanDownloader *result = new AsemanDownloader(this);\n    p->activeItems.insert(result);\n\n    connect(result, &AsemanDownloader::recievedBytesChanged, this, &AsemanFileDownloaderQueue::recievedBytesChanged);\n    connect(result, &AsemanDownloader::finished, this, &AsemanFileDownloaderQueue::finishedSlt);\n    connect(result, &AsemanDownloader::failed, this, &AsemanFileDownloaderQueue::failedSlt);\n\n    return result;\n}\n\nAsemanFileDownloaderQueue::~AsemanFileDownloaderQueue()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/network/asemanfiledownloaderqueue.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANFILEDOWNLOADERQUEUE_H\n#define ASEMANFILEDOWNLOADERQUEUE_H\n\n#include <QObject>\n#include <QUrl>\n#include <QVariantMap>\n\n#include \"asemannetwork_global.h\"\n\nclass AsemanDownloader;\nclass AsemanFileDownloaderQueuePrivate;\nclass LIBQTASEMAN_NETWORK_EXPORT AsemanFileDownloaderQueue : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(int capacity READ capacity WRITE setCapacity NOTIFY capacityChanged)\n    Q_PROPERTY(QString destination READ destination WRITE setDestination NOTIFY destinationChanged)\n\npublic:\n    AsemanFileDownloaderQueue(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanFileDownloaderQueue();\n\n    void setCapacity(int cap);\n    int capacity() const;\n\n    void setDestination(const QString &dest);\n    QString destination() const;\n\npublic Q_SLOTS:\n    void download(const QString &url, const QString &fileName, const QVariantMap &header = QVariantMap(), bool ignoreSslErrors = false);\n\nQ_SIGNALS:\n    void capacityChanged();\n    void destinationChanged();\n    void finished(const QString &url, const QString &fileName);\n    void progressChanged(const QString &url, const QString &fileName, qreal percent);\n\nprivate Q_SLOTS:\n    void finishedSlt( const QByteArray & data );\n    void failedSlt();\n    void recievedBytesChanged();\n\nprivate:\n    void next();\n    AsemanDownloader *getDownloader();\n\nprivate:\n    AsemanFileDownloaderQueuePrivate *p;\n};\n\ntypedef AsemanFileDownloaderQueue QAsemanFileDownloaderQueue;\n\n#endif // ASEMANFILEDOWNLOADERQUEUE_H\n"
  },
  {
    "path": "src/network/asemanfiledownloaderqueueitem.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanfiledownloaderqueueitem.h\"\n#include \"asemanfiledownloaderqueue.h\"\n#include \"asemandevices.h\"\n\n#include <QPointer>\n#include <QTimer>\n#include <QDebug>\n\nclass AsemanFileDownloaderQueueItemPrivate\n{\npublic:\n    bool ignoreSslErrors;\n    QPointer<AsemanFileDownloaderQueue> queue;\n    QString source;\n    QString result;\n    QString fileName;\n    QVariantMap header;\n    qreal percent;\n    QTimer *timer;\n};\n\nAsemanFileDownloaderQueueItem::AsemanFileDownloaderQueueItem(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanFileDownloaderQueueItemPrivate;\n    p->percent = 0;\n    p->ignoreSslErrors = false;\n\n    p->timer = new QTimer(this);\n    p->timer->setInterval(5);\n    p->timer->setSingleShot(true);\n\n    connect(p->timer, &QTimer::timeout, this, &AsemanFileDownloaderQueueItem::download);\n}\n\nvoid AsemanFileDownloaderQueueItem::setSource(const QString &url)\n{\n    if(p->source == url)\n        return;\n\n    p->source = url;\n    Q_EMIT sourceChanged();\n\n    refresh();\n}\n\nQString AsemanFileDownloaderQueueItem::source() const\n{\n    return p->source;\n}\n\nvoid AsemanFileDownloaderQueueItem::setFileName(const QString &name)\n{\n    if(p->fileName == name)\n        return;\n\n    p->fileName = name;\n    Q_EMIT fileNameChanged();\n\n    refresh();\n}\n\nQString AsemanFileDownloaderQueueItem::fileName() const\n{\n    return p->fileName;\n}\n\nvoid AsemanFileDownloaderQueueItem::setHeader(const QVariantMap &header)\n{\n    if (p->header == header)\n        return;\n\n    p->header = header;\n    Q_EMIT headerChanged();\n}\n\nQVariantMap AsemanFileDownloaderQueueItem::header() const\n{\n    return p->header;\n}\n\nqreal AsemanFileDownloaderQueueItem::percent() const\n{\n    return p->percent;\n}\n\nvoid AsemanFileDownloaderQueueItem::setDownloaderQueue(AsemanFileDownloaderQueue *queue)\n{\n    if(p->queue == queue)\n        return;\n\n    if(p->queue)\n    {\n        disconnect(p->queue, &AsemanFileDownloaderQueue::finished, this, &AsemanFileDownloaderQueueItem::finished);\n        disconnect(p->queue, &AsemanFileDownloaderQueue::progressChanged, this, &AsemanFileDownloaderQueueItem::progressChanged);\n    }\n\n    p->queue = queue;\n    Q_EMIT downloaderQueueChanged();\n\n    if(p->queue)\n    {\n        connect(p->queue, &AsemanFileDownloaderQueue::finished, this, &AsemanFileDownloaderQueueItem::finished);\n        connect(p->queue, &AsemanFileDownloaderQueue::progressChanged, this, &AsemanFileDownloaderQueueItem::progressChanged);\n    }\n\n    refresh();\n}\n\nAsemanFileDownloaderQueue *AsemanFileDownloaderQueueItem::downloaderQueue() const\n{\n    return p->queue;\n}\n\nQString AsemanFileDownloaderQueueItem::result() const\n{\n    return p->result;\n}\n\nvoid AsemanFileDownloaderQueueItem::finished(const QString &url, const QString &fileName)\n{\n    if(p->source != url || p->fileName != fileName)\n        return;\n\n    QString dest = (p->queue->destination().count()? p->queue->destination() + QStringLiteral(\"/\") : QStringLiteral(\"\"));\n\n    p->result = AsemanDevices::localFilesPrePath() + dest + fileName;\n    Q_EMIT resultChanged();\n\n    p->percent = 100;\n    Q_EMIT percentChanged();\n}\n\nvoid AsemanFileDownloaderQueueItem::progressChanged(const QString &url, const QString &fileName, qreal percent)\n{\n    if(p->source != url || p->fileName != fileName)\n        return;\n\n    p->percent = percent;\n    Q_EMIT percentChanged();\n}\n\nvoid AsemanFileDownloaderQueueItem::refresh()\n{\n    p->timer->stop();\n    p->timer->start();\n}\n\nvoid AsemanFileDownloaderQueueItem::download()\n{\n    if(p->source.isEmpty() || p->fileName.isEmpty())\n        return;\n    if(!p->queue)\n        return;\n\n    p->queue->download(p->source, p->fileName, p->header, p->ignoreSslErrors);\n}\n\nbool AsemanFileDownloaderQueueItem::ignoreSslErrors() const\n{\n    return p->ignoreSslErrors;\n}\n\nvoid AsemanFileDownloaderQueueItem::setIgnoreSslErrors(bool newIgnoreSslErrors)\n{\n    if (p->ignoreSslErrors == newIgnoreSslErrors)\n        return;\n    p->ignoreSslErrors = newIgnoreSslErrors;\n    refresh();\n    Q_EMIT ignoreSslErrorsChanged();\n}\n\nAsemanFileDownloaderQueueItem::~AsemanFileDownloaderQueueItem()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/network/asemanfiledownloaderqueueitem.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANFILEDOWNLOADERQUEUEITEM_H\n#define ASEMANFILEDOWNLOADERQUEUEITEM_H\n\n#include <QObject>\n#include <QVariantMap>\n\n#include \"asemannetwork_global.h\"\n#include \"asemanfiledownloaderqueue.h\"\n\nclass AsemanFileDownloaderQueue;\nclass AsemanFileDownloaderQueueItemPrivate;\nclass LIBQTASEMAN_NETWORK_EXPORT AsemanFileDownloaderQueueItem : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QString source READ source WRITE setSource NOTIFY sourceChanged)\n    Q_PROPERTY(QString fileName READ fileName WRITE setFileName NOTIFY fileNameChanged)\n    Q_PROPERTY(QVariantMap header READ header WRITE setHeader NOTIFY headerChanged)\n    Q_PROPERTY(qreal percent READ percent NOTIFY percentChanged)\n    Q_PROPERTY(AsemanFileDownloaderQueue* downloaderQueue READ downloaderQueue WRITE setDownloaderQueue NOTIFY downloaderQueueChanged)\n    Q_PROPERTY(QString result READ result NOTIFY resultChanged)\n    Q_PROPERTY(bool ignoreSslErrors READ ignoreSslErrors WRITE setIgnoreSslErrors NOTIFY ignoreSslErrorsChanged)\n\npublic:\n    AsemanFileDownloaderQueueItem(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanFileDownloaderQueueItem();\n\n    void setSource(const QString &url);\n    QString source() const;\n\n    void setFileName(const QString &name);\n    QString fileName() const;\n\n    void setHeader(const QVariantMap &header);\n    QVariantMap header() const;\n\n    qreal percent() const;\n\n    void setDownloaderQueue(AsemanFileDownloaderQueue *queue);\n    AsemanFileDownloaderQueue *downloaderQueue() const;\n\n    QString result() const;\n\n    bool ignoreSslErrors() const;\n    void setIgnoreSslErrors(bool newIgnoreSslErrors);\n\nQ_SIGNALS:\n    void sourceChanged();\n    void downloaderQueueChanged();\n    void resultChanged();\n    void fileNameChanged();\n    void percentChanged();\n    void headerChanged();\n    void ignoreSslErrorsChanged();\n\nprivate Q_SLOTS:\n    void finished(const QString &url, const QString &fileName);\n    void progressChanged(const QString &url, const QString &fileName, qreal percent);\n\nprivate:\n    void refresh();\n    void download();\n\nprivate:\n    AsemanFileDownloaderQueueItemPrivate *p;\n};\n\ntypedef AsemanFileDownloaderQueueItem QAsemanFileDownloaderQueueItem;\n\n#endif // ASEMANFILEDOWNLOADERQUEUEITEM_H\n"
  },
  {
    "path": "src/network/asemanhostchecker.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanhostchecker.h\"\n\n#include <QTcpSocket>\n#include <QTimer>\n#include <QDebug>\n#include <QDebug>\n\nclass AsemanPingPrivate\n{\npublic:\n    QString host;\n    qint32 port;\n    qint32 interval;\n    QTcpSocket *socket;\n    QTimer *timer;\n    bool reconnectAfterDisconnect;\n    bool available;\n};\n\nAsemanHostChecker::AsemanHostChecker(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanPingPrivate;\n    p->port = 80;\n    p->interval = 0;\n    p->reconnectAfterDisconnect = false;\n    p->available = false;\n    p->socket = 0;\n\n    p->timer = new QTimer(this);\n    p->timer->setSingleShot(false);\n\n    connect(p->timer, &QTimer::timeout, this, &AsemanHostChecker::timedOut);\n}\n\nvoid AsemanHostChecker::setHost(const QString &host)\n{\n    if(p->host == host)\n        return;\n\n    p->host = host;\n    refresh();\n    Q_EMIT hostChanged();\n}\n\nQString AsemanHostChecker::host() const\n{\n    return p->host;\n}\n\nvoid AsemanHostChecker::setPort(qint32 port)\n{\n    if(p->port == port)\n        return;\n\n    p->port = port;\n    refresh();\n    Q_EMIT portChanged();\n}\n\nqint32 AsemanHostChecker::port() const\n{\n    return p->port;\n}\n\nvoid AsemanHostChecker::setInterval(qint32 ms)\n{\n    if(p->interval == ms)\n        return;\n\n    p->interval = ms;\n    refresh();\n    Q_EMIT intervalChanged();\n}\n\nqint32 AsemanHostChecker::interval() const\n{\n    return p->interval;\n}\n\nbool AsemanHostChecker::available() const\n{\n    return p->available;\n}\n\nvoid AsemanHostChecker::setAvailable(bool stt)\n{\n    if(p->available == stt)\n        return;\n\n    p->available = stt;\n    Q_EMIT availableChanged();\n}\n\nvoid AsemanHostChecker::createSocket()\n{\n    if(p->socket)\n    {\n        disconnect(p->socket, &QTcpSocket::stateChanged, this, &AsemanHostChecker::socketStateChanged);\n#ifdef ASEMAN_QT6\n        disconnect(p->socket, &QAbstractSocket::errorOccurred,\n#else\n        disconnect(p->socket, static_cast<void (QAbstractSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error),\n#endif\n                   this, &AsemanHostChecker::socketError);\n        p->socket->deleteLater();\n    }\n\n    p->socket = new QTcpSocket(this);\n\n    connect(p->socket, &QTcpSocket::stateChanged, this, &AsemanHostChecker::socketStateChanged);\n#ifdef ASEMAN_QT6\n    connect(p->socket, &QAbstractSocket::errorOccurred,\n#else\n    connect(p->socket, static_cast<void (QAbstractSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error),\n#endif\n            this, &AsemanHostChecker::socketError);\n}\n\nvoid AsemanHostChecker::refresh()\n{\n    p->timer->stop();\n    if(p->host.isEmpty() || p->port<=0 || p->interval<=0)\n        return;\n\n    p->timer->setInterval(p->interval);\n    p->timer->start();\n\n    createSocket();\n    timedOut();\n}\n\nvoid AsemanHostChecker::socketStateChanged(QAbstractSocket::SocketState socketState)\n{\n    switch(static_cast<int>(socketState))\n    {\n    case QAbstractSocket::UnconnectedState:\n        if(p->reconnectAfterDisconnect)\n        {\n            p->socket->connectToHost(p->host, p->port);\n            p->reconnectAfterDisconnect = false;\n        }\n        break;\n\n    case QAbstractSocket::HostLookupState:\n        break;\n\n    case QAbstractSocket::ConnectingState:\n        break;\n\n    case QAbstractSocket::ConnectedState:\n        setAvailable(true);\n        p->socket->disconnectFromHost();\n        break;\n\n    case QAbstractSocket::BoundState:\n        break;\n\n    case QAbstractSocket::ListeningState:\n        break;\n\n    case QAbstractSocket::ClosingState:\n        break;\n    }\n}\n\nvoid AsemanHostChecker::socketError(QAbstractSocket::SocketError socketError)\n{\n    if(socketError != QAbstractSocket::UnknownSocketError)\n    {\n        setAvailable(false);\n    }\n}\n\nvoid AsemanHostChecker::timedOut()\n{\n    if(p->socket->state() == QAbstractSocket::UnconnectedState)\n        p->socket->connectToHost(p->host, p->port);\n    else\n    {\n        if(p->socket->state() != QAbstractSocket::ConnectedState)\n            setAvailable(false);\n\n        p->reconnectAfterDisconnect = true;\n        p->socket->disconnectFromHost();\n    }\n}\n\nAsemanHostChecker::~AsemanHostChecker()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/network/asemanhostchecker.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANHOSTCHECKER_H\n#define ASEMANHOSTCHECKER_H\n\n#include <QObject>\n#include <QTcpSocket>\n\n#include \"asemannetwork_global.h\"\n\nclass AsemanPingPrivate;\nclass LIBQTASEMAN_NETWORK_EXPORT AsemanHostChecker : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QString host     READ host     WRITE setHost     NOTIFY hostChanged)\n    Q_PROPERTY(qint32  port     READ port     WRITE setPort     NOTIFY portChanged)\n    Q_PROPERTY(qint32  interval READ interval WRITE setInterval NOTIFY intervalChanged)\n\n    Q_PROPERTY(bool available READ available NOTIFY availableChanged)\n\npublic:\n    AsemanHostChecker(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanHostChecker();\n\n    void setHost(const QString &host);\n    QString host() const;\n\n    void setPort(qint32 port);\n    qint32 port() const;\n\n    void setInterval(qint32 ms);\n    qint32 interval() const;\n\n    bool available() const;\n\nQ_SIGNALS:\n    void hostChanged();\n    void portChanged();\n    void intervalChanged();\n    void availableChanged();\n\nprivate Q_SLOTS:\n    void socketStateChanged(QAbstractSocket::SocketState socketState);\n    void socketError(QAbstractSocket::SocketError socketError);\n    void timedOut();\n    void refresh();\n\nprivate:\n    void setAvailable(bool stt);\n    void createSocket();\n\nprivate:\n    AsemanPingPrivate *p;\n};\n\ntypedef AsemanHostChecker QAsemanHostChecker;\n\n#endif // ASEMANHOSTCHECKER_H\n"
  },
  {
    "path": "src/network/asemannetwork_global.h",
    "content": "#ifndef ASEMAN_NETWORK_GLOBAL_H\n#define ASEMAN_NETWORK_GLOBAL_H\n\n#include <QtCore/qglobal.h>\n\n#if !defined(QT_STATIC) && !defined(QASEMAN_STATIC)\n#if defined(LIBQTASEMAN_NETWORK_LIBRARY)\n#  define LIBQTASEMAN_NETWORK_EXPORT Q_DECL_EXPORT\n#else\n#  define LIBQTASEMAN_NETWORK_EXPORT Q_DECL_IMPORT\n#endif\n#else\n#define LIBQTASEMAN_NETWORK_EXPORT\n#endif\n\n#endif // ASEMAN_NETWORK_GLOBAL_H\n"
  },
  {
    "path": "src/network/asemannetworkmanager.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemannetworkmanager.h\"\n#include \"asemannetworkmanageritem.h\"\n\n#include <QNetworkConfigurationManager>\n#include <QDebug>\n#include <QNetworkAccessManager>\n#include <QTimer>\n#include <QMap>\n#include <QPointer>\n\nclass AsemanNetworkCheckerPrivate\n{\npublic:\n    QPointer<AsemanNetworkManagerItem> defaultItem;\n    QVariantMap map;\n    QNetworkConfigurationManager *network;\n    QNetworkConfiguration lastConfig;\n\n    QTimer *updateTimer;\n};\n\nAsemanNetworkManager::AsemanNetworkManager(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanNetworkCheckerPrivate;\n    p->network = new QNetworkConfigurationManager(this);\n    p->defaultItem = new AsemanNetworkManagerItem(this);\n\n    p->updateTimer = new QTimer(this);\n    p->updateTimer->setInterval(1000);\n    p->updateTimer->start();\n\n    p->lastConfig = p->network->defaultConfiguration();\n\n    connect(p->network, &QNetworkConfigurationManager::configurationAdded, this, &AsemanNetworkManager::configureAdded);\n    connect(p->network, &QNetworkConfigurationManager::configurationChanged, this, &AsemanNetworkManager::configureChanged);\n    connect(p->network, &QNetworkConfigurationManager::configurationRemoved, this, &AsemanNetworkManager::configureRemoved);\n\n    connect(p->network, &QNetworkConfigurationManager::updateCompleted, this, &AsemanNetworkManager::updateCheck);\n    connect(p->updateTimer, &QTimer::timeout, this, &AsemanNetworkManager::updateCheck);\n\n    for(const QNetworkConfiguration &config: p->network->allConfigurations())\n        configureAdded(config);\n\n    updateCheck();\n}\n\nQString AsemanNetworkManager::defaultNetworkIdentifier() const\n{\n    return p->lastConfig.identifier();\n}\n\nAsemanNetworkManagerItem *AsemanNetworkManager::defaultNetwork() const\n{\n    return p->defaultItem;\n}\n\nQVariantMap AsemanNetworkManager::configurations() const\n{\n    return p->map;\n}\n\nvoid AsemanNetworkManager::setInterval(qint32 ms)\n{\n    if(p->updateTimer->interval() == ms)\n        return;\n\n    p->updateTimer->setInterval(ms);\n    p->updateTimer->stop();\n    p->updateTimer->start();\n\n    Q_EMIT intervalChanged();\n}\n\nqint32 AsemanNetworkManager::interval() const\n{\n    return p->updateTimer->interval();\n}\n\nvoid AsemanNetworkManager::configureChanged(const QNetworkConfiguration &config)\n{\n    AsemanNetworkManagerItem *item = p->map.value(config.identifier()).value<AsemanNetworkManagerItem*>();\n    if(item)\n        item->operator =(config);\n}\n\nvoid AsemanNetworkManager::configureAdded(const QNetworkConfiguration &config)\n{\n    AsemanNetworkManagerItem *item = new AsemanNetworkManagerItem(this);\n    item->operator =(config);\n    p->map[config.identifier()] = QVariant::fromValue<AsemanNetworkManagerItem*>(item);\n\n    Q_EMIT configurationsChanged();\n}\n\nvoid AsemanNetworkManager::configureRemoved(const QNetworkConfiguration &config)\n{\n    AsemanNetworkManagerItem *item = p->map.take(config.identifier()).value<AsemanNetworkManagerItem*>();\n    if(item)\n        item->deleteLater();\n\n    Q_EMIT configurationsChanged();\n}\n\nvoid AsemanNetworkManager::updateCheck()\n{\n    p->defaultItem->operator =(p->network->defaultConfiguration());\n\n    if(p->lastConfig.identifier() == p->network->defaultConfiguration().identifier())\n    {\n        p->lastConfig = p->network->defaultConfiguration();\n        return;\n    }\n\n    p->lastConfig = p->network->defaultConfiguration();\n    Q_EMIT defaultNetworkIdentifierChanged();\n}\n\nAsemanNetworkManager::~AsemanNetworkManager()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/network/asemannetworkmanager.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANNETWORKMANAGER_H\n#define ASEMANNETWORKMANAGER_H\n\n#include <QObject>\n\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n#include <QNetworkConfiguration>\n#include <QVariantMap>\n\n#include \"asemannetwork_global.h\"\n\nclass AsemanNetworkManagerItem;\nclass AsemanNetworkCheckerPrivate;\nclass LIBQTASEMAN_NETWORK_EXPORT AsemanNetworkManager : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QString defaultNetworkIdentifier READ defaultNetworkIdentifier NOTIFY defaultNetworkIdentifierChanged)\n    Q_PROPERTY(QVariantMap configurations READ configurations NOTIFY configurationsChanged)\n    Q_PROPERTY(AsemanNetworkManagerItem* defaultNetwork READ defaultNetwork NOTIFY defaultNetworkChanged)\n    Q_PROPERTY(qint32  interval READ interval WRITE setInterval NOTIFY intervalChanged)\n\npublic:\n    AsemanNetworkManager(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanNetworkManager();\n\n    QString defaultNetworkIdentifier() const;\n    AsemanNetworkManagerItem *defaultNetwork() const;\n    QVariantMap configurations() const;\n\n    void setInterval(qint32 ms);\n    qint32 interval() const;\n\nQ_SIGNALS:\n    void defaultNetworkIdentifierChanged();\n    void defaultNetworkChanged();\n    void configurationsChanged();\n    void intervalChanged();\n\nprivate Q_SLOTS:\n    void configureChanged(const QNetworkConfiguration &config);\n    void configureAdded(const QNetworkConfiguration &config);\n    void configureRemoved(const QNetworkConfiguration &config);\n    void updateCheck();\n\nprivate:\n    AsemanNetworkCheckerPrivate *p;\n};\n\ntypedef AsemanNetworkManager QAsemanNetworkManager;\n#endif\n\n#endif // ASEMANNETWORKMANAGER_H\n"
  },
  {
    "path": "src/network/asemannetworkmanageritem.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemannetworkmanageritem.h\"\n\nclass AsemanNetworkManagerItemPrivate\n{\npublic:\n    QNetworkConfiguration config;\n    QList<AsemanNetworkManagerItem *> children;\n};\n\nAsemanNetworkManagerItem::AsemanNetworkManagerItem(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanNetworkManagerItemPrivate;\n}\n\nint AsemanNetworkManagerItem::bearerType() const\n{\n    return p->config.bearerType();\n}\n\nint AsemanNetworkManagerItem::bearerTypeFamily() const\n{\n    return p->config.bearerTypeFamily();\n}\n\nQString AsemanNetworkManagerItem::bearerTypeName() const\n{\n    return p->config.bearerTypeName();\n}\n\nQList<AsemanNetworkManagerItem *> AsemanNetworkManagerItem::children() const\n{\n    return p->children;\n}\n\nvoid AsemanNetworkManagerItem::setChildrens(const QList<QNetworkConfiguration> &childs)\n{\n    if(childrenChanged_prv(childs)) Q_EMIT childrenChanged();\n}\n\nQString AsemanNetworkManagerItem::identifier() const\n{\n    return p->config.identifier();\n}\n\nbool AsemanNetworkManagerItem::isRoamingAvailable() const\n{\n    return p->config.isRoamingAvailable();\n}\n\nbool AsemanNetworkManagerItem::isValid() const\n{\n    return p->config.isValid();\n}\n\nQString AsemanNetworkManagerItem::name() const\n{\n    return p->config.name();\n}\n\nint AsemanNetworkManagerItem::purpose() const\n{\n    return p->config.purpose();\n}\n\nint AsemanNetworkManagerItem::state() const\n{\n    return p->config.state();\n}\n\nint AsemanNetworkManagerItem::type() const\n{\n    return p->config.type();\n}\n\nQObject &AsemanNetworkManagerItem::operator =(const QNetworkConfiguration &n)\n{\n    bool bearerTypeIsChanged = (n.bearerType() != p->config.bearerType());\n    bool bearerTypeFamilyIsChanged = (n.bearerTypeFamily() != p->config.bearerTypeFamily());\n    bool bearerTypeNameIsChanged = (n.bearerTypeName() != p->config.bearerTypeName());\n    bool childrenIsChanged = childrenChanged_prv(n.children());\n    bool identifierIsChanged = (n.identifier() != p->config.identifier());\n    bool isRoamingAvailableIsChanged = (n.isRoamingAvailable() != p->config.isRoamingAvailable());\n    bool isValidIsChanged = (n.isValid() != p->config.isValid());\n    bool nameIsChanged = (n.name() != p->config.name());\n    bool purposeIsChanged = (n.purpose() != p->config.purpose());\n    bool stateIsChanged = (n.state() != p->config.state());\n    bool typeIsChanged = (n.type() != p->config.type());\n\n    p->config = n;\n\n    if(bearerTypeIsChanged)\n        Q_EMIT bearerTypeChanged();\n    if(bearerTypeFamilyIsChanged)\n        Q_EMIT bearerTypeFamilyChanged();\n    if(bearerTypeNameIsChanged)\n        Q_EMIT bearerTypeNameChanged();\n    if(childrenIsChanged)\n        Q_EMIT childrenChanged();\n    if(identifierIsChanged)\n        Q_EMIT identifierChanged();\n    if(isRoamingAvailableIsChanged)\n        Q_EMIT isRoamingAvailableChanged();\n    if(isValidIsChanged)\n        Q_EMIT isValidChanged();\n    if(nameIsChanged)\n        Q_EMIT nameChanged();\n    if(purposeIsChanged)\n        Q_EMIT purposeChanged();\n    if(stateIsChanged)\n        Q_EMIT stateChanged();\n    if(typeIsChanged)\n        Q_EMIT typeChanged();\n    return *this;\n}\n\nbool AsemanNetworkManagerItem::childrenChanged_prv(const QList<QNetworkConfiguration> &children)\n{\n    bool result = false;\n    for( int i=0 ; i<p->children.count() ; i++ )\n    {\n        AsemanNetworkManagerItem *item = p->children.at(i);\n        if( childIndex(children,item)!=-1 )\n            continue;\n\n        p->children.takeAt(i)->deleteLater();\n        i--;\n        result = true;\n    }\n\n\n    QList<QNetworkConfiguration> temp_list = children;\n    for( int i=0 ; i<temp_list.count() ; i++ )\n    {\n        const QNetworkConfiguration &item = temp_list.at(i);\n        if( childIndex(p->children,item)!=-1 )\n            continue;\n\n        temp_list.removeAt(i);\n        i--;\n    }\n    while( !isEqual(temp_list,p->children) )\n        for( int i=0 ; i<p->children.count() ; i++ )\n        {\n            AsemanNetworkManagerItem *item = p->children.at(i);\n            int nw = childIndex(temp_list,item);\n            if( i == nw )\n                continue;\n\n            p->children.move( i, nw );\n            result = true;\n        }\n\n\n    for( int i=0 ; i<children.count() ; i++ )\n    {\n        const QNetworkConfiguration &item = children.at(i);\n        if( childIndex(p->children,item)!=-1 )\n            continue;\n\n        AsemanNetworkManagerItem *newItem = new AsemanNetworkManagerItem(this);\n        newItem->operator =(item);\n\n        p->children.insert( i, newItem);\n        result = true;\n    }\n\n    for(int i=0; i<p->children.count(); i++)\n        p->children.at(i)->operator =(children.at(i));\n\n    return result;\n}\n\nint AsemanNetworkManagerItem::childIndex(const QList<QNetworkConfiguration> &childs, AsemanNetworkManagerItem *item)\n{\n    for(const QNetworkConfiguration &conf: childs)\n        if(conf.name() == item->name())\n            return childs.indexOf(conf);\n    return -1;\n}\n\nint AsemanNetworkManagerItem::childIndex(const QList<AsemanNetworkManagerItem *> &childs, const QNetworkConfiguration &item)\n{\n    for(AsemanNetworkManagerItem *conf: childs)\n        if(conf->name() == item.name())\n            return childs.indexOf(conf);\n    return -1;\n}\n\nbool AsemanNetworkManagerItem::isEqual(QList<QNetworkConfiguration> &a, const QList<AsemanNetworkManagerItem *> &b)\n{\n    if(a.length() != b.length())\n        return false;\n    for(int i=0; i<a.length(); i++)\n        if(a.at(i).identifier() != b.at(i)->identifier())\n            return false;\n    return true;\n}\n\nAsemanNetworkManagerItem::~AsemanNetworkManagerItem()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/network/asemannetworkmanageritem.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANNETWORKMANAGERITEM_H\n#define ASEMANNETWORKMANAGERITEM_H\n\n\n#include <QObject>\n\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n#include <QNetworkConfiguration>\n#include \"asemannetworkmanager.h\"\n\n#include \"asemannetwork_global.h\"\n\nclass AsemanNetworkManagerItemPrivate;\nclass LIBQTASEMAN_NETWORK_EXPORT AsemanNetworkManagerItem : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(int bearerType READ bearerType NOTIFY bearerTypeChanged)\n    Q_PROPERTY(int bearerTypeFamily READ bearerTypeFamily NOTIFY bearerTypeFamilyChanged)\n    Q_PROPERTY(QString bearerTypeName READ bearerTypeName NOTIFY bearerTypeNameChanged)\n    Q_PROPERTY(QList<AsemanNetworkManagerItem*> children READ children NOTIFY childrenChanged)\n    Q_PROPERTY(QString identifier READ identifier NOTIFY identifierChanged)\n    Q_PROPERTY(bool isRoamingAvailable READ isRoamingAvailable NOTIFY isRoamingAvailableChanged)\n    Q_PROPERTY(bool isValid READ isValid NOTIFY isValidChanged)\n    Q_PROPERTY(QString name READ name NOTIFY nameChanged)\n    Q_PROPERTY(int purpose READ purpose NOTIFY purposeChanged)\n    Q_PROPERTY(int state READ state NOTIFY stateChanged)\n    Q_PROPERTY(int type READ type NOTIFY typeChanged)\n    friend class AsemanNetworkManager;\n\npublic:\n    enum Type {\n        InternetAccessPoint = QNetworkConfiguration::InternetAccessPoint,\n        ServiceNetwork = QNetworkConfiguration::ServiceNetwork,\n        UserChoice = QNetworkConfiguration::UserChoice,\n        Invalid = QNetworkConfiguration::Invalid\n    };\n\n    enum Purpose {\n        UnknownPurpose = QNetworkConfiguration::UnknownPurpose,\n        PublicPurpose = QNetworkConfiguration::PublicPurpose,\n        PrivatePurpose = QNetworkConfiguration::PrivatePurpose,\n        ServiceSpecificPurpose = QNetworkConfiguration::ServiceSpecificPurpose\n    };\n\n    enum StateFlag {\n        Undefined        = QNetworkConfiguration::Undefined,\n        Defined          = QNetworkConfiguration::Defined,\n        Discovered       = QNetworkConfiguration::Discovered,\n        Active           = QNetworkConfiguration::Active\n    };\n\n    enum BearerType {\n        BearerUnknown = QNetworkConfiguration::BearerUnknown,\n        BearerEthernet = QNetworkConfiguration::BearerEthernet,\n        BearerWLAN = QNetworkConfiguration::BearerWLAN,\n        Bearer2G = QNetworkConfiguration::Bearer2G,\n        BearerCDMA2000 = QNetworkConfiguration::BearerCDMA2000,\n        BearerWCDMA = QNetworkConfiguration::BearerWCDMA,\n        BearerHSPA = QNetworkConfiguration::BearerHSPA,\n        BearerBluetooth = QNetworkConfiguration::BearerBluetooth,\n        BearerWiMAX = QNetworkConfiguration::BearerWiMAX,\n        BearerEVDO = QNetworkConfiguration::BearerEVDO,\n        BearerLTE = QNetworkConfiguration::BearerLTE,\n        Bearer3G = QNetworkConfiguration::Bearer3G,\n        Bearer4G = QNetworkConfiguration::Bearer4G\n    };\n\n    AsemanNetworkManagerItem(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanNetworkManagerItem();\n\n    int bearerType() const;\n    int bearerTypeFamily() const;\n    QString bearerTypeName() const;\n    QString identifier() const;\n    bool isRoamingAvailable() const;\n    bool isValid() const;\n    QString name() const;\n    int purpose() const;\n    int state() const;\n    int type() const;\n    QList<AsemanNetworkManagerItem*> children() const;\n\n    QObject &operator =(const QNetworkConfiguration &network);\n\nQ_SIGNALS:\n    void bearerTypeChanged();\n    void bearerTypeFamilyChanged();\n    void bearerTypeNameChanged();\n    void childrenChanged();\n    void identifierChanged();\n    void isRoamingAvailableChanged();\n    void isValidChanged();\n    void nameChanged();\n    void purposeChanged();\n    void stateChanged();\n    void typeChanged();\n\nprivate:\n    void setChildrens(const QList<QNetworkConfiguration> &childs);\n    bool childrenChanged_prv(const QList<QNetworkConfiguration> &children);\n    int childIndex(const QList<QNetworkConfiguration> &childs, AsemanNetworkManagerItem *item);\n    int childIndex(const QList<AsemanNetworkManagerItem*> &childs, const QNetworkConfiguration &item);\n    bool isEqual(QList<QNetworkConfiguration> &a, const QList<AsemanNetworkManagerItem*> &b);\n\nprivate:\n    AsemanNetworkManagerItemPrivate *p;\n};\n\ntypedef AsemanNetworkManagerItem QAsemanNetworkManagerItem;\n\n#endif\n\n#endif // ASEMANNETWORKMANAGERITEM_H\n"
  },
  {
    "path": "src/network/asemannetworkproxy.cpp",
    "content": "#include \"asemannetworkproxy.h\"\n\nclass AsemanNetworkProxy::Private\n{\npublic:\n    QNetworkProxy proxy;\n};\n\nAsemanNetworkProxy::AsemanNetworkProxy(QObject *parent) :\n    QObject(parent)\n{\n    p = new Private;\n    p->proxy = QNetworkProxy::applicationProxy();\n}\n\nqint32 AsemanNetworkProxy::type() const\n{\n    return p->proxy.type();\n}\n\nvoid AsemanNetworkProxy::setType(qint32 type)\n{\n    if(p->proxy.type() == type)\n        return;\n\n    p->proxy.setType( static_cast<QNetworkProxy::ProxyType>(type) );\n    refresh();\n    Q_EMIT typeChanged();\n}\n\nQString AsemanNetworkProxy::hostName() const\n{\n    return p->proxy.hostName();\n}\n\nvoid AsemanNetworkProxy::setHostName(const QString &hostName)\n{\n    if(p->proxy.hostName() == hostName)\n        return;\n\n    p->proxy.setHostName(hostName);\n    refresh();\n    Q_EMIT hostNameChanged();\n}\n\nqint32 AsemanNetworkProxy::port() const\n{\n    return p->proxy.port();\n}\n\nvoid AsemanNetworkProxy::setPort(const qint32 &port)\n{\n    if(p->proxy.port() == port)\n        return;\n\n    p->proxy.setPort(port);\n    refresh();\n    Q_EMIT portChanged();\n}\n\nQString AsemanNetworkProxy::user() const\n{\n    return p->proxy.user();\n}\n\nvoid AsemanNetworkProxy::setUser(const QString &user)\n{\n    if(p->proxy.user() == user)\n        return;\n\n    p->proxy.setUser(user);\n    refresh();\n    Q_EMIT userChanged();\n}\n\nQString AsemanNetworkProxy::password() const\n{\n    return p->proxy.password();\n}\n\nvoid AsemanNetworkProxy::setPassword(const QString &password)\n{\n    if(p->proxy.password() == password)\n        return;\n\n    p->proxy.setPassword(password);\n    refresh();\n    Q_EMIT passwordChanged();\n}\n\nvoid AsemanNetworkProxy::refresh()\n{\n    QNetworkProxy::setApplicationProxy(p->proxy);\n}\n\nAsemanNetworkProxy::~AsemanNetworkProxy()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/network/asemannetworkproxy.h",
    "content": "#ifndef ASEMANNETWORKPROXY_H\n#define ASEMANNETWORKPROXY_H\n\n#include <QObject>\n#include <QNetworkProxy>\n\n#include \"asemannetwork_global.h\"\n\nclass LIBQTASEMAN_NETWORK_EXPORT AsemanNetworkProxy : public QObject\n{\n    Q_OBJECT\n    Q_ENUMS(ProxyType)\n\n    class Private;\n\n    Q_PROPERTY(qint32  type READ type WRITE setType NOTIFY typeChanged)\n    Q_PROPERTY(QString hostName READ hostName WRITE setHostName NOTIFY hostNameChanged)\n    Q_PROPERTY(qint32  port READ port WRITE setPort NOTIFY portChanged)\n    Q_PROPERTY(QString user READ user WRITE setUser NOTIFY userChanged)\n    Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged)\n\npublic:\n    enum ProxyType {\n        DefaultProxy = QNetworkProxy::DefaultProxy,\n        Socks5Proxy = QNetworkProxy::Socks5Proxy,\n        NoProxy = QNetworkProxy::NoProxy,\n        HttpProxy = QNetworkProxy::HttpProxy,\n        HttpCachingProxy = QNetworkProxy::HttpCachingProxy,\n        FtpCachingProxy = QNetworkProxy::FtpCachingProxy\n    };\n\n    AsemanNetworkProxy(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanNetworkProxy();\n\n    qint32 type() const;\n    void setType(qint32 type);\n\n    QString hostName() const;\n    void setHostName(const QString &hostName);\n\n    qint32 port() const;\n    void setPort(const qint32 &port);\n\n    QString user() const;\n    void setUser(const QString &user);\n\n    QString password() const;\n    void setPassword(const QString &password);\n\nQ_SIGNALS:\n    void typeChanged();\n    void hostNameChanged();\n    void portChanged();\n    void userChanged();\n    void passwordChanged();\n\nprivate:\n    void refresh();\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanNetworkProxy QAsemanNetworkProxy;\n\n#endif // ASEMANNETWORKPROXY_H\n"
  },
  {
    "path": "src/network/asemannetworkquickobject.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemannetworkquickobject.h\"\n\n#include <QSet>\n\nQSet<AsemanNetworkQuickObject*> aseman_network_quick_objs;\n\nclass AsemanNetworkQuickObjectPrivate\n{\npublic:\n    QList<QObject*> items;\n};\n\nAsemanNetworkQuickObject::AsemanNetworkQuickObject(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanNetworkQuickObjectPrivate;\n    aseman_network_quick_objs.insert(this);\n}\n\nQQmlListProperty<QObject> AsemanNetworkQuickObject::items()\n{\n    return QQmlListProperty<QObject>(this, &p->items, QQmlListProperty<QObject>::AppendFunction(append),\n                                                      QQmlListProperty<QObject>::CountFunction(count),\n                                                      QQmlListProperty<QObject>::AtFunction(at),\n                                     QQmlListProperty<QObject>::ClearFunction(clear) );\n}\n\nQList<QObject *> AsemanNetworkQuickObject::itemsList() const\n{\n    return p->items;\n}\n\nbool AsemanNetworkQuickObject::isValid(AsemanNetworkQuickObject *obj)\n{\n    return aseman_network_quick_objs.contains(obj);\n}\n\nvoid AsemanNetworkQuickObject::append(QQmlListProperty<QObject> *p, QObject *v)\n{\n    AsemanNetworkQuickObject *aobj = static_cast<AsemanNetworkQuickObject*>(p->object);\n    aobj->p->items.append(v);\n    Q_EMIT aobj->itemsChanged();\n}\n\nint AsemanNetworkQuickObject::count(QQmlListProperty<QObject> *p)\n{\n    AsemanNetworkQuickObject *aobj = static_cast<AsemanNetworkQuickObject*>(p->object);\n    return aobj->p->items.count();\n}\n\nQObject *AsemanNetworkQuickObject::at(QQmlListProperty<QObject> *p, int idx)\n{\n    AsemanNetworkQuickObject *aobj = static_cast<AsemanNetworkQuickObject*>(p->object);\n    return aobj->p->items.at(idx);\n}\n\nvoid AsemanNetworkQuickObject::clear(QQmlListProperty<QObject> *p)\n{\n    AsemanNetworkQuickObject *aobj = static_cast<AsemanNetworkQuickObject*>(p->object);\n    aobj->p->items.clear();\n    Q_EMIT aobj->itemsChanged();\n}\n\nAsemanNetworkQuickObject::~AsemanNetworkQuickObject()\n{\n    aseman_network_quick_objs.remove(this);\n    delete p;\n}\n"
  },
  {
    "path": "src/network/asemannetworkquickobject.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANNETWORKQUICKOBJECT_H\n#define ASEMANNETWORKQUICKOBJECT_H\n\n#include <QObject>\n#include <QQmlListProperty>\n\n#include \"asemanglobals.h\"\n\n#include \"asemannetwork_global.h\"\n\nclass AsemanNetworkQuickObjectPrivate;\nclass LIBQTASEMAN_NETWORK_EXPORT AsemanNetworkQuickObject : public QObject\n{\n    Q_OBJECT\n\n    Q_PROPERTY(QQmlListProperty<QObject> items READ items NOTIFY itemsChanged)\n    Q_CLASSINFO(\"DefaultProperty\", \"items\")\n\npublic:\n    Q_INVOKABLE explicit AsemanNetworkQuickObject(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanNetworkQuickObject();\n\n    QQmlListProperty<QObject> items();\n    QList<QObject*> itemsList() const;\n\n    static bool isValid(AsemanNetworkQuickObject* obj);\n\nQ_SIGNALS:\n    void itemsChanged();\n\nprivate:\n    static void append(QQmlListProperty<QObject> *p, QObject *v);\n    static int count(QQmlListProperty<QObject> *p);\n    static QObject *at(QQmlListProperty<QObject> *p, int idx);\n    static void clear(QQmlListProperty<QObject> *p);\n\nprivate:\n    AsemanNetworkQuickObjectPrivate *p;\n};\n\ntypedef AsemanNetworkQuickObject QAsemanNetworkQuickObject;\n\n#endif // ASEMANNETWORKQUICKOBJECT_H\n"
  },
  {
    "path": "src/network/asemannetworkrequestmanager.cpp",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemannetworkrequestmanager.h\"\n\n#include <QNetworkAccessManager>\n#include <QUrlQuery>\n#include <QDebug>\n#include <QPointer>\n#include <QJsonDocument>\n#include <QJsonDocument>\n#include <QFile>\n#include <QMimeDatabase>\n#include <QFileInfo>\n\n#if QT_CONFIG(http)\n#include <QHttpMultiPart>\n#endif\n\nclass AsemanNetworkRequestManager::Private\n{\npublic:\n#ifdef Q_OS_WASM\n    static QNetworkAccessManager *accessManager;\n#else\n    QNetworkAccessManager *accessManager;\n#endif\n    QString boundaryToken;\n    static int fullLog_env;\n    bool ignoreSslErrors;\n};\n\nint AsemanNetworkRequestManager::Private::fullLog_env = -1;\n\n#ifdef Q_OS_WASM\nQNetworkAccessManager *AsemanNetworkRequestManager::Private::accessManager = nullptr;\n#endif\n\nAsemanNetworkRequestManager::AsemanNetworkRequestManager(QObject *parent) :\n    QObject(parent)\n{\n    p = new Private;\n    p->ignoreSslErrors = false;\n\n#ifdef QT_DEBUG\n    if (Private::fullLog_env == -1)\n        Private::fullLog_env = (qgetenv(\"QTASEMAN_NETWORK_DEBUG_MODE\") == \"true\"? 1 : 0);\n#else\n    Private::fullLog_env = 0;\n#endif\n\n    p->boundaryToken = QStringLiteral(\"Aseman:292a15d1-64af-4ee2-82b5-2d42adb9fd43\");\n\n#ifdef Q_OS_WASM\n    if (!p->accessManager)\n        p->accessManager = new QNetworkAccessManager;\n#else\n    p->accessManager = new QNetworkAccessManager(this);\n#endif\n}\n\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::get(AsemanNetworkRequestObject *request, const QUrl &_url, const QVariantMap &keys, const QVariantMap &headers)\n{\n    const QUrlQuery query = queryOfMap(keys);\n\n    QUrl url = _url;\n    if (query.queryItems().count())\n        url.setQuery(query);\n\n    QNetworkRequest req;\n    req.setUrl(url);\n    req.setMaximumRedirectsAllowed(10);\n#ifdef ASEMAN_QT6\n    req.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);\n#else\n    req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);\n#endif\n\n    if (Private::fullLog_env)\n        qDebug() << \"QtAseman::Network, POST url:\" << url.toString();\n\n    addHeaderData(req, headers);\n\n    switch (request->contentType())\n    {\n    case AsemanNetworkRequestObject::TypeWWWForm:\n        req.setRawHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n        break;\n    case AsemanNetworkRequestObject::TypeJson:\n        req.setRawHeader(\"Content-Type\", \"application/json\");\n        break;\n    }\n\n    QNetworkReply *reply = p->accessManager->get(req);\n    AsemanNetworkRequestReply *reqReply = new AsemanNetworkRequestReply(p->ignoreSslErrors || request->ignoreSslErrors(), reply);\n\n    return reqReply;\n}\n\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::post(AsemanNetworkRequestObject *request, const QUrl &url, const QByteArray &data, const QVariantMap &headers)\n{\n    QNetworkRequest req;\n    req.setUrl(url);\n    req.setMaximumRedirectsAllowed(10);\n#ifdef ASEMAN_QT6\n    req.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);\n#else\n    req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);\n#endif\n    req.setHeader(QNetworkRequest::ContentLengthHeader, QString::number(data.size()).toUtf8());\n\n    addHeaderData(req, headers);\n\n    switch (request->contentType())\n    {\n    case AsemanNetworkRequestObject::TypeWWWForm:\n        req.setRawHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n        break;\n    case AsemanNetworkRequestObject::TypeJson:\n        req.setRawHeader(\"Content-Type\", \"application/json\");\n        break;\n    }\n\n    if (Private::fullLog_env)\n        qDebug() << \"QtAseman::Network, POST url:\" << url.toString() << \"data-length:\" << data.length();\n\n    QNetworkReply *reply = p->accessManager->post(req, data);\n    reply->setParent(this);\n\n    AsemanNetworkRequestReply *reqReply = new AsemanNetworkRequestReply(p->ignoreSslErrors || request->ignoreSslErrors(), reply);\n\n    return reqReply;\n}\n\n#if QT_CONFIG(http)\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::post(AsemanNetworkRequestObject *request, const QUrl &url, QHttpMultiPart *parts, const QVariantMap &headers)\n{\n    QNetworkRequest req;\n    req.setUrl(url);\n    req.setMaximumRedirectsAllowed(10);\n#ifdef ASEMAN_QT6\n    req.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);\n#else\n    req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);\n#endif\n\n    addHeaderData(req, headers);\n\n    req.setRawHeader(\"Content-Type\", \"multipart/form-data; boundary=\\\"\" + p->boundaryToken.toUtf8() + \"\\\"\");\n\n    if (Private::fullLog_env)\n        qDebug() << \"QtAseman::Network, POST url:\" << url.toString() << \"data-length: uncalculatble\";\n\n    QNetworkReply *reply = p->accessManager->post(req, parts);\n    reply->setParent(this);\n\n    AsemanNetworkRequestReply *reqReply = new AsemanNetworkRequestReply(p->ignoreSslErrors || request->ignoreSslErrors(), reply);\n\n    return reqReply;\n}\n#endif\n\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::postForm(AsemanNetworkRequestObject *request, const QUrl &url, const QVariantMap &formData, const QVariantMap &headers)\n{\n#if QT_CONFIG(http)\n    QHttpMultiPart *parts = generateFormData(formData);\n    return AsemanNetworkRequestManager::post(request, url, parts, headers);\n#else\n    QByteArray data = generateForm(formData).toUtf8();\n    QVariantMap newHeaders = headers;\n    newHeaders[\"Content-Type\"] = QVariant::fromValue<QString>(\"multipart/form-data; boundary=\" + p->boundaryToken);\n    return AsemanNetworkRequestManager::post(request, url, data, newHeaders);\n#endif\n}\n\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::customMethod(AsemanNetworkRequestObject *request, const QString &method, const QUrl &url, const QByteArray &data, const QVariantMap &headers)\n{\n    QNetworkRequest req;\n    req.setUrl(url);\n    req.setMaximumRedirectsAllowed(10);\n#ifdef ASEMAN_QT6\n    req.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);\n#else\n    req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);\n#endif\n    req.setHeader(QNetworkRequest::ContentLengthHeader, QString::number(data.size()).toUtf8());\n\n    addHeaderData(req, headers);\n\n    switch (request->contentType())\n    {\n    case AsemanNetworkRequestObject::TypeWWWForm:\n        req.setRawHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n        break;\n    case AsemanNetworkRequestObject::TypeJson:\n        req.setRawHeader(\"Content-Type\", \"application/json\");\n        break;\n    }\n\n    if (Private::fullLog_env)\n        qDebug() << \"QtAseman::Network, \" + method.toUpper().toUtf8() + \" url:\" << url.toString() << \"data-length:\" << data.length();\n\n    QNetworkReply *reply = p->accessManager->sendCustomRequest(req, method.toUtf8(), data);\n    reply->setParent(this);\n\n    AsemanNetworkRequestReply *reqReply = new AsemanNetworkRequestReply(p->ignoreSslErrors || request->ignoreSslErrors(), reply);\n\n    return reqReply;\n}\n\n#if QT_CONFIG(http)\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::customMethod(AsemanNetworkRequestObject *request, const QString &method, const QUrl &url, QHttpMultiPart *parts, const QVariantMap &headers)\n{\n    QNetworkRequest req;\n    req.setUrl(url);\n    req.setMaximumRedirectsAllowed(10);\n#ifdef ASEMAN_QT6\n    req.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);\n#else\n    req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);\n#endif\n\n    addHeaderData(req, headers);\n\n    req.setRawHeader(\"Content-Type\", \"multipart/form-data; boundary=\\\"\" + p->boundaryToken.toUtf8() + \"\\\"\");\n\n    if (Private::fullLog_env)\n        qDebug() << \"QtAseman::Network, \" + method.toUpper().toUtf8() + \" url:\" << url.toString() << \"data-length: uncalculatble\";\n\n    QNetworkReply *reply = p->accessManager->sendCustomRequest(req, method.toUtf8(), parts);\n    reply->setParent(this);\n\n    AsemanNetworkRequestReply *reqReply = new AsemanNetworkRequestReply(p->ignoreSslErrors || request->ignoreSslErrors(), reply);\n\n    return reqReply;\n}\n#endif\n\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::customMethodForm(AsemanNetworkRequestObject *request, const QString &method, const QUrl &url, const QVariantMap &formData, const QVariantMap &headers)\n{\n#if QT_CONFIG(http)\n    QHttpMultiPart *parts = generateFormData(formData);\n    return AsemanNetworkRequestManager::customMethod(request, method, url, parts, headers);\n#else\n    QByteArray data = generateForm(formData).toUtf8();\n    QVariantMap newHeaders = headers;\n    newHeaders[\"Content-Type\"] = QVariant::fromValue<QString>(\"multipart/form-data; boundary=\" + p->boundaryToken);\n    return AsemanNetworkRequestManager::customMethod(request, method, url, data, newHeaders);\n#endif\n}\n\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::put(AsemanNetworkRequestObject *request, const QUrl &url, const QByteArray &data, const QVariantMap &headers)\n{\n    QNetworkRequest req;\n    req.setUrl(url);\n    req.setMaximumRedirectsAllowed(10);\n#ifdef ASEMAN_QT6\n    req.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);\n#else\n    req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);\n#endif\n    req.setHeader(QNetworkRequest::ContentLengthHeader, QString::number(data.size()).toUtf8());\n\n    addHeaderData(req, headers);\n\n    switch (request->contentType())\n    {\n    case AsemanNetworkRequestObject::TypeWWWForm:\n        req.setRawHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n        break;\n    case AsemanNetworkRequestObject::TypeJson:\n        req.setRawHeader(\"Content-Type\", \"application/json\");\n        break;\n    }\n\n    if (Private::fullLog_env)\n        qDebug() << \"QtAseman::Network, PUT url:\" << url.toString() << \"data-length:\" + QString::number(data.size());\n\n    QNetworkReply *reply = p->accessManager->put(req, data);\n    reply->setParent(this);\n\n    AsemanNetworkRequestReply *reqReply = new AsemanNetworkRequestReply(p->ignoreSslErrors || request->ignoreSslErrors(), reply);\n\n    return reqReply;\n}\n\n#if QT_CONFIG(http)\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::put(AsemanNetworkRequestObject *request, const QUrl &url, QHttpMultiPart *parts, const QVariantMap &headers)\n{\n    QNetworkRequest req;\n    req.setUrl(url);\n    req.setMaximumRedirectsAllowed(10);\n#ifdef ASEMAN_QT6\n    req.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);\n#else\n    req.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);\n#endif\n\n    addHeaderData(req, headers);\n\n    req.setRawHeader(\"Content-Type\", \"multipart/form-data; boundary=\\\"\" + p->boundaryToken.toUtf8() + \"\\\"\");\n\n    if (Private::fullLog_env)\n        qDebug() << \"QtAseman::Network, POST url:\" << url.toString() << \"data-length: uncalculatble\";\n\n    QNetworkReply *reply = p->accessManager->put(req, parts);\n    reply->setParent(this);\n\n    AsemanNetworkRequestReply *reqReply = new AsemanNetworkRequestReply(p->ignoreSslErrors || request->ignoreSslErrors(), reply);\n\n    return reqReply;\n}\n#endif\n\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::putForm(AsemanNetworkRequestObject *request, const QUrl &url, const QVariantMap &formData, const QVariantMap &headers)\n{\n#if QT_CONFIG(http)\n    QHttpMultiPart *parts = generateFormData(formData);\n    return AsemanNetworkRequestManager::put(request, url, parts, headers);\n#else\n    QByteArray data = generateForm(formData).toUtf8();\n    QVariantMap newHeaders = headers;\n    newHeaders[\"Content-Type\"] = QVariant::fromValue<QString>(\"multipart/form-data; boundary=\" + p->boundaryToken);\n    return AsemanNetworkRequestManager::put(request, url, data, newHeaders);\n#endif\n}\n\nvoid AsemanNetworkRequestManager::processPostedRequest(AsemanNetworkRequestReply *reply, AsemanNetworkRequestObject *request, std::function<QVariant (QByteArray)> dataConvertMethod)\n{\n    request->setError(QStringLiteral(\"\"));\n    request->setSslErrors(QStringLiteral(\"\"));\n    request->setResult(QVariant(), -1);\n    request->setRefreshing(true);\n\n    QPointer<AsemanNetworkRequestObject> req = request;\n    connect(reply, &AsemanNetworkRequestReply::finished, this, [req, dataConvertMethod](qint32 status, const QByteArray &data){\n        QVariant response;\n        if (dataConvertMethod)\n            response = dataConvertMethod(data);\n        else\n            response = QVariant::fromValue<QByteArray>(data);\n\n        req->setResult(response, status);\n        req->setRefreshing(false);\n    });\n    connect(reply, &AsemanNetworkRequestReply::error, this, [req](const QString &errorString, QNetworkReply::NetworkError){\n        req->setError(errorString);\n        req->setRefreshing(false);\n    });\n#if QT_CONFIG(ssl)\n    connect(reply, &AsemanNetworkRequestReply::sslErrors, this, [req](const QString &errorString){\n        req->setSslErrors(errorString);\n    });\n#endif\n    connect(reply, &AsemanNetworkRequestReply::uploadProgress, req, &AsemanNetworkRequestObject::uploadProgress);\n    connect(reply, &AsemanNetworkRequestReply::downloadProgress, req, &AsemanNetworkRequestObject::downloadProgress);\n}\n\nQUrlQuery AsemanNetworkRequestManager::queryOfMap(const QVariantMap &keys) const\n{\n    QUrlQuery query;\n    QMapIterator<QString, QVariant> i(keys);\n    while (i.hasNext())\n    {\n        i.next();\n        QVariant var = i.value();\n        if (var.type() != QVariant::String)\n            var.convert(QVariant::String);\n\n        query.addQueryItem(i.key(), var.toString());\n    }\n\n    return query;\n}\n\nQByteArray AsemanNetworkRequestManager::variantToData(const QVariant &var) const\n{\n    QByteArray data;\n    QVariant dataVar = var;\n    switch (static_cast<qint32>(dataVar.type()))\n    {\n    case QVariant::String:\n        data = dataVar.toString().toUtf8();\n        break;\n\n    case QVariant::ByteArray:\n        data = dataVar.toByteArray();\n        break;\n\n    default:\n        dataVar.convert(QVariant::String);\n        data = dataVar.toString().toUtf8();\n        break;\n    }\n    return data;\n}\n\nQVariant AsemanNetworkRequestManager::processData(AsemanNetworkRequestReply *reply, const QByteArray &data) const\n{\n    if (reply->headers().value(QStringLiteral(\"content-type\")).toString().contains(QStringLiteral(\"application/json\")))\n        return QJsonDocument::fromJson(data).toVariant();\n    else\n        return QVariant::fromValue(data);\n}\n\nvoid AsemanNetworkRequestManager::addHeaderData(QNetworkRequest &request, const QVariantMap &headers)\n{\n    QMapIterator<QString, QVariant> i(headers);\n    while (i.hasNext())\n    {\n        i.next();\n        QVariant var = i.value();\n        if (var.type() != QVariant::String)\n            var.convert(QVariant::String);\n\n        request.setRawHeader(i.key().toUtf8(), var.toString().toUtf8());\n    }\n}\n\n#if QT_CONFIG(http)\nQHttpMultiPart *AsemanNetworkRequestManager::generateFormData(const QVariantMap &map)\n{\n    QHttpMultiPart *parts = new QHttpMultiPart(this);\n    parts->setBoundary(p->boundaryToken.toUtf8());\n\n    QMapIterator<QString, QVariant> i(map);\n    while (i.hasNext())\n    {\n        i.next();\n        QVariant var = i.value();\n        if (var.type() == QVariant::Url)\n        {\n            QUrl source = var.toUrl();\n            QString filePath = source.toLocalFile();\n            if (filePath.isEmpty() && !source.isEmpty())\n                filePath = source.toString();\n\n            QFile *file = new QFile(filePath);\n            file->open(QIODevice::ReadOnly);\n            file->setParent(parts);\n\n            QMimeDatabase mimeDb;\n\n            QHttpPart imagePart;\n            imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(mimeDb.mimeTypeForFile(filePath).name()));\n            imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(\"form-data; name=\\\"\" + i.key().toUtf8() + \"\\\"; filename=\\\"\" + QFileInfo(filePath).fileName() + \"\\\"\"));\n            imagePart.setBodyDevice(file);\n\n            parts->append(imagePart);\n        }\n        else\n        {\n            if (var.type() != QVariant::String)\n                var.convert(QVariant::String);\n\n            QHttpPart part;\n            part.setHeader(QNetworkRequest::ContentDispositionHeader,QVariant(\"form-data; name=\\\"\" + i.key().toUtf8() + \"\\\"\"));\n            part.setBody(i.value().toString().toUtf8());\n\n            parts->append(part);\n        }\n    }\n\n    return parts;\n}\n#endif\n\nQString AsemanNetworkRequestManager::generateWWWFormData(const QVariantMap &map, bool ignoreEmpty) const\n{\n    QUrlQuery query;\n    QMapIterator<QString, QVariant> i(map);\n    while (i.hasNext())\n    {\n        i.next();\n        QVariant var = i.value();\n        if (var.type() != QVariant::String)\n            var.convert(QVariant::String);\n        if (ignoreEmpty && var.toString().isEmpty())\n            continue;\n\n        query.addQueryItem(i.key(), var.toString());\n    }\n    return query.query();\n}\n\nQString AsemanNetworkRequestManager::generateForm(const QVariantMap &map, bool ignoreEmpty) const\n{\n    QString query;\n    QMapIterator<QString, QVariant> i(map);\n    while (i.hasNext())\n    {\n        i.next();\n        QVariant var = i.value();\n        if (var.type() != QVariant::String)\n            var.convert(QVariant::String);\n        if (ignoreEmpty && var.toString().isEmpty())\n            continue;\n\n        query += QStringLiteral(\"--%1\\r\\nContent-Disposition: form-data; name=\\\"%2\\\"\\r\\n\\r\\n%3\\r\\n\")\n                .arg(p->boundaryToken)\n                .arg(i.key())\n                .arg(var.toString());\n    }\n\n    query += \"--\" + p->boundaryToken + \"--\\r\\n\";\n    return query;\n}\n\nQString AsemanNetworkRequestManager::generateJson(const QVariantMap &map) const\n{\n    return QString::fromUtf8( QJsonDocument::fromVariant(map).toJson(QJsonDocument::Compact) );\n}\n\nQByteArray AsemanNetworkRequestManager::requestData(AsemanNetworkRequestObject *request, bool ignoreEmptyValues)\n{\n    switch (static_cast<qint32>(request->contentType()))\n    {\n    case AsemanNetworkRequestObject::TypeForm:\n        return generateForm(ignoreEmptyValues? removeEmptyValues(request->toMap()) : request->toMap()).toUtf8();\n    case AsemanNetworkRequestObject::TypeWWWForm:\n        return generateWWWFormData(ignoreEmptyValues? removeEmptyValues(request->toMap()) : request->toMap()).toUtf8();\n    case AsemanNetworkRequestObject::TypeJson:\n        return generateJson(ignoreEmptyValues? removeEmptyValues(request->toMap()) : request->toMap()).toUtf8();\n    default:\n        return variantToData(request->data());\n    }\n    return QByteArray();\n}\n\nQVariantMap AsemanNetworkRequestManager::removeEmptyValues(const QVariantMap &data)\n{\n    QVariantMap requestData;\n    QVariantMap map = data;\n    QMapIterator<QString, QVariant> i(map);\n    while (i.hasNext())\n    {\n        i.next();\n        if (i.value().type() == QVariant::String && i.value().toString().isEmpty())\n            continue;\n\n        requestData[i.key()] = i.value();\n    }\n    return requestData;\n}\n\nvoid AsemanNetworkRequestManager::setBoundaryToken(const QString &boundaryToken)\n{\n    if (p->boundaryToken == boundaryToken)\n        return;\n\n    p->boundaryToken = boundaryToken;\n    Q_EMIT boundaryTokenChanged();\n}\n\nQString AsemanNetworkRequestManager::boundaryToken() const\n{\n    return p->boundaryToken;\n}\n\nvoid AsemanNetworkRequestManager::setIgnoreSslErrors(bool ignoreSslErrors)\n{\n    if (p->ignoreSslErrors == ignoreSslErrors)\n        return;\n\n    p->ignoreSslErrors = ignoreSslErrors;\n    Q_EMIT ignoreSslErrorsChanged();\n}\n\nbool AsemanNetworkRequestManager::ignoreSslErrors() const\n{\n    return p->ignoreSslErrors;\n}\n\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::get(AsemanNetworkRequestObject *request, bool ignoreEmptyValues)\n{\n    QVariantMap keys = ignoreEmptyValues? removeEmptyValues(request->toMap()) : request->toMap();\n    AsemanNetworkRequestReply *reply = get(request, request->url(), keys, request->headers());\n\n    processPostedRequest(reply, request, [this, reply](const QByteArray &data) -> QVariant { return processData(reply, data); });\n    return reply;\n}\n\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::post(AsemanNetworkRequestObject *request, bool ignoreEmptyValues)\n{\n    AsemanNetworkRequestReply *reply;\n    if (request->contentType() == AsemanNetworkRequestObject::TypeForm)\n        reply = postForm(request, request->url(), (ignoreEmptyValues? removeEmptyValues(request->toMap()) : request->toMap()), request->headers());\n    else\n        reply = post(request, request->url(), requestData(request, ignoreEmptyValues), request->headers());\n\n    processPostedRequest(reply, request, [this, reply](const QByteArray &data) -> QVariant { return processData(reply, data); });\n    return reply;\n}\n\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::put(AsemanNetworkRequestObject *request, bool ignoreEmptyValues)\n{\n    AsemanNetworkRequestReply *reply;\n#if QT_CONFIG(http)\n    if (request->contentType() == AsemanNetworkRequestObject::TypeForm)\n        reply = putForm(request, request->url(), (ignoreEmptyValues? removeEmptyValues(request->toMap()) : request->toMap()), request->headers());\n    else\n#endif\n        reply = put(request, request->url(), requestData(request, ignoreEmptyValues), request->headers());\n\n    processPostedRequest(reply, request, [this, reply](const QByteArray &data) -> QVariant { return processData(reply, data); });\n    return reply;\n}\n\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::patch(AsemanNetworkRequestObject *request, bool ignoreEmptyValues)\n{\n    return customMethod(QStringLiteral(\"PATCH\"), request, ignoreEmptyValues);\n}\n\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::deleteMethod(AsemanNetworkRequestObject *request, bool ignoreEmptyValues)\n{\n    return customMethod(QStringLiteral(\"DELETE\"), request, ignoreEmptyValues);\n}\n\nAsemanNetworkRequestReply *AsemanNetworkRequestManager::customMethod(const QString &method, AsemanNetworkRequestObject *request, bool ignoreEmptyValues)\n{\n    AsemanNetworkRequestReply *reply;\n#if QT_CONFIG(http)\n    if (request->contentType() == AsemanNetworkRequestObject::TypeForm)\n        reply = customMethodForm(request, method, request->url(), (ignoreEmptyValues? removeEmptyValues(request->toMap()) : request->toMap()), request->headers());\n    else\n#endif\n        reply = customMethod(request, method, request->url(), requestData(request, ignoreEmptyValues), request->headers());\n\n    processPostedRequest(reply, request, [this, reply](const QByteArray &data) -> QVariant { return processData(reply, data); });\n    return reply;\n}\n\nAsemanNetworkRequestManager::~AsemanNetworkRequestManager()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/network/asemannetworkrequestmanager.h",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANNETWORKREQUESTMANAGER_H\n#define ASEMANNETWORKREQUESTMANAGER_H\n\n#include <QNetworkRequest>\n#include <QObject>\n#include <QUrlQuery>\n#include <QVariantMap>\n\n#include \"asemannetworkrequestobject.h\"\n#include \"asemannetworkrequestreply.h\"\n\n#include <functional>\n\n#include \"asemannetwork_global.h\"\n\n#if QT_CONFIG(http)\nclass QHttpMultiPart;\n#endif\n\nclass LIBQTASEMAN_NETWORK_EXPORT AsemanNetworkRequestManager : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QString boundaryToken READ boundaryToken WRITE setBoundaryToken NOTIFY boundaryTokenChanged)\n    Q_PROPERTY(bool ignoreSslErrors READ ignoreSslErrors WRITE setIgnoreSslErrors NOTIFY ignoreSslErrorsChanged)\n    class Private;\n\npublic:\n    AsemanNetworkRequestManager(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanNetworkRequestManager();\n\n    static QVariantMap removeEmptyValues(const QVariantMap &data);\n\n    void setBoundaryToken(const QString &boundaryToken);\n    QString boundaryToken() const;\n\n    void setIgnoreSslErrors(bool ignoreSslErrors);\n    bool ignoreSslErrors() const;\n\nQ_SIGNALS:\n    void boundaryTokenChanged();\n    void ignoreSslErrorsChanged();\n\npublic Q_SLOTS:\n    AsemanNetworkRequestReply *get(AsemanNetworkRequestObject *request, bool ignoreEmptyValues = true);\n    AsemanNetworkRequestReply *post(AsemanNetworkRequestObject *request, bool ignoreEmptyValues = true);\n    AsemanNetworkRequestReply *put(AsemanNetworkRequestObject *request, bool ignoreEmptyValues = true);\n    AsemanNetworkRequestReply *patch(AsemanNetworkRequestObject *request, bool ignoreEmptyValues = true);\n    AsemanNetworkRequestReply *deleteMethod(AsemanNetworkRequestObject *request, bool ignoreEmptyValues = true);\n    AsemanNetworkRequestReply *customMethod(const QString &method, AsemanNetworkRequestObject *request, bool ignoreEmptyValues = true);\n\nprotected:\n    virtual AsemanNetworkRequestReply *get(AsemanNetworkRequestObject *request, const QUrl &apiUrl, const QVariantMap &keys = QVariantMap(), const QVariantMap &headers = QVariantMap());\n    virtual AsemanNetworkRequestReply *post(AsemanNetworkRequestObject *request, const QUrl &apiUrl, const QByteArray &data, const QVariantMap &headers = QVariantMap());\n    virtual AsemanNetworkRequestReply *put(AsemanNetworkRequestObject *request, const QUrl &apiUrl, const QByteArray &data, const QVariantMap &headers = QVariantMap());\n    virtual AsemanNetworkRequestReply *customMethod(AsemanNetworkRequestObject *request, const QString &method, const QUrl &apiUrl, const QByteArray &data, const QVariantMap &headers = QVariantMap());\n    virtual void processPostedRequest(AsemanNetworkRequestReply *reply, AsemanNetworkRequestObject *request, std::function<QVariant (QByteArray)> dataConvertMethod = Q_NULLPTR);\n\n    virtual AsemanNetworkRequestReply *postForm(AsemanNetworkRequestObject *request, const QUrl &apiUrl, const QVariantMap &formData, const QVariantMap &headers = QVariantMap());\n    virtual AsemanNetworkRequestReply *putForm(AsemanNetworkRequestObject *request, const QUrl &apiUrl, const QVariantMap &formData, const QVariantMap &headers = QVariantMap());\n    virtual AsemanNetworkRequestReply *customMethodForm(AsemanNetworkRequestObject *request, const QString &method, const QUrl &apiUrl, const QVariantMap &formData, const QVariantMap &headers = QVariantMap());\n\n#if QT_CONFIG(http)\n    virtual AsemanNetworkRequestReply *post(AsemanNetworkRequestObject *request, const QUrl &apiUrl, QHttpMultiPart *parts, const QVariantMap &headers = QVariantMap());\n    virtual AsemanNetworkRequestReply *put(AsemanNetworkRequestObject *request, const QUrl &apiUrl, QHttpMultiPart *parts, const QVariantMap &headers = QVariantMap());\n    virtual AsemanNetworkRequestReply *customMethod(AsemanNetworkRequestObject *request, const QString &method, const QUrl &apiUrl, QHttpMultiPart *parts, const QVariantMap &headers = QVariantMap());\n#endif\n\nprivate:\n    QUrlQuery queryOfMap(const QVariantMap &keys) const;\n    QByteArray variantToData(const QVariant &var) const;\n    QVariant processData(AsemanNetworkRequestReply *reply, const QByteArray &data) const;\n    void addHeaderData(QNetworkRequest &request, const QVariantMap &headers);\n\n#if QT_CONFIG(http)\n    QHttpMultiPart *generateFormData(const QVariantMap &map);\n#endif\n\n    QString generateWWWFormData(const QVariantMap &map, bool ignoreEmpty = false) const;\n    QString generateForm(const QVariantMap &map, bool ignoreEmpty = false) const;\n    QString generateJson(const QVariantMap &map) const;\n    QByteArray requestData(AsemanNetworkRequestObject *request, bool ignoreEmptyValues);\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanNetworkRequestManager QAsemanNetworkRequestManager;\n\n#endif // ASEMANNETWORKREQUESTMANAGER_H\n"
  },
  {
    "path": "src/network/asemannetworkrequestobject.cpp",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemannetworkrequestobject.h\"\n#include \"asemannetworkrequestmanager.h\"\n\n#include <QJsonDocument>\n#include <QMetaProperty>\n#include <QTimer>\n#include <QDebug>\n#include <QDataStream>\n#include <QFile>\n#include <QDir>\n#include <QJSValue>\n\nclass AsemanNetworkRequestObject::Private\n{\npublic:\n    QVariant cachedData;\n    QVariant response;\n    QVariant data;\n    qint32 status;\n    qint32 contentType;\n    bool refreshing;\n    QString error;\n    QString sslErrors;\n    QStringList ignoreKeys;\n    QRegularExpression ignoreRegExp;\n    QVariantMap headers;\n    QUrl url;\n    bool ignoreSslErrors;\n\n    std::function<void ()> refresherMethod_cpp;\n    QTimer *refreshTimer;\n    QString cachePath;\n\n    bool storeLock;\n\n    QHash<QByteArray, QByteArray> signalsProperties;\n};\n\nAsemanNetworkRequestObject::AsemanNetworkRequestObject(QObject *parent) :\n    AsemanNetworkQuickObject(parent)\n{\n    p = new Private;\n    p->status = -1;\n    p->refreshing = false;\n    p->storeLock = false;\n    p->refresherMethod_cpp = Q_NULLPTR;\n    p->contentType = TypeForm;\n    p->ignoreSslErrors = false;\n\n    p->refreshTimer = new QTimer(this);\n    p->refreshTimer->setInterval(100);\n    p->refreshTimer->setSingleShot(true);\n\n    connect(this, &AsemanNetworkRequestObject::headersChanged, this, &AsemanNetworkRequestObject::refresh);\n    connect(p->refreshTimer, &QTimer::timeout, this, &AsemanNetworkRequestObject::tryRefresh);\n\n    QMetaObject::invokeMethod(this, \"initProperties\", Qt::QueuedConnection);\n}\n\nQVariant AsemanNetworkRequestObject::response() const\n{\n    return p->response;\n}\n\nQVariant AsemanNetworkRequestObject::data() const\n{\n    return p->data;\n}\n\nvoid AsemanNetworkRequestObject::setData(const QVariant &data)\n{\n    if (p->data == data)\n        return;\n\n    p->data = data;\n    Q_EMIT dataChanged();\n}\n\nint AsemanNetworkRequestObject::contentType() const\n{\n    return p->contentType;\n}\n\nvoid AsemanNetworkRequestObject::setContentType(int contentType)\n{\n    if (p->contentType == contentType)\n        return;\n\n    p->contentType = contentType;\n    Q_EMIT contentTypeChanged();\n}\n\nQVariant AsemanNetworkRequestObject::cachedData() const\n{\n    return p->cachedData;\n}\n\nvoid AsemanNetworkRequestObject::setCachedData(const QVariant &cachedData)\n{\n    if (p->cachedData == cachedData)\n        return;\n\n    p->cachedData = cachedData;\n    store();\n    Q_EMIT cachedDataChanged();\n}\n\nvoid AsemanNetworkRequestObject::setCachePath(const QString &cachePath)\n{\n    if (p->cachePath == cachePath)\n        return;\n\n    p->cachePath = cachePath;\n    restore();\n    Q_EMIT cachePathChanged();\n}\n\nQString AsemanNetworkRequestObject::cachePath() const\n{\n    return p->cachePath;\n}\n\nqint32 AsemanNetworkRequestObject::status() const\n{\n    return p->status;\n}\n\nvoid AsemanNetworkRequestObject::setResult(const QVariant &response, qint32 status)\n{\n    p->response = response;\n    p->status = status;\n\n    qint32 code = p->status/100;\n    switch (code)\n    {\n    case 2:\n        Q_EMIT successfull(status);\n        break;\n    case 4:\n        Q_EMIT clientError(status);\n        Q_EMIT unsuccessfull(status);\n        break;\n    case 5:\n        Q_EMIT serverError(status);\n        Q_EMIT unsuccessfull(status);\n        break;\n    }\n\n    Q_EMIT statusChanged();\n    Q_EMIT responseChanged();\n}\n\nbool AsemanNetworkRequestObject::refreshing() const\n{\n    return p->refreshing;\n}\n\nvoid AsemanNetworkRequestObject::setRefreshing(bool refreshing)\n{\n    if (p->refreshing == refreshing)\n        return;\n\n    p->refreshing = refreshing;\n    Q_EMIT refreshingChanged();\n}\n\nQString AsemanNetworkRequestObject::error() const\n{\n    return p->error;\n}\n\nvoid AsemanNetworkRequestObject::setError(const QString &error)\n{\n    if (p->error == error)\n        return;\n\n    p->error = error;\n    Q_EMIT errorChanged();\n}\n\nvoid AsemanNetworkRequestObject::setRefresherMethod(std::function<void ()> refresherMethod)\n{\n    p->refresherMethod_cpp = refresherMethod;\n}\n\nQVariantMap AsemanNetworkRequestObject::headers() const\n{\n    return p->headers;\n}\n\nvoid AsemanNetworkRequestObject::setHeaders(const QVariantMap &headers)\n{\n    if (p->headers == headers)\n        return;\n\n    p->headers = headers;\n    Q_EMIT headersChanged();\n}\n\nQUrl AsemanNetworkRequestObject::url() const\n{\n    return p->url;\n}\n\nvoid AsemanNetworkRequestObject::setUrl(const QUrl &url)\n{\n    if (p->url == url)\n        return;\n\n    p->url = url;\n    Q_EMIT urlChanged();\n}\n\nQStringList AsemanNetworkRequestObject::ignoreKeys() const\n{\n    return p->ignoreKeys;\n}\n\nvoid AsemanNetworkRequestObject::setIgnoreKeys(const QStringList &ignoreKeys)\n{\n    if (p->ignoreKeys == ignoreKeys)\n        return;\n\n    p->ignoreKeys = ignoreKeys;\n    Q_EMIT ignoreKeysChanged();\n}\n\nQRegularExpression AsemanNetworkRequestObject::ignoreRegExp() const\n{\n    return p->ignoreRegExp;\n}\n\nvoid AsemanNetworkRequestObject::setIgnoreRegExp(const QRegularExpression &ignoreRegExp)\n{\n    if (p->ignoreRegExp == ignoreRegExp)\n        return;\n\n    p->ignoreRegExp = ignoreRegExp;\n    Q_EMIT ignoreRegExpChanged();\n}\n\nvoid AsemanNetworkRequestObject::setIgnoreSslErrors(bool ignoreSslErrors)\n{\n    if (p->ignoreSslErrors == ignoreSslErrors)\n        return;\n\n    p->ignoreSslErrors = ignoreSslErrors;\n    Q_EMIT ignoreSslErrorsChanged();\n}\n\nbool AsemanNetworkRequestObject::ignoreSslErrors() const\n{\n    return p->ignoreSslErrors;\n}\n\nQString AsemanNetworkRequestObject::sslErrors() const\n{\n    return p->sslErrors;\n}\n\nvoid AsemanNetworkRequestObject::setSslErrors(const QString &sslErrors)\n{\n    if (sslErrors == p->sslErrors)\n        return;\n\n    p->sslErrors = sslErrors;\n    Q_EMIT sslErrorsChanged();\n}\n\nQVariantMap AsemanNetworkRequestObject:: toMap() const\n{\n    QVariantMap res;\n    const QStringList &properties = AsemanNetworkRequestObject::properties();\n    for (const QString &pr: properties)\n        if (!p->ignoreKeys.contains(pr) && (p->ignoreRegExp.pattern().isEmpty() || pr.indexOf(p->ignoreRegExp) < 0) )\n        {\n            QVariant var = property(pr.toUtf8());\n            if (QString::fromUtf8(var.typeName()) == QStringLiteral(\"QJSValue\"))\n                var = var.value<QJSValue>().toVariant();\n            res[pr] = var;\n        }\n    return res;\n}\n\nvoid AsemanNetworkRequestObject::fromMap(const QVariantMap &map)\n{\n    const QStringList &properties = AsemanNetworkRequestObject::properties();\n    for (const QString &pr: properties)\n        if (!p->ignoreKeys.contains(pr) && map.contains(pr) && (p->ignoreRegExp.pattern().isEmpty() || pr.indexOf(p->ignoreRegExp) < 0))\n            setProperty(pr.toUtf8(), map.value(pr));\n}\n\nQString AsemanNetworkRequestObject::toJson() const\n{\n    return QString::fromUtf8( QJsonDocument::fromVariant(toMap()).toJson() );\n}\n\nvoid AsemanNetworkRequestObject::fromJson(const QString &json)\n{\n    fromMap( QJsonDocument::fromJson(json.toUtf8()).toVariant().toMap() );\n}\n\nQString AsemanNetworkRequestObject::toFormData(bool ignoreEmpty) const\n{\n    QString res;\n    const QStringList &properties = AsemanNetworkRequestObject::properties();\n    for (const QString &pr: properties)\n    {\n        if (p->ignoreKeys.contains(pr) || (!p->ignoreRegExp.pattern().isEmpty() && pr.indexOf(p->ignoreRegExp) >= 0))\n            continue;\n        QVariant var = property(pr.toUtf8());\n        if (var.type() != QVariant::String)\n            var.convert(QVariant::String);\n        if (ignoreEmpty && var.toString().isEmpty())\n            continue;\n\n        if (res.count())\n            res += QStringLiteral(\"\\n\");\n\n        res += pr + QStringLiteral(\"=\") + var.toString().toUtf8().toPercentEncoding();\n    }\n    return res;\n}\n\nvoid AsemanNetworkRequestObject::fromFormData(const QString &formData)\n{\n    QVariantMap map;\n    QStringList lines = formData.split(QStringLiteral(\"\\n\"), Qt::SkipEmptyParts);\n    for (const QString &l: lines)\n    {\n        qint32 idx = l.indexOf(QStringLiteral(\"=\"));\n        if (idx == -1)\n            continue;\n\n        QString key = l.left(idx);\n        if (p->ignoreKeys.contains(key) || (!p->ignoreRegExp.pattern().isEmpty() && key.indexOf(p->ignoreRegExp) >= 0))\n            continue;\n\n        QString val = QString::fromUtf8( QByteArray::fromPercentEncoding(l.mid(idx+1).toUtf8()) );\n\n        map[key] = val;\n    }\n\n    fromMap(map);\n}\n\nQStringList AsemanNetworkRequestObject::properties() const\n{\n    QStringList res;\n\n    const QMetaObject *meta = metaObject();\n    const QMetaObject *thisMeta = &AsemanNetworkRequestObject::staticMetaObject;\n    for (int i=thisMeta->propertyCount(); i<meta->propertyCount(); i++)\n    {\n        QMetaProperty property = meta->property(i);\n        const QByteArray &propertyName = property.name();\n        res << QString::fromUtf8(propertyName);\n    }\n\n    return res;\n}\n\nvoid AsemanNetworkRequestObject::refresh()\n{\n    p->refreshTimer->stop();\n    if (!p->refresherMethod_cpp)\n        return;\n\n    p->refreshTimer->start();\n}\n\nvoid AsemanNetworkRequestObject::tryRefresh()\n{\n    if (p->refresherMethod_cpp)\n        p->refresherMethod_cpp();\n}\n\nvoid AsemanNetworkRequestObject::initProperties()\n{\n    AsemanNetworkRequestObject::properties();\n    const QMetaObject *meta = metaObject();\n    const QMetaObject *thisMeta = &AsemanNetworkRequestObject::staticMetaObject;\n    for (int i=thisMeta->propertyCount(); i<meta->propertyCount(); i++)\n    {\n        QMetaProperty property = meta->property(i);\n        const QByteArray &propertyName = property.name();\n        const QByteArray &signalSign = property.notifySignal().methodSignature();\n        p->signalsProperties[signalSign] = propertyName;\n        connect(this, QByteArray(QByteArray::number(QSIGNAL_CODE)+signalSign),\n                this, SLOT(propertyChanged()));\n    }\n}\n\nvoid AsemanNetworkRequestObject::store()\n{\n    if (p->cachePath.isEmpty() || p->storeLock)\n        return;\n\n    QFileInfo inf(p->cachePath);\n    QString root = inf.dir().path();\n    QDir().mkpath(root);\n\n    QFile file(p->cachePath);\n    if (!file.open(QFile::WriteOnly))\n        return;\n\n    QDataStream stream(&file);\n    stream << p->cachedData;\n\n    file.close();\n}\n\nvoid AsemanNetworkRequestObject::restore()\n{\n    if (p->cachePath.isEmpty())\n        return;\n\n    QFileInfo inf(p->cachePath);\n    QString root = inf.dir().path();\n    QDir().mkpath(root);\n\n    QFile file(p->cachePath);\n    if (!file.open(QFile::ReadOnly))\n        return;\n\n    QVariant data;\n\n    QDataStream stream(&file);\n    stream >> data;\n\n    file.close();\n\n    p->storeLock = true;\n    setCachedData(data);\n    p->storeLock = false;\n}\n\nvoid AsemanNetworkRequestObject::propertyChanged()\n{\n    if(sender() != this)\n        return;\n\n    const int signalIndex = senderSignalIndex();\n    if(signalIndex == -1)\n        return;\n\n    QMetaMethod signalObj = metaObject()->method(signalIndex);\n    const QByteArray &propertyName = p->signalsProperties.value(signalObj.methodSignature());\n    const QVariant &value = property(propertyName);\n\n    Q_UNUSED(value)\n    refresh();\n}\n\nAsemanNetworkRequestObject::~AsemanNetworkRequestObject()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/network/asemannetworkrequestobject.h",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANNETWORKREQUESTOBJECT_H\n#define ASEMANNETWORKREQUESTOBJECT_H\n\n#include <QObject>\n#include <QVariantMap>\n#include <QUrl>\n#include <QRegularExpression>\n\n#include <functional>\n\n#include \"asemannetworkquickobject.h\"\n#include \"asemannetwork_global.h\"\n\nclass LIBQTASEMAN_NETWORK_EXPORT AsemanNetworkRequestObject : public AsemanNetworkQuickObject\n{\n    Q_OBJECT\n    Q_ENUMS(ContentType)\n\n    Q_PROPERTY(QVariant response READ response NOTIFY responseChanged)\n    Q_PROPERTY(QVariant data READ data WRITE setData NOTIFY dataChanged)\n    Q_PROPERTY(QVariant cachedData READ cachedData WRITE setCachedData NOTIFY cachedDataChanged)\n    Q_PROPERTY(int contentType READ contentType WRITE setContentType NOTIFY contentTypeChanged)\n    Q_PROPERTY(qint32 status READ status NOTIFY statusChanged)\n    Q_PROPERTY(bool refreshing READ refreshing NOTIFY refreshingChanged)\n    Q_PROPERTY(QString error READ error NOTIFY errorChanged)\n    Q_PROPERTY(QString sslErrors READ sslErrors NOTIFY sslErrorsChanged)\n    Q_PROPERTY(QStringList ignoreKeys READ ignoreKeys WRITE setIgnoreKeys NOTIFY ignoreKeysChanged)\n    Q_PROPERTY(QRegularExpression ignoreRegExp READ ignoreRegExp WRITE setIgnoreRegExp NOTIFY ignoreRegExpChanged)\n    Q_PROPERTY(QString cachePath READ cachePath WRITE setCachePath NOTIFY cachePathChanged)\n    Q_PROPERTY(QVariantMap headers READ headers WRITE setHeaders NOTIFY headersChanged)\n    Q_PROPERTY(QUrl url READ url WRITE setUrl NOTIFY urlChanged)\n    Q_PROPERTY(bool ignoreSslErrors READ ignoreSslErrors WRITE setIgnoreSslErrors NOTIFY ignoreSslErrorsChanged)\n\n    class Private;\n    friend class AsemanNetworkRequestManager;\n\npublic:\n    enum ContentType {\n        TypeJson,\n        TypeForm,\n        TypeWWWForm,\n        TypeNone\n    };\n\n    AsemanNetworkRequestObject(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanNetworkRequestObject();\n\n    QVariant response() const;\n\n    QVariant data() const;\n    void setData(const QVariant &data);\n\n    int contentType() const;\n    void setContentType(int contentType);\n\n    QVariant cachedData() const;\n    void setCachedData(const QVariant &cachedData);\n\n    void setCachePath(const QString &cachePath);\n    QString cachePath() const;\n\n    qint32 status() const;\n\n    bool refreshing() const;\n    void setRefreshing(bool refreshing);\n\n    QString error() const;\n    void setError(const QString &error);\n\n    void setRefresherMethod(std::function<void ()> refresherMethod);\n\n    QVariantMap headers() const;\n    void setHeaders(const QVariantMap &headers);\n\n    QUrl url() const;\n    void setUrl(const QUrl &url);\n\n    QStringList ignoreKeys() const;\n    void setIgnoreKeys(const QStringList &ignoreKeys);\n\n    QRegularExpression ignoreRegExp() const;\n    void setIgnoreRegExp(const QRegularExpression &ignoreRegExp);\n\n    void setIgnoreSslErrors(bool ignoreSslErrors);\n    bool ignoreSslErrors() const;\n\n    QString sslErrors() const;\n    void setSslErrors(const QString &sslErrors);\n\nQ_SIGNALS:\n    void responseChanged();\n    void cachedDataChanged();\n    void contentTypeChanged();\n    void statusChanged();\n    void refreshingChanged();\n    void errorChanged();\n    void ignoreKeysChanged();\n    void ignoreRegExpChanged();\n    void cachePathChanged();\n    void headersChanged();\n    void urlChanged();\n    void dataChanged();\n    void successfull(qint32 status);\n    void unsuccessfull(qint32 status);\n    void clientError(qint32 status);\n    void serverError(qint32 status);\n    void uploadProgress(qint64 bytesSent, qint64 bytesTotal);\n    void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);\n    void ignoreSslErrorsChanged();\n    void sslErrorsChanged();\n\npublic Q_SLOTS:\n    QVariantMap toMap() const;\n    void fromMap(const QVariantMap &map);\n\n    QString toJson() const;\n    void fromJson(const QString &json);\n\n    QString toFormData(bool ignoreEmpty = false) const;\n    void fromFormData(const QString &formData);\n\n    QStringList properties() const;\n\nprotected:\n    void refresh();\n\nprivate Q_SLOTS:\n    void initProperties();\n\nprivate:\n    void tryRefresh();\n    void setResult(const QVariant &response, qint32 status);\n\n    void store();\n    void restore();\n\nprivate Q_SLOTS:\n    void propertyChanged();\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanNetworkRequestObject QAsemanNetworkRequestObject;\n\n#endif // ASEMANNETWORKREQUESTOBJECT_H\n"
  },
  {
    "path": "src/network/asemannetworkrequestreply.cpp",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemannetworkrequestreply.h\"\n\n#include <QJsonDocument>\n#include <QPointer>\n\nclass AsemanNetworkRequestReply::Private\n{\npublic:\n    QByteArray buffer;\n    QPointer<QNetworkReply> reply;\n    bool finishedEmited;\n};\n\nAsemanNetworkRequestReply::AsemanNetworkRequestReply(bool ignoreSslErrors, QNetworkReply *reply) :\n    QObject(reply)\n{\n    p = new Private;\n    p->reply = reply;\n    p->finishedEmited = false;\n\n    connect(reply, &QNetworkReply::readyRead, this, [this](){\n        p->buffer += p->reply->readAll();\n    });\n#if QT_CONFIG(ssl)\n    connect(reply, &QNetworkReply::sslErrors, this, [this, ignoreSslErrors](const QList<QSslError> &errors){\n        if (ignoreSslErrors)\n            p->reply->ignoreSslErrors(errors);\n        else\n        {\n            QString errorString;\n            for (auto err: errors)\n            {\n                if (err.errorString().count())\n                    errorString += QStringLiteral(\": \") + err.errorString() + QStringLiteral(\"\\n\");\n            }\n\n            Q_EMIT error(errorString, QNetworkReply::UnknownServerError);\n            Q_EMIT sslErrors(errorString);\n\n            p->reply->deleteLater();\n            deleteLater();\n        }\n    });\n#endif\n    connect(reply, &QNetworkReply::finished, this, [this](){\n        if (p->finishedEmited)\n            return ;\n\n        p->finishedEmited = true;\n        Q_EMIT finished(statusCode(), p->buffer);\n\n        p->reply->deleteLater();\n        deleteLater();\n    });\n    connect(reply, &QNetworkReply::destroyed, this, [this](){\n        if (p->finishedEmited)\n            return ;\n\n        p->finishedEmited = true;\n        Q_EMIT finished(statusCode(), p->buffer);\n    });\n    connect(reply, &QNetworkReply::uploadProgress, this, &AsemanNetworkRequestReply::uploadProgress);\n    connect(reply, &QNetworkReply::downloadProgress, this, &AsemanNetworkRequestReply::downloadProgress);\n#ifdef ASEMAN_QT6\n    connect(reply, &QNetworkReply::errorOccurred,\n#else\n    connect(reply, static_cast<void(QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error),\n#endif\n            this, [this, reply](QNetworkReply::NetworkError err){\n        QVariant var = QVariant::fromValue<QNetworkReply::NetworkError>(err);\n        var.convert(QVariant::String);\n\n        QString errorString = var.toString().remove(QStringLiteral(\"QNetworkReply::\"));\n        if (reply->errorString().count())\n            errorString += QStringLiteral(\": \") + reply->errorString();\n\n        Q_EMIT error(errorString, err);\n\n        p->reply->deleteLater();\n        deleteLater();\n    });\n}\n\nvoid AsemanNetworkRequestReply::abort()\n{\n    if (!p->reply)\n        return;\n\n    p->buffer.clear();\n    p->reply->abort();\n}\n\nqint32 AsemanNetworkRequestReply::statusCode() const\n{\n    if (!p->reply)\n        return 0;\n\n    QVariant status_code = p->reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);\n    if (!status_code.isValid())\n        return 0;\n\n    return status_code.toString().toInt();\n}\n\nQVariantMap AsemanNetworkRequestReply::headers() const\n{\n    QVariantMap res;\n    if (!p->reply)\n        return res;\n\n    QList<QByteArray> list = p->reply->rawHeaderList();\n    for (const QByteArray &l: list)\n        res[QString::fromUtf8(l).toLower()] = QString::fromUtf8(p->reply->rawHeader(l));\n\n    return res;\n}\n\nAsemanNetworkRequestReply::~AsemanNetworkRequestReply()\n{\n    if (!p->finishedEmited)\n        abort();\n\n    delete p;\n}\n"
  },
  {
    "path": "src/network/asemannetworkrequestreply.h",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANNETWORKREQUESTREPLY_H\n#define ASEMANNETWORKREQUESTREPLY_H\n\n#include <QNetworkReply>\n#include <QObject>\n\n#include \"asemannetwork_global.h\"\n\nclass LIBQTASEMAN_NETWORK_EXPORT AsemanNetworkRequestReply : public QObject\n{\n    Q_OBJECT\n    class Private;\n\npublic:\n    AsemanNetworkRequestReply(bool ignoreSslErrors, QNetworkReply *reply = Q_NULLPTR);\n    virtual ~AsemanNetworkRequestReply();\n\n    qint32 statusCode() const;\n    QVariantMap headers() const;\n\nQ_SIGNALS:\n    void finished(qint32 status, const QByteArray &data);\n    void uploadProgress(qint64 bytesSent, qint64 bytesTotal);\n    void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);\n    void error(const QString &errorString, QNetworkReply::NetworkError errorCode);\n    void sslErrors(const QString &errorString);\n\npublic Q_SLOTS:\n    void abort();\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanNetworkRequestReply QAsemanNetworkRequestReply;\n\n#endif // ASEMANNETWORKREQUESTREPLY_H\n"
  },
  {
    "path": "src/network/asemannetworksleepmanager.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemannetworksleepmanager.h\"\n#include \"asemanhostchecker.h\"\n#include \"asemannetworkmanager.h\"\n#include \"asemannetworkmanageritem.h\"\n\n#include <QPointer>\n#include <QTimer>\n#include <QDebug>\n\nclass AsemanNetworkSleepManagerPrivate\n{\npublic:\n    AsemanHostChecker *hostCheker;\n    AsemanNetworkManager *networkManager;\n    QPointer<AsemanNetworkManagerItem> defaultNetwork;\n    bool available;\n    bool forceDisable;\n    bool networkManagerState;\n\n    QTimer *resetTimer;\n};\n\nAsemanNetworkSleepManager::AsemanNetworkSleepManager(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanNetworkSleepManagerPrivate;\n    p->hostCheker = new AsemanHostChecker(this);\n    p->available = false;\n    p->forceDisable = false;\n    p->networkManagerState = true;\n\n    p->networkManager = new AsemanNetworkManager(this);\n\n    p->resetTimer = new QTimer(this);\n    p->resetTimer->setInterval(2000);\n    p->resetTimer->setSingleShot(true);\n\n    connect(p->hostCheker, &AsemanHostChecker::hostChanged, this, &AsemanNetworkSleepManager::hostChanged);\n    connect(p->hostCheker, &AsemanHostChecker::portChanged,this, &AsemanNetworkSleepManager::portChanged);\n    connect(p->hostCheker, &AsemanHostChecker::intervalChanged, this, &AsemanNetworkSleepManager::intervalChanged);\n    connect(p->hostCheker, &AsemanHostChecker::availableChanged, this, &AsemanNetworkSleepManager::updateAvailablity);\n\n    connect(p->resetTimer, &QTimer::timeout, this, &AsemanNetworkSleepManager::finishResetTimer);\n\n    connect(p->networkManager, &AsemanNetworkManager::defaultNetworkChanged, this, &AsemanNetworkSleepManager::defaultNetworkChanged);\n\n    defaultNetworkChanged();\n    updateAvailablity();\n}\n\nvoid AsemanNetworkSleepManager::setHost(const QString &host)\n{\n    p->hostCheker->setHost(host);\n}\n\nQString AsemanNetworkSleepManager::host() const\n{\n    return p->hostCheker->host();\n}\n\nvoid AsemanNetworkSleepManager::setPort(qint32 port)\n{\n    p->hostCheker->setPort(port);\n}\n\nqint32 AsemanNetworkSleepManager::port() const\n{\n    return p->hostCheker->port();\n}\n\nvoid AsemanNetworkSleepManager::setInterval(qint32 ms)\n{\n    p->hostCheker->setInterval(ms);\n}\n\nqint32 AsemanNetworkSleepManager::interval() const\n{\n    return p->hostCheker->interval();\n}\n\nvoid AsemanNetworkSleepManager::setNetworkManager(bool stt)\n{\n    if(p->networkManagerState == stt)\n        return;\n\n    p->networkManagerState = stt;\n    updateAvailablity();\n    Q_EMIT networkManagerChanged();\n}\n\nbool AsemanNetworkSleepManager::networkManager() const\n{\n    return p->networkManagerState;\n}\n\nbool AsemanNetworkSleepManager::available() const\n{\n    return p->available && !p->forceDisable;\n}\n\nvoid AsemanNetworkSleepManager::defaultNetworkChanged()\n{\n    if(p->defaultNetwork)\n    {\n        disconnect(p->defaultNetwork, &AsemanNetworkManagerItem::bearerTypeChanged, this, &AsemanNetworkSleepManager::networkBearerTypeChanged);\n        disconnect(p->defaultNetwork, &AsemanNetworkManagerItem::bearerTypeFamilyChanged, this, &AsemanNetworkSleepManager::networkBearerTypeFamilyChanged);\n        disconnect(p->defaultNetwork, &AsemanNetworkManagerItem::identifierChanged, this, &AsemanNetworkSleepManager::networkIdentifierChanged);\n        disconnect(p->defaultNetwork, &AsemanNetworkManagerItem::isValidChanged, this, &AsemanNetworkSleepManager::networkIsValidChanged);\n        disconnect(p->defaultNetwork, &AsemanNetworkManagerItem::stateChanged, this, &AsemanNetworkSleepManager::networkStateChanged);\n        disconnect(p->defaultNetwork, &AsemanNetworkManagerItem::typeChanged, this, &AsemanNetworkSleepManager::networkTypeChanged);\n    }\n\n    p->defaultNetwork = p->networkManager->defaultNetwork();\n    if(p->defaultNetwork)\n    {\n        connect(p->defaultNetwork, &AsemanNetworkManagerItem::bearerTypeChanged, this, &AsemanNetworkSleepManager::networkBearerTypeChanged);\n        connect(p->defaultNetwork, &AsemanNetworkManagerItem::bearerTypeFamilyChanged, this, &AsemanNetworkSleepManager::networkBearerTypeFamilyChanged);\n        connect(p->defaultNetwork, &AsemanNetworkManagerItem::identifierChanged, this, &AsemanNetworkSleepManager::networkIdentifierChanged);\n        connect(p->defaultNetwork, &AsemanNetworkManagerItem::isValidChanged, this, &AsemanNetworkSleepManager::networkIsValidChanged);\n        connect(p->defaultNetwork, &AsemanNetworkManagerItem::stateChanged, this, &AsemanNetworkSleepManager::networkStateChanged);\n        connect(p->defaultNetwork, &AsemanNetworkManagerItem::typeChanged, this, &AsemanNetworkSleepManager::networkTypeChanged);\n    }\n}\n\nvoid AsemanNetworkSleepManager::networkRecheckAll()\n{\n    networkBearerTypeChanged();\n    networkBearerTypeFamilyChanged();\n    networkIdentifierChanged();\n    networkIsValidChanged();\n    networkStateChanged();\n    networkTypeChanged();\n}\n\nvoid AsemanNetworkSleepManager::networkBearerTypeChanged()\n{\n    updateAvailablity();\n}\n\nvoid AsemanNetworkSleepManager::networkBearerTypeFamilyChanged()\n{\n    updateAvailablity();\n}\n\nvoid AsemanNetworkSleepManager::networkIdentifierChanged()\n{\n    startResetTimer();\n}\n\nvoid AsemanNetworkSleepManager::networkIsValidChanged()\n{\n    updateAvailablity();\n}\n\nvoid AsemanNetworkSleepManager::networkStateChanged()\n{\n    updateAvailablity();\n}\n\nvoid AsemanNetworkSleepManager::networkTypeChanged()\n{\n    updateAvailablity();\n}\n\nvoid AsemanNetworkSleepManager::updateAvailablity()\n{\n    bool networkState = true;\n    if(p->defaultNetwork && p->defaultNetwork->isValid() && p->networkManagerState)\n    {\n        networkState = (\n                    p->defaultNetwork->bearerType() != AsemanNetworkManagerItem::BearerUnknown &&\n                    p->defaultNetwork->bearerTypeFamily() != AsemanNetworkManagerItem::BearerUnknown &&\n                    p->defaultNetwork->isValid() &&\n                    p->defaultNetwork->state() == AsemanNetworkManagerItem::Active &&\n                    p->defaultNetwork->type() == AsemanNetworkManagerItem::InternetAccessPoint\n                );\n    }\n\n    bool hostState = p->hostCheker->available();\n    setAvailable(hostState && networkState);\n}\n\nvoid AsemanNetworkSleepManager::setAvailable(bool stt)\n{\n    if(stt == p->available && !p->forceDisable)\n        return;\n\n    p->available = stt;\n    emitAvailableChanged();\n}\n\nvoid AsemanNetworkSleepManager::emitAvailableChanged()\n{\n    Q_EMIT availableChanged();\n    if(available())\n        Q_EMIT wake();\n    else\n        Q_EMIT sleep();\n}\n\nvoid AsemanNetworkSleepManager::startResetTimer()\n{\n    p->resetTimer->stop();\n    p->resetTimer->start();\n\n    bool previous = available();\n    p->forceDisable = true;\n    if(available() != previous)\n        emitAvailableChanged();\n}\n\nvoid AsemanNetworkSleepManager::finishResetTimer()\n{\n    bool previous = available();\n    p->forceDisable = false;\n    if(available() != previous)\n        emitAvailableChanged();\n}\n\nAsemanNetworkSleepManager::~AsemanNetworkSleepManager()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/network/asemannetworksleepmanager.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANNETWORKSLEEPMANAGER_H\n#define ASEMANNETWORKSLEEPMANAGER_H\n\n#include <QObject>\n\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n\n#include \"asemannetwork_global.h\"\n\nclass AsemanNetworkSleepManagerPrivate;\nclass LIBQTASEMAN_NETWORK_EXPORT AsemanNetworkSleepManager : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QString host     READ host     WRITE setHost     NOTIFY hostChanged)\n    Q_PROPERTY(qint32  port     READ port     WRITE setPort     NOTIFY portChanged)\n    Q_PROPERTY(qint32  interval READ interval WRITE setInterval NOTIFY intervalChanged)\n\n    Q_PROPERTY(bool networkManager READ networkManager WRITE setNetworkManager NOTIFY networkManagerChanged)\n    Q_PROPERTY(bool available READ available NOTIFY availableChanged)\n\npublic:\n    AsemanNetworkSleepManager(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanNetworkSleepManager();\n\n    void setHost(const QString &host);\n    QString host() const;\n\n    void setPort(qint32 port);\n    qint32 port() const;\n\n    void setInterval(qint32 ms);\n    qint32 interval() const;\n\n    void setNetworkManager(bool stt);\n    bool networkManager() const;\n\n    bool available() const;\n\nQ_SIGNALS:\n    void hostChanged();\n    void portChanged();\n    void intervalChanged();\n    void networkManagerChanged();\n    void wake();\n    void sleep();\n    void availableChanged();\n\nprivate Q_SLOTS:\n    void defaultNetworkChanged();\n\n    void networkRecheckAll();\n    void networkBearerTypeChanged();\n    void networkBearerTypeFamilyChanged();\n    void networkIdentifierChanged();\n    void networkIsValidChanged();\n    void networkStateChanged();\n    void networkTypeChanged();\n\n    void startResetTimer();\n    void finishResetTimer();\n    void updateAvailablity();\n\nprivate:\n    void setAvailable(bool stt);\n    void emitAvailableChanged();\n\nprivate:\n    AsemanNetworkSleepManagerPrivate *p;\n};\n\ntypedef AsemanNetworkSleepManager QAsemanNetworkSleepManager;\n#endif\n\n#endif // ASEMANNETWORKSLEEPMANAGER_H\n"
  },
  {
    "path": "src/network/asemansocketinterface.cpp",
    "content": "/*\n    Copyright (C) 2018 Aseman Team\n    http://aseman.co\n\n    This file copied from AsemanServer project.\n    AsemanServer is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanServer is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemansocketinterface.h\"\n\n#include <QBuffer>\n#include <QDataStream>\n#include <QEventLoop>\n#include <QMetaMethod>\n#include <QVariant>\n#include <QHash>\n#include <QDebug>\n#include <QTimer>\n#include <QPointer>\n#include <QAbstractSocket>\n\nclass AsemanSocketInterface::Private\n{\npublic:\n    enum InterfaceCallType {\n        MethodResult = 0xc821ec7,\n        MethodCall = 0xf40b2c9\n    };\n\n    QIODevice *device;\n    QPointer<QObject> destObj;\n    QByteArray socketBuffer;\n    qint64 idPointer;\n\n    QHash<qint64, std::function<void (QVariant)> > callbacks;\n};\n\nAsemanSocketInterface::AsemanSocketInterface(QIODevice *device, QObject *parent) :\n    AsemanSocketInterface(this, device, parent)\n{\n    p = new Private;\n    p->idPointer = 100000;\n    p->device = device;\n\n    connect(p->device, &QIODevice::readyRead, this, &AsemanSocketInterface::readyRead);\n}\n\nAsemanSocketInterface::AsemanSocketInterface(QObject *destObj, QIODevice *device, QObject *parent) :\n    QObject(parent)\n{\n    p = new Private;\n    p->idPointer = 100000;\n    p->device = device;\n    p->destObj = destObj;\n\n    connect(p->device, &QIODevice::readyRead, this, &AsemanSocketInterface::readyRead);\n\n}\n\nvoid AsemanSocketInterface::readyRead()\n{\n    p->socketBuffer += p->device->readAll();\n\n    while(!p->socketBuffer.isEmpty())\n    {\n        qint64 hardOperator = 0;\n        QByteArray hardData;\n\n        QBuffer buffer(&p->socketBuffer);\n        buffer.open(QBuffer::ReadOnly);\n\n        QDataStream hardStream(&buffer);\n        hardStream.setVersion(QDataStream::Qt_5_6);\n        hardStream >> hardOperator;\n        hardStream >> hardData;\n\n        if(hardStream.status() == QDataStream::ReadPastEnd)\n            break;\n\n        switch(hardOperator)\n        {\n        case AsemanSocketInterface::Private::MethodResult:\n            result(hardData);\n            break;\n\n        case AsemanSocketInterface::Private::MethodCall:\n        {\n            p->device->write( call(hardData) );\n            if (qobject_cast<QAbstractSocket*>(p->device))\n                qobject_cast<QAbstractSocket*>(p->device)->flush();\n        }\n            break;\n        }\n\n        p->socketBuffer = p->socketBuffer.mid(buffer.pos());\n    }\n}\n\nQByteArray AsemanSocketInterface::call(QByteArray data)\n{\n    qint64 uniqueId;\n    QString method;\n    QVariantList args;\n\n    QDataStream inStream(data);\n    inStream.setVersion(QDataStream::Qt_5_6);\n    inStream >> uniqueId;\n    inStream >> method;\n    inStream >> args;\n\n    while(args.length()<10)\n        args << QVariant();\n\n    QVariant var = call(p->destObj? p->destObj : this, method, Qt::DirectConnection, args.at(0), args.at(1), args.at(2), args.at(3), args.at(4), args.at(5), args.at(6), args.at(7), args.at(8), args.at(9));\n\n    QByteArray hardData;\n    QDataStream stream(&hardData, QIODevice::WriteOnly);\n    stream.setVersion(QDataStream::Qt_5_6);\n    stream << uniqueId;\n    stream << var;\n\n    QByteArray res;\n    QDataStream hardStream(&res, QIODevice::WriteOnly);\n    hardStream.setVersion(QDataStream::Qt_5_6);\n    hardStream << static_cast<qint64>(AsemanSocketInterface::Private::MethodResult);\n    hardStream << hardData;\n\n    return res;\n}\n\nvoid AsemanSocketInterface::result(QByteArray data)\n{\n    qint64 uniqueId;\n    QVariant res;\n\n    QDataStream inStream(data);\n    inStream.setVersion(QDataStream::Qt_5_6);\n    inStream >> uniqueId;\n    inStream >> res;\n\n    onResult(uniqueId, res);\n    Q_EMIT result(uniqueId, res);\n}\n\nvoid AsemanSocketInterface::onResult(qint64 id, const QVariant &result)\n{\n    if(p->callbacks.contains(id))\n        p->callbacks.take(id)(result);\n}\n\nqint64 AsemanSocketInterface::call(const QString &_method, const QVariantList &args)\n{\n    QString method = _method;\n    const auto idx = method.indexOf(\"::\");\n    if (idx >= 0)\n        method = method.mid(idx+2);\n\n    p->idPointer++;\n\n    QByteArray hardData;\n    QDataStream stream(&hardData, QIODevice::WriteOnly);\n    stream.setVersion(QDataStream::Qt_5_6);\n    stream << p->idPointer;\n    stream << method;\n    stream << args;\n\n    QByteArray res;\n    QDataStream hardStream(&res, QIODevice::WriteOnly);\n    hardStream.setVersion(QDataStream::Qt_5_6);\n    hardStream << static_cast<qint64>(AsemanSocketInterface::Private::MethodCall);\n    hardStream << hardData;\n\n    p->device->write(res);\n    if (qobject_cast<QAbstractSocket*>(p->device))\n        qobject_cast<QAbstractSocket*>(p->device)->flush();\n    return p->idPointer;\n}\n\nvoid AsemanSocketInterface::call(const QString &method, const QVariantList &args, std::function<void (QVariant)> callback)\n{\n    qint64 id = call(method, args);\n    p->callbacks[id] = callback;\n}\n\nQVariant AsemanSocketInterface::callSync(const QString &method, const QVariantList &args)\n{\n    QVariant result;\n    if(!p->device->isOpen())\n        return result;\n\n    QPointer<QEventLoop> loop = new QEventLoop(this);\n    call(method, args, [this, loop, &result](const QVariant &res){\n        if(loop)\n        {\n            result = res;\n            loop->exit();\n        }\n    });\n    QTimer::singleShot(2000, loop, [this, loop](){\n        if(!loop)\n            return;\n\n        loop->exit();\n    });\n\n    loop->exec();\n    loop->deleteLater();\n    return result;\n}\n\nvoid AsemanSocketInterface::callTimer(const QString &method, const QVariantList &args, std::function<void (QVariant)> callback)\n{\n    if(!p->device->isOpen())\n    {\n        callback( QVariant() );\n        return;\n    }\n\n    QPointer<QTimer> timer = new QTimer(this);\n    timer->setInterval(2000);\n    timer->setSingleShot(true);\n    timer->connect(timer.data(), &QTimer::timeout, this, [this, timer, callback](){\n        timer->deleteLater();\n        callback( QVariant() );\n    });\n    timer->start();\n\n    call(method, args, [this, timer, callback](const QVariant &res){\n        if(timer)\n        {\n            callback(res);\n            delete timer;\n        }\n    });\n}\n\nQVariant AsemanSocketInterface::call(QObject *obj, const QString &member, Qt::ConnectionType ctype, const QVariant &v0, const QVariant &v1, const QVariant &v2, const QVariant &v3, const QVariant &v4, const QVariant &v5, const QVariant &v6, const QVariant &v7, const QVariant &v8, const QVariant &v9, bool *isVoid)\n{\n    const QMetaObject *meta_obj = obj->metaObject();\n    QMetaMethod meta_method;\n    for( int i=0; i<meta_obj->methodCount(); i++ )\n    {\n        QMetaMethod mtd = meta_obj->method(i);\n        if( mtd.name() == member )\n            meta_method = mtd;\n    }\n    if( !meta_method.isValid() )\n        return QVariant();\n\n    QList<QByteArray> param_types = meta_method.parameterTypes();\n    QList<QByteArray> param_names = meta_method.parameterNames();\n\n    QString ret_type = meta_method.typeName();\n    QList< QPair<QString,QString> > m_args;\n    for( int i=0 ; i<param_types.count() ; i++ )\n        m_args << QPair<QString,QString>( param_types.at(i) , param_names.at(i) );\n\n    QVariantList vals;\n        vals << v0 << v1 << v2 << v3 << v4 << v5 << v6 << v7 << v8 << v9;\n\n    QVariantList tr_vals;\n\n    QList< QPair<QString,const void*> > args;\n    for( int i=0 ; i<vals.count() ; i++ )\n    {\n        if( i<m_args.count() )\n        {\n            QString type = m_args.at(i).first;\n\n            if( type != vals.at(i).typeName() )\n            {\n                if( vals[i].canConvert( QVariant::nameToType(type.toLatin1()) ) )\n                    vals[i].convert( QVariant::nameToType(type.toLatin1()) );\n            }\n\n            args << QPair<QString,const void*>( type.toLatin1() , vals.at(i).data() );\n            tr_vals << vals[i];\n        }\n        else\n        {\n            args << QPair<QString,const void*>( vals.at(i).typeName() , vals.at(i).data() );\n        }\n    }\n\n    int type = QMetaType::type(ret_type.toLatin1());\n    if(isVoid) *isVoid = (type == QMetaType::Void);\n    void *res = QMetaType::create(type);\n    bool is_pointer = ret_type.contains('*');\n\n    bool done;\n    switch( static_cast<int>(ctype) )\n    {\n    case Qt::QueuedConnection:\n        done = QMetaObject::invokeMethod( obj , member.toLatin1() , Qt::QueuedConnection ,\n                                  QGenericArgument( args.at(0).first.toLatin1() , args.at(0).second ) ,\n                                  QGenericArgument( args.at(1).first.toLatin1() , args.at(1).second ) ,\n                                  QGenericArgument( args.at(2).first.toLatin1() , args.at(2).second ) ,\n                                  QGenericArgument( args.at(3).first.toLatin1() , args.at(3).second ) ,\n                                  QGenericArgument( args.at(4).first.toLatin1() , args.at(4).second ) ,\n                                  QGenericArgument( args.at(5).first.toLatin1() , args.at(5).second ) ,\n                                  QGenericArgument( args.at(6).first.toLatin1() , args.at(6).second ) ,\n                                  QGenericArgument( args.at(7).first.toLatin1() , args.at(7).second ) ,\n                                  QGenericArgument( args.at(8).first.toLatin1() , args.at(8).second ) ,\n                                  QGenericArgument( args.at(9).first.toLatin1() , args.at(9).second ) );\n        return QVariant();\n        break;\n\n    default:\n        done = QMetaObject::invokeMethod( obj , member.toLatin1() , ctype, QGenericReturnArgument( ret_type.toLatin1() , (is_pointer)? &res : res ) ,\n                                  QGenericArgument( args.at(0).first.toLatin1() , args.at(0).second ) ,\n                                  QGenericArgument( args.at(1).first.toLatin1() , args.at(1).second ) ,\n                                  QGenericArgument( args.at(2).first.toLatin1() , args.at(2).second ) ,\n                                  QGenericArgument( args.at(3).first.toLatin1() , args.at(3).second ) ,\n                                  QGenericArgument( args.at(4).first.toLatin1() , args.at(4).second ) ,\n                                  QGenericArgument( args.at(5).first.toLatin1() , args.at(5).second ) ,\n                                  QGenericArgument( args.at(6).first.toLatin1() , args.at(6).second ) ,\n                                  QGenericArgument( args.at(7).first.toLatin1() , args.at(7).second ) ,\n                                  QGenericArgument( args.at(8).first.toLatin1() , args.at(8).second ) ,\n                                  QGenericArgument( args.at(9).first.toLatin1() , args.at(9).second ) );\n        break;\n    }\n\n    QVariant result;\n    if( !done )\n    {\n        QMetaType::destroy(type, res);\n        return result;\n    }\n\n    if( type == QMetaType::Void )\n        result = QVariant();\n    else\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n    if( is_pointer )\n        result = QVariant( type , &res );\n    else\n        result = QVariant( type , res );\n#else\n    if( is_pointer )\n        result = QVariant( QMetaType(type) , &res );\n    else\n        result = QVariant( QMetaType(type) , res );\n#endif\n\n    QMetaType::destroy(type, res);\n    if( type == QMetaType::type(\"QVariant\") )\n        return result.value<QVariant>();\n    else\n        return result;\n}\n\nAsemanSocketInterface::~AsemanSocketInterface()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/network/asemansocketinterface.h",
    "content": "/*\n    Copyright (C) 2018 Aseman Team\n    http://aseman.co\n\n    This file copied from AsemanServer project.\n    AsemanServer is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanServer is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANSOCKETINTERFACE_H\n#define ASEMANSOCKETINTERFACE_H\n\n#include <QObject>\n#include <QIODevice>\n#include <QVariant>\n\n#include <functional>\n\n#include \"asemannetwork_global.h\"\n\n/*!\n * \\brief The AsemanSocketInterface class\n * It's an IPC (Inter process communication) interface that connect\n * two process and transfare data between them using an IODevice like\n * QLocalSocket.\n * You can call Slots from other side of the connection using call method and\n * Get results using callback or result signal. It's easy to use :)\n * Just read about IPC systems.\n */\nclass LIBQTASEMAN_NETWORK_EXPORT AsemanSocketInterface : public QObject\n{\n    Q_OBJECT\n    class Private;\n\npublic:\n    AsemanSocketInterface(QIODevice *device, QObject *parent = Q_NULLPTR);\n    AsemanSocketInterface(QObject *destObj, QIODevice *device, QObject *parent = Q_NULLPTR);\n    virtual ~AsemanSocketInterface();\n\n    qint64 call(const QString &method, const QVariantList &args = QVariantList());\n    void call(const QString &method, const QVariantList &args, std::function<void (QVariant)> callback);\n    QVariant callSync(const QString &method, const QVariantList &args = QVariantList());\n    void callTimer(const QString &method, const QVariantList &args, std::function<void (QVariant)> callback);\n\nQ_SIGNALS:\n    void result(qint64 id, const QVariant &result);\n\npublic Q_SLOTS:\n\nprivate:\n    void readyRead();\n    QByteArray call(QByteArray data);\n    void result(QByteArray data);\n    void onResult(qint64 id, const QVariant &result);\n\n    static QVariant call( QObject *obj, const QString & member, Qt::ConnectionType type,\n                                                                const QVariant & v0 = QVariant(),\n                                                                const QVariant & v1 = QVariant(),\n                                                                const QVariant & v2 = QVariant(),\n                                                                const QVariant & v3 = QVariant(),\n                                                                const QVariant & v4 = QVariant(),\n                                                                const QVariant & v5 = QVariant(),\n                                                                const QVariant & v6 = QVariant(),\n                                                                const QVariant & v7 = QVariant(),\n                                                                const QVariant & v8 = QVariant(),\n                                                                const QVariant & v9 = QVariant(),\n                                                                bool *isVoid = Q_NULLPTR);\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanSocketInterface QAsemanSocketInterface;\n\n#endif // ASEMANSOCKETINTERFACE_H\n"
  },
  {
    "path": "src/network/network.pri",
    "content": "INCLUDEPATH += $$PWD\nDEPENDPATH += $$PWD\n\nQT += core network qml\n\ngreaterThan(QT_MAJOR_VERSION, 5): DEFINES += ASEMAN_QT6\n\nHEADERS += \\\n    $$PWD/asemandownloader.h \\\n    $$PWD/asemanfiledownloaderqueue.h \\\n    $$PWD/asemanfiledownloaderqueueitem.h \\\n    $$PWD/asemanhostchecker.h \\\n    $$PWD/asemannetworkproxy.h \\\n    $$PWD/asemannetwork_global.h \\\n    $$PWD/asemansocketinterface.h \\\n    $$PWD/asemannetworkrequestobject.h \\\n    $$PWD/asemannetworkrequestmanager.h \\\n    $$PWD/asemannetworkquickobject.h \\\n    $$PWD/asemannetworkrequestreply.h\n\nSOURCES += \\\n    $$PWD/asemandownloader.cpp \\\n    $$PWD/asemanfiledownloaderqueue.cpp \\\n    $$PWD/asemanfiledownloaderqueueitem.cpp \\\n    $$PWD/asemanhostchecker.cpp \\\n    $$PWD/asemannetworkproxy.cpp \\\n    $$PWD/asemansocketinterface.cpp \\\n    $$PWD/asemannetworkrequestobject.cpp \\\n    $$PWD/asemannetworkrequestmanager.cpp \\\n    $$PWD/asemannetworkquickobject.cpp \\\n    $$PWD/asemannetworkrequestreply.cpp\n\n!wasm: lessThan(QT_MAJOR_VERSION, 6) {\n    HEADERS += \\\n        $$PWD/asemannetworkmanager.h \\\n        $$PWD/asemannetworksleepmanager.h \\\n        $$PWD/asemannetworkmanageritem.h\n\n    SOURCES += \\\n        $$PWD/asemannetworkmanager.cpp \\\n        $$PWD/asemannetworksleepmanager.cpp \\\n        $$PWD/asemannetworkmanageritem.cpp\n}\n"
  },
  {
    "path": "src/network/network.pro",
    "content": "load(qt_build_config)\n\nTARGET = QAsemanNetwork\nQT = asemancore asemangui\n\nMODULE = asemannetwork\n\nload(qt_module)\n\n\nDEFINES += LIBQTASEMAN_NETWORK_LIBRARY\n\ninclude (network.pri)\n"
  },
  {
    "path": "src/qml/CMakeLists.txt",
    "content": "set(LOCAL_SOURCE\n    ${LOCAL_SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanapplicationitem.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanbackhandler.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandragarea.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandragobject.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanitemgrabber.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmouseeventlistener.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqmlengine.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqmlimage.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttools.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickobject.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickview.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickviewwrapper.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/qtsingleapplication/qtlocalpeer.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/qtsingleapplication/qtlockedfile.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemantools_global.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandevicesitem.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemantoolsitem.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanfileresourcemanager.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanproxycomponent.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanapplicationsingleton.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanapplicationitem.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanbackhandler.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandragarea.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandragobject.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanitemgrabber.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanmouseeventlistener.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqmlengine.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqmlimage.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanqttools.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickobject.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickview.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanquickviewwrapper.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/qtsingleapplication/qtlocalpeer.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/qtsingleapplication/qtlockedfile_unix.cpp\n    # ${CMAKE_CURRENT_SOURCE_DIR}/qtsingleapplication/qtlockedfile_win.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/qtsingleapplication/qtlockedfile.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandevicesitem.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemantoolsitem.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanfileresourcemanager.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanproxycomponent.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanapplicationsingleton.cpp\n    )\n\nif (IOS)\nelse ()\n    set(LOCAL_SOURCE\n        ${LOCAL_SOURCE}\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemanprocess.h\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemanprocess.cpp\n        )\nendif ()\n\nset(SOURCE\n    ${SOURCE}\n    ${LOCAL_SOURCE}\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/qml/asemanapplicationitem.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanapplicationitem.h\"\n#include \"asemandevices.h\"\n#include \"asemannetworkproxy.h\"\n#include \"asemantools.h\"\n#include \"qtsingleapplication/qtlocalpeer.h\"\n\n#include <asemanglobaltranslations.h>\n\n#ifdef Q_OS_ANDROID\n#include \"asemanjavalayer.h\"\n#endif\n\n#include <QDir>\n#include <QThread>\n#include <QCoreApplication>\n#include <QDebug>\n#include <QTimer>\n#include <QStandardPaths>\n#include <QPointer>\n#include <QQmlEngine>\n#include <QGuiApplication>\n\n#if defined(Q_OS_ANDROID) && (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n#include <QtAndroid>\n#endif\n#ifdef Q_OS_IOS\n#include \"private/quickios/quickios.h\"\n#endif\n\nstatic AsemanApplicationItem *aseman_app_singleton = 0;\nstatic QSet<AsemanApplicationItem*> aseman_app_objects;\n\nbool AsemanApplicationItem::aseman_app_inited = AsemanApplicationItem::aseman_app_init();\n\nclass AsemanApplicationItemPrivate\n{\npublic:\n    QPointer<QQmlEngine> engine;\n    QList<QObject*> items;\n\n    static QtLocalPeer *peer;\n    QPointer<AsemanNetworkProxy> proxy;\n\n    static qint32 statusBarStyle;\n    QTimer *statusbarStyleTimer_ios;\n};\n\nQtLocalPeer *AsemanApplicationItemPrivate::peer = 0;\nqint32 AsemanApplicationItemPrivate::statusBarStyle = AsemanApplicationItem::StatusBarStyleAuto;\n\n\nAsemanApplicationItem::AsemanApplicationItem(QQmlEngine *engine) :\n    AsemanApplicationItem()\n{\n    p->engine = engine;\n\n    auto trMgr = AsemanGlobalTranslations::instance();\n    connect(trMgr, &AsemanGlobalTranslations::refreshed, engine, &QQmlEngine::retranslate);\n}\n\nAsemanApplicationItem::AsemanApplicationItem() :\n    AsemanApplication()\n{\n    p = new AsemanApplicationItemPrivate;\n\n#ifdef Q_OS_IOS\n    p->statusbarStyleTimer_ios = new QTimer(this);\n    p->statusbarStyleTimer_ios->setSingleShot(true);\n    connect(p->statusbarStyleTimer_ios, &QTimer::timeout, this, [this](){\n        if (p->engine)\n            return;\n\n        setStatusBarStyle(p->statusBarStyle);\n        p->statusbarStyleTimer_ios->start(2000);\n    });\n\n    auto app = qobject_cast<QGuiApplication*>(QGuiApplication::instance());\n    if (app)\n    {\n        connect(app, &QGuiApplication::applicationStateChanged, this, [this](Qt::ApplicationState state){\n            if (p->engine)\n                return;\n\n            switch (static_cast<int>(state))\n            {\n            case Qt::ApplicationActive:\n                p->statusbarStyleTimer_ios->stop();\n                p->statusbarStyleTimer_ios->start(10);\n                break;\n            }\n        });\n    }\n#endif\n\n    if (AsemanApplicationItemPrivate::peer)\n        connect(AsemanApplicationItemPrivate::peer, &QtLocalPeer::messageReceived, this, &AsemanApplicationItem::messageReceived);\n}\n\nbool AsemanApplicationItem::aseman_app_init()\n{\n    if(aseman_app_inited)\n        return true;\n\n#ifndef FORCE_ASEMAN_DENSITY\n#ifdef Q_OS_ANDROID\n    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);\n\n    if(!QGuiApplication::testAttribute(Qt::AA_EnableHighDpiScaling) && qgetenv(\"QT_SCALE_FACTOR\").isNull() && qgetenv(\"ASEMAN_SCALE_FACTOR\").isNull())\n    {\n        qreal ratio = AsemanJavaLayer::instance()->density()*(AsemanDevices::isTablet()? 1.28 : 1);\n        qputenv(\"QT_SCALE_FACTOR\",QByteArray::number(ratio));\n    }\n#endif\n#endif\n    return true;\n}\n\nvoid AsemanApplicationItem::setApplicationId(const QString &applicationId)\n{\n    if(AsemanApplicationItemPrivate::peer && AsemanApplicationItemPrivate::peer->applicationId() == applicationId)\n        return;\n    if(AsemanApplicationItemPrivate::peer)\n        delete AsemanApplicationItemPrivate::peer;\n\n    AsemanApplicationItemPrivate::peer = 0;\n    if(!applicationId.isEmpty())\n    {\n        AsemanApplicationItemPrivate::peer = new QtLocalPeer(0, applicationId);\n        for(AsemanApplicationItem *app: aseman_app_objects)\n            connect(AsemanApplicationItemPrivate::peer, &QtLocalPeer::messageReceived, app, &AsemanApplicationItem::messageReceived);\n    }\n\n    for(AsemanApplicationItem *app: aseman_app_objects)\n    {\n        Q_EMIT app->applicationIdChanged();\n        Q_EMIT app->isRunningChanged();\n    }\n}\n\nQString AsemanApplicationItem::applicationId()\n{\n    if(AsemanApplicationItemPrivate::peer)\n        return AsemanApplicationItemPrivate::peer->applicationId();\n    else\n        return QString();\n}\n\nbool AsemanApplicationItem::isRunning()\n{\n    if(AsemanApplicationItemPrivate::peer)\n        return AsemanApplicationItemPrivate::peer->isClient();\n\n    return false;\n}\n\nint AsemanApplicationItem::statusBarStyle()\n{\n    return p->statusBarStyle;\n}\n\nvoid AsemanApplicationItem::setStatusBarStyle(int statusBarStyle)\n{\n#ifdef Q_OS_IOS\n    QuickIOS::StatusBarStyle style = QuickIOS::StatusBarStyleDefault;\n    switch (statusBarStyle)\n    {\n    case StatusBarStyleLight:\n        style = QuickIOS::StatusBarStyleLightContent;\n        break;\n    case StatusBarStyleDark:\n        style = QuickIOS::StatusBarStyleBlackTranslucent;\n        break;\n    case StatusBarStyleAuto:\n        style = QuickIOS::StatusBarStyleDefault;\n        break;\n    }\n\n    QuickIOS::setStatusBarStyle(style);\n#endif\n\n    if (p->statusBarStyle == statusBarStyle)\n        return;\n\n    p->statusBarStyle = statusBarStyle;\n#ifdef Q_OS_IOS\n    switch (statusBarStyle)\n    {\n    case StatusBarStyleLight:\n    case StatusBarStyleDark:\n        p->statusbarStyleTimer_ios->stop();\n        p->statusbarStyleTimer_ios->start(1);\n        break;\n    case StatusBarStyleAuto:\n        p->statusbarStyleTimer_ios->stop();\n        break;\n    }\n#endif\n\n    Q_EMIT statusBarStyleChanged();\n}\n\nvoid AsemanApplicationItem::sendMessage(const QString &msg)\n{\n    if(AsemanApplicationItemPrivate::peer)\n        AsemanApplicationItemPrivate::peer->sendMessage(msg, 5000);\n}\n\n#ifdef QT_QML_LIB\nbool AsemanApplicationItem::checkPermissions(const QString &persmission)\n{\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) && defined (Q_OS_ANDROID) && (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n    if (QtAndroid::checkPermission(persmission) == QtAndroid::PermissionResult::Granted)\n        return true;\n    else\n        return false;\n#else\n    Q_UNUSED(persmission)\n    return true;\n#endif\n}\n#endif\n\n#ifdef QT_QML_LIB\nQVariantMap AsemanApplicationItem::requestPermissions(QStringList persmissions, QJSValue callback)\n{\n    QVariantMap _res;\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) && defined (Q_OS_ANDROID) && (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n    auto c_callback = [callback](const QtAndroid::PermissionResultMap &res) -> QVariantMap {\n        QVariantMap map;\n\n        QHashIterator<QString, QtAndroid::PermissionResult> i(res);\n        while(i.hasNext())\n        {\n            i.next();\n            map[i.key()] = (i.value() == QtAndroid::PermissionResult::Granted);\n        }\n\n        return map;\n    };\n\n    for(QString pr: persmissions)\n        if(QtAndroid::checkPermission(pr) == QtAndroid::PermissionResult::Granted)\n        {\n            persmissions.removeAll(pr);\n            _res[pr] = true;\n        }\n\n    if(persmissions.count())\n    {\n        if(callback.isCallable())\n            QtAndroid::requestPermissions(persmissions, [callback, c_callback, _res, this](const QtAndroid::PermissionResultMap &res){\n                QVariantMap map = c_callback(res);\n                map.unite(_res);\n\n                QJSValue callbackCopy = callback;\n                if(p->engine)\n                    callbackCopy.call(QJSValueList() << p->engine->toScriptValue<QVariant>(map));\n            });\n        else\n            _res.unite(c_callback( QtAndroid::requestPermissionsSync(persmissions) ));\n    }\n    else\n    {\n        if(callback.isCallable())\n        {\n            if(p->engine)\n                callback.call(QJSValueList() << p->engine->toScriptValue<QVariant>(_res));\n        }\n    }\n#else\n    QVariantMap map;\n    for (const QString &perm: persmissions)\n        map[perm] = true;\n\n    QJSValue callbackCopy = callback;\n    if(p->engine)\n        callbackCopy.call(QJSValueList() << p->engine->toScriptValue<QVariant>(map));\n#endif\n    return _res;\n}\n#endif\n\nAsemanNetworkProxy *AsemanApplicationItem::proxy() const\n{\n    return p->proxy;\n}\n\nvoid AsemanApplicationItem::setProxy(AsemanNetworkProxy *proxy)\n{\n    if(p->proxy == proxy)\n        return;\n\n    if(p->proxy)\n        delete p->proxy;\n\n    p->proxy = proxy;\n    Q_EMIT proxyChanged();\n}\n\nQQmlListProperty<QObject> AsemanApplicationItem::items()\n{\n    return QQmlListProperty<QObject>(this, &p->items, QQmlListProperty<QObject>::AppendFunction(append),\n                                                      QQmlListProperty<QObject>::CountFunction(count),\n                                                      QQmlListProperty<QObject>::AtFunction(at),\n                                     QQmlListProperty<QObject>::ClearFunction(clear) );\n}\n\nQList<QObject *> AsemanApplicationItem::itemsList() const\n{\n    return p->items;\n}\n\nvoid AsemanApplicationItem::append(QQmlListProperty<QObject> *p, QObject *v)\n{\n    AsemanApplicationItem *aobj = static_cast<AsemanApplicationItem*>(p->object);\n    aobj->p->items.append(v);\n    Q_EMIT aobj->itemsChanged();\n}\n\nint AsemanApplicationItem::count(QQmlListProperty<QObject> *p)\n{\n    AsemanApplicationItem *aobj = static_cast<AsemanApplicationItem*>(p->object);\n    return aobj->p->items.count();\n}\n\nQObject *AsemanApplicationItem::at(QQmlListProperty<QObject> *p, int idx)\n{\n    AsemanApplicationItem *aobj = static_cast<AsemanApplicationItem*>(p->object);\n    return aobj->p->items.at(idx);\n}\n\nvoid AsemanApplicationItem::clear(QQmlListProperty<QObject> *p)\n{\n    AsemanApplicationItem *aobj = static_cast<AsemanApplicationItem*>(p->object);\n    aobj->p->items.clear();\n    Q_EMIT aobj->itemsChanged();\n}\n\nAsemanApplicationItem::~AsemanApplicationItem()\n{\n    aseman_app_objects.remove(this);\n    if(aseman_app_singleton == this)\n    {\n        if(AsemanApplicationItemPrivate::peer)\n        {\n            delete AsemanApplicationItemPrivate::peer;\n            AsemanApplicationItemPrivate::peer = 0;\n        }\n        aseman_app_singleton = 0;\n    }\n\n    delete p;\n}\n"
  },
  {
    "path": "src/qml/asemanapplicationitem.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANAPPLICATIONITEM_H\n#define ASEMANAPPLICATIONITEM_H\n\n#include \"aseman_macros.h\"\n#include \"asemanquickobject.h\"\n#include \"asemanapplication.h\"\n\n#include <QVariant>\n#include <QCoreApplication>\n#include <QUrl>\n#include <QJSValue>\n#include <QQmlEngine>\n#include <QQmlListProperty>\n\n#include \"asemantools_global.h\"\n#include \"asemannetworkproxy.h\"\n\nclass AsemanNetworkProxy;\nclass AsemanApplicationItemPrivate;\nclass LIBQTASEMAN_QML_EXPORT AsemanApplicationItem : public AsemanApplication\n{\n    Q_OBJECT\n    Q_PROPERTY(AsemanNetworkProxy* proxy READ proxy WRITE setProxy NOTIFY proxyChanged)\n    Q_PROPERTY(QString applicationId READ applicationId WRITE setApplicationId NOTIFY applicationIdChanged)\n    Q_PROPERTY(bool isRunning READ isRunning NOTIFY isRunningChanged)\n    Q_PROPERTY(int statusBarStyle READ statusBarStyle WRITE setStatusBarStyle NOTIFY statusBarStyleChanged)\n\n    Q_PROPERTY(QQmlListProperty<QObject> items READ items NOTIFY itemsChanged)\n    Q_CLASSINFO(\"DefaultProperty\", \"items\")\n\n    Q_ENUMS(StatusBarStyles)\n\npublic:\n    enum StatusBarStyles {\n        StatusBarStyleLight,\n        StatusBarStyleDark,\n        StatusBarStyleAuto\n    };\n\n    AsemanApplicationItem(QQmlEngine *engine);\n    AsemanApplicationItem();\n    virtual ~AsemanApplicationItem();\n\n    static void setApplicationId(const QString &applicationId);\n    static QString applicationId();\n\n    static bool isRunning();\n\n    AsemanNetworkProxy *proxy() const;\n    void setProxy(AsemanNetworkProxy *proxy);\n\n    QQmlListProperty<QObject> items();\n    QList<QObject*> itemsList() const;\n\n    int statusBarStyle();\n    void setStatusBarStyle(int statusBarStyle);\n\npublic Q_SLOTS:\n    static void sendMessage(const QString &msg);\n\n    bool checkPermissions(const QString &persmission);\n    QVariantMap requestPermissions(QStringList persmissions, QJSValue callback);\n\nQ_SIGNALS:\n    void proxyChanged();\n    void applicationIdChanged();\n    void isRunningChanged();\n    void messageReceived(const QString &msg);\n    void itemsChanged();\n    void statusBarStyleChanged();\n\nprivate:\n    static void append(QQmlListProperty<QObject> *p, QObject *v);\n    static int count(QQmlListProperty<QObject> *p);\n    static QObject *at(QQmlListProperty<QObject> *p, int idx);\n    static void clear(QQmlListProperty<QObject> *p);\n\nprivate:\n    static bool aseman_app_inited;\n    static bool aseman_app_init();\n\nprivate:\n    AsemanApplicationItemPrivate *p;\n};\n\ntypedef AsemanApplicationItem QAsemanApplicationItem;\n\n#endif // ASEMANAPPLICATIONITEM_H\n"
  },
  {
    "path": "src/qml/asemanapplicationsingleton.cpp",
    "content": "#include \"asemanapplicationsingleton.h\"\n\nclass AsemanApplicationSingletonPrivate\n{\npublic:\n};\n\nAsemanApplicationSingleton::AsemanApplicationSingleton(QQmlEngine *engine) :\n    AsemanApplicationItem(engine)\n{\n    p = new AsemanApplicationSingletonPrivate;\n}\n\nAsemanApplicationSingleton::~AsemanApplicationSingleton()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/qml/asemanapplicationsingleton.h",
    "content": "#ifndef ASEMANAPPLICATIONSINGLETON_H\n#define ASEMANAPPLICATIONSINGLETON_H\n\n#include \"asemanapplicationitem.h\"\n\nclass AsemanApplicationSingletonPrivate;\nclass LIBQTASEMAN_QML_EXPORT AsemanApplicationSingleton : public AsemanApplicationItem\n{\n    Q_OBJECT\npublic:\n    AsemanApplicationSingleton(QQmlEngine *engine);\n    virtual ~AsemanApplicationSingleton();\n\nprivate:\n    AsemanApplicationSingletonPrivate *p;\n};\n\ntypedef AsemanApplicationSingleton QAsemanApplicationSingleton;\n\n#endif // ASEMANAPPLICATIONSINGLETON_H\n"
  },
  {
    "path": "src/qml/asemanbackhandler.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanbackhandler.h\"\n#include \"asemantools.h\"\n\n#include <QPair>\n#include <QStack>\n#include <QDebug>\n\nclass AsemanHandlerItem\n{\npublic:\n    QObject *obj = Q_NULLPTR;\n    QJSValue jsv;\n};\n\nclass AsemanBackHandlerPrivate\n{\npublic:\n    QList<AsemanHandlerItem> stack;\n\n    AsemanHandlerItem lastActiveItem(qint32 *index = Q_NULLPTR) {\n        if (index)\n            *index = -1;\n\n        AsemanHandlerItem item;\n        for (qint32 i=stack.count()-1; i>=0; i--)\n        {\n            AsemanHandlerItem _itm = stack.at(i);\n            if (_itm.obj->property(\"disableBack\").toBool() == false)\n            {\n                item = _itm;\n                if (index)\n                    *index = i;\n                break;\n            }\n        }\n\n        return item;\n    }\n};\n\nAsemanBackHandler::AsemanBackHandler(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanBackHandlerPrivate;\n}\n\nQObject *AsemanBackHandler::topHandlerObject() const\n{\n    if( p->stack.isEmpty() )\n        return Q_NULLPTR;\n\n    return p->stack.last().obj;\n}\n\nQJSValue AsemanBackHandler::topHandlerMethod() const\n{\n    if( p->stack.isEmpty() )\n        return QString();\n\n    return p->stack.last().jsv;\n}\n\nint AsemanBackHandler::count()\n{\n    qint32 index = 0;\n    AsemanHandlerItem item = p->lastActiveItem(&index);\n    return index+1;\n}\n\nvoid AsemanBackHandler::pushHandler(QObject *obj, QJSValue jsv)\n{\n    AsemanHandlerItem item;\n    item.obj = obj;\n    item.jsv = jsv;\n\n    p->stack.append( item );\n    Q_EMIT countChanged();\n\n    setupObject(obj);\n}\n\nvoid AsemanBackHandler::pushDownHandler(QObject *obj, QJSValue jsv)\n{\n    AsemanHandlerItem item;\n    item.obj = obj;\n    item.jsv = jsv;\n\n    p->stack.prepend( item );\n    Q_EMIT countChanged();\n\n    setupObject(obj);\n}\n\nvoid AsemanBackHandler::removeHandler(QObject *obj)\n{\n    for( int i=p->stack.count()-1; i>=0; i-- )\n        if( p->stack.at(i).obj == obj )\n        {\n            p->stack.removeAt(i);\n            break;\n        }\n\n    Q_EMIT countChanged();\n}\n\nQObject *AsemanBackHandler::tryPopHandler()\n{\n    if( p->stack.isEmpty() )\n        return Q_NULLPTR;\n\n    qint32 index = 0;\n    AsemanHandlerItem item = p->lastActiveItem(&index);\n    if (!item.obj)\n        return Q_NULLPTR;\n\n    const int count = p->stack.count();\n\n    const QJSValue & res = item.jsv.call();\n    if( !res.isUndefined() && res.toBool() == false )\n        return Q_NULLPTR;\n\n    if( p->stack.count() == count )\n        p->stack.takeAt(index);\n\n    Q_EMIT countChanged();\n    return item.obj;\n}\n\nQObject *AsemanBackHandler::forcePopHandler()\n{\n    if( p->stack.isEmpty() )\n        return Q_NULLPTR;\n\n    qint32 index = 0;\n    AsemanHandlerItem item = p->lastActiveItem(&index);\n    if (!item.obj)\n        return Q_NULLPTR;\n\n    const int count = p->stack.count();\n\n    item.jsv.call();\n    if( p->stack.count() == count )\n        p->stack.takeAt(index);\n\n    Q_EMIT countChanged();\n    return item.obj;\n}\n\nvoid AsemanBackHandler::clear()\n{\n    p->stack.clear();\n}\n\nbool AsemanBackHandler::back()\n{\n    if(count() == 0)\n    {\n        Q_EMIT backFinished();\n        return false;\n    }\n\n    tryPopHandler();\n    return true;\n}\n\nvoid AsemanBackHandler::object_destroyed(QObject *obj)\n{\n    for( int i=0; i<p->stack.count(); i++ )\n        if( p->stack.at(i).obj == obj )\n        {\n            p->stack.removeAt(i);\n            i--;\n        }\n\n    Q_EMIT countChanged();\n}\n\nvoid AsemanBackHandler::setupObject(QObject *obj)\n{\n    if (!obj->property(\"disableBack\").isNull())\n        connect(obj, SIGNAL(disableBackChanged()), this, SIGNAL(countChanged()));\n\n    connect(obj, &QObject::destroyed, this, &AsemanBackHandler::object_destroyed );\n}\n\nAsemanBackHandler::~AsemanBackHandler()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/qml/asemanbackhandler.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANBACKHANDLER_H\n#define ASEMANBACKHANDLER_H\n\n#include <QObject>\n#include <QJSValue>\n\n#include \"asemantools_global.h\"\n\nclass AsemanBackHandlerPrivate;\nclass LIBQTASEMAN_QML_EXPORT AsemanBackHandler : public QObject\n{\n    Q_OBJECT\n\n    Q_PROPERTY(QObject* topHandlerObject READ topHandlerObject NOTIFY topHandlerChanged)\n    Q_PROPERTY(QJSValue topHandlerMethod READ topHandlerMethod NOTIFY topHandlerChanged)\n    Q_PROPERTY(int count READ count NOTIFY countChanged)\n\npublic:\n    AsemanBackHandler(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanBackHandler();\n\n    QObject *topHandlerObject() const;\n    QJSValue topHandlerMethod() const;\n\n    int count();\n\npublic Q_SLOTS:\n    void pushHandler( QObject *obj, QJSValue jsv );\n    void pushDownHandler( QObject *obj, QJSValue jsv );\n    void removeHandler( QObject *obj );\n\n    QObject *tryPopHandler();\n    QObject *forcePopHandler();\n    void clear();\n\n    bool back();\n\nQ_SIGNALS:\n    void topHandlerChanged();\n    void countChanged();\n    void backFinished();\n\nprivate Q_SLOTS:\n    void object_destroyed( QObject *obj );\n\nprivate:\n    void setupObject(QObject *obj);\n\nprivate:\n    AsemanBackHandlerPrivate *p;\n};\n\ntypedef AsemanBackHandler QAsemanBackHandler;\n\n#endif // ASEMANBACKHANDLER_H\n"
  },
  {
    "path": "src/qml/asemandevicesitem.cpp",
    "content": "#include \"asemandevicesitem.h\"\n#include \"asemandesktoptools.h\"\n#include \"asemanapplicationitem.h\"\n\n#include <QQmlEngine>\n#include <QMimeDatabase>\n#include <QTimer>\n\n#if defined(QT_WIDGETS_LIB)\n#include <QFileDialog>\n#include <QStandardPaths>\n#include <asemantools.h>\n#endif\n\n#ifdef Q_OS_IOS\n#include \"private/quickios/qiimagepicker.h\"\n#include \"private/quickios/quickios.h\"\n#endif\n\n#ifdef Q_OS_ANDROID\n#include \"asemanjavalayer.h\"\n#endif\n\nclass AsemanDevicesItemPrivate\n{\npublic:\n#ifdef Q_OS_ANDROID\n    AsemanJavaLayer *java_layer;\n#endif\n};\n\nAsemanDevicesItem::AsemanDevicesItem(QObject *parent) :\n    AsemanDevices(parent)\n{\n    p = new AsemanDevicesItemPrivate;\n#ifdef Q_OS_ANDROID\n    p->java_layer = AsemanJavaLayer::instance();\n    connect( p->java_layer, &AsemanJavaLayer::incomingImage, this, &AsemanDevicesItem::incoming_image, Qt::QueuedConnection );\n    connect( p->java_layer, &AsemanJavaLayer::selectImageResult, this, &AsemanDevicesItem::select_image_result, Qt::QueuedConnection );\n#endif\n#ifdef Q_OS_IOS\n    QuickIOS::registerTypes();\n#endif\n}\n\nbool AsemanDevicesItem::getOpenPictures()\n{\n    QString path;\n\n#if defined(Q_OS_ANDROID)\n    p->java_layer->getOpenPictures();\n    return true;\n#elif defined(Q_OS_IOS)\n    auto picker = new QIImagePicker(this);\n\n    connect(picker, &QIImagePicker::referenceUrlChanged, this, [picker](){\n        QString tempPath = AsemanApplication::tempPath() + '/' + QUuid::createUuid().toString(QUuid::WithoutBraces);\n        if (picker->referenceUrl().toLower().contains(QStringLiteral(\"png\")))\n            tempPath += QStringLiteral(\".png\");\n        else\n            tempPath += QStringLiteral(\".jpg\");\n\n        picker->save(tempPath);\n    });\n    connect(picker, &QIImagePicker::saved, this, [this, picker](QString url){\n        url = AsemanTools::urlToLocalPath(url);\n        Q_EMIT selectImageResult(url);\n        picker->close();\n        QTimer::singleShot(1000, picker, &QIImagePicker::deleteLater);\n    });\n\n    picker->show();\n    return true;\n#else\n#if defined(QT_WIDGETS_LIB)\n    path = QFileDialog::getOpenFileName(Q_NULLPTR, QStringLiteral(\"\"), QStandardPaths::standardLocations(QStandardPaths::PicturesLocation).last());\n#else\n    path = AsemanDesktopTools::getOpenFileName();\n#endif\n\n    if(path.isEmpty())\n        return false;\n\n    Q_EMIT selectImageResult(path);\n    return true;\n#endif\n}\n\nQVariantList AsemanDevicesItem::getContactList(QJSValue asyncCallback)\n{\n    return AsemanDevices::getContactList([this, asyncCallback](const QVariantList &res){\n        if (!asyncCallback.isCallable())\n            return;\n\n        QQmlEngine *engine = qmlEngine(this);\n\n        if(!engine)\n            return;\n\n        QJSValueList args = { engine->toScriptValue(res) };\n\n        QJSValue callback = asyncCallback;\n        callback.call(args);\n    });\n}\n\nvoid AsemanDevicesItem::incoming_image(const QString &path)\n{\n    Q_EMIT incomingImage(path);\n}\n\nvoid AsemanDevicesItem::select_image_result(const QString &path)\n{\n    Q_EMIT selectImageResult(path);\n}\n\nAsemanDevicesItem::~AsemanDevicesItem()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/qml/asemandevicesitem.h",
    "content": "#ifndef ASEMANDEVICESITEM_H\n#define ASEMANDEVICESITEM_H\n\n#include <asemandevices.h>\n#include <QJSValue>\n\n#include \"asemantools_global.h\"\n\nclass AsemanDevicesItemPrivate;\nclass LIBQTASEMAN_QML_EXPORT AsemanDevicesItem: public AsemanDevices\n{\n    Q_OBJECT\npublic:\n\n    AsemanDevicesItem(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanDevicesItem();\n\npublic Q_SLOTS:\n    bool getOpenPictures() Q_DECL_OVERRIDE;\n    QVariantList getContactList(QJSValue asyncCallback);\n\nQ_SIGNALS:\n    void incomingImage( const QString & path );\n    void selectImageResult( const QString & path );\n\nprivate Q_SLOTS:\n    void incoming_image( const QString & path );\n    void select_image_result( const QString & path );\n\nprivate:\n    AsemanDevicesItemPrivate *p;\n};\n\ntypedef AsemanDevicesItem QAsemanDevicesItem;\n\n#endif // ASEMANDEVICESITEM_H\n"
  },
  {
    "path": "src/qml/asemandragarea.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemandragarea.h\"\n\n#include <QMouseEvent>\n#include <QPoint>\n#include <QDebug>\n\nenum GrabState {\n    Grabbed,\n    NotGrabbed,\n    Unknown\n};\n\nclass AsemanDragAreaPrivate\n{\npublic:\n    GrabState state;\n    QPoint pin;\n    int minimum;\n    int orientation;\n    QPoint position;\n};\n\nAsemanDragArea::AsemanDragArea(QQuickItem *parent) :\n    QQuickItem(parent)\n{\n    p = new AsemanDragAreaPrivate;\n    p->state = Unknown;\n    p->minimum = 10;\n    p->orientation = Qt::Horizontal;\n    setFiltersChildMouseEvents(true);\n}\n\nvoid AsemanDragArea::setMinimum(int min)\n{\n    if(p->minimum == min)\n        return;\n\n    p->minimum = min;\n    Q_EMIT minimumChanged();\n}\n\nint AsemanDragArea::minimum() const\n{\n    return p->minimum;\n}\n\nvoid AsemanDragArea::setOrientation(int ori)\n{\n    if(p->orientation == ori)\n        return;\n\n    p->orientation = ori;\n    Q_EMIT orientationChanged();\n}\n\nint AsemanDragArea::orientation() const\n{\n    return p->orientation;\n}\n\nint AsemanDragArea::mouseX() const\n{\n    return p->position.x();\n}\n\nint AsemanDragArea::mouseY() const\n{\n    return p->position.y();\n}\n\nbool AsemanDragArea::childMouseEventFilter(QQuickItem *item, QEvent *e)\n{\n    QMouseEvent *mevent = static_cast<QMouseEvent*>(e);\n    if(e->type() == QEvent::MouseMove)\n    {\n        if(p->state == NotGrabbed)\n            return QQuickItem::childMouseEventFilter(item, e);\n        else\n        if(p->state == Grabbed)\n        {\n            p->position = mapFromItem(item, mevent->pos()).toPoint();\n            Q_EMIT mouseXChanged();\n            Q_EMIT mouseYChanged();\n            Q_EMIT positionChanged();\n            return true;\n        }\n    }\n    else\n    if(p->state != Unknown && e->type() != QEvent::MouseButtonRelease)\n        return QQuickItem::childMouseEventFilter(item, e);\n\n    switch(static_cast<int>(mevent->type()))\n    {\n    case QEvent::MouseButtonPress:\n        p->pin = mevent->pos();\n        break;\n\n    case QEvent::MouseButtonRelease:\n        if(p->state == Grabbed)\n            Q_EMIT released();\n\n        p->position = QPoint(0,0);\n        p->state = Unknown;\n        break;\n\n    case QEvent::MouseMove:\n    {\n        const int dx = qAbs(mevent->pos().x() - p->pin.x());\n        const int dy = qAbs(mevent->pos().y() - p->pin.y());\n        if(dx > p->minimum)\n        {\n            p->state = p->orientation==Qt::Horizontal? Grabbed : NotGrabbed;\n            if(p->state == Grabbed)\n            {\n                p->position = mapFromItem(item, mevent->pos()).toPoint();\n                Q_EMIT pressed();\n                Q_EMIT mouseXChanged();\n                Q_EMIT mouseYChanged();\n                Q_EMIT positionChanged();\n            }\n            return true;\n        }\n        else\n        if(dy > p->minimum)\n        {\n            p->state = p->orientation==Qt::Horizontal? NotGrabbed : Grabbed;\n            if(p->state == Grabbed)\n            {\n                p->position = mapFromItem(item, mevent->pos()).toPoint();\n                Q_EMIT pressed();\n                Q_EMIT mouseXChanged();\n                Q_EMIT mouseYChanged();\n                Q_EMIT positionChanged();\n            }\n            return true;\n        }\n    }\n        break;\n    }\n\n    return QQuickItem::childMouseEventFilter(item, e);\n}\n\nAsemanDragArea::~AsemanDragArea()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/qml/asemandragarea.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANDRAGAREA_H\n#define ASEMANDRAGAREA_H\n\n#include <QQuickItem>\n\n#include \"asemantools_global.h\"\n\nclass AsemanDragAreaPrivate;\nclass LIBQTASEMAN_QML_EXPORT AsemanDragArea : public QQuickItem\n{\n    Q_OBJECT\n    Q_PROPERTY(int orientation READ orientation WRITE setOrientation NOTIFY orientationChanged)\n    Q_PROPERTY(int minimum READ minimum WRITE setMinimum NOTIFY minimumChanged)\n    Q_PROPERTY(int mouseX READ mouseX NOTIFY mouseXChanged)\n    Q_PROPERTY(int mouseY READ mouseY NOTIFY mouseYChanged)\n\npublic:\n    AsemanDragArea(QQuickItem *parent = Q_NULLPTR);\n    virtual ~AsemanDragArea();\n\n    void setMinimum(int min);\n    int minimum() const;\n\n    void setOrientation(int ori);\n    int orientation() const;\n\n    int mouseX() const;\n    int mouseY() const;\n\nQ_SIGNALS:\n    void minimumChanged();\n    void orientationChanged();\n\n    void positionChanged();\n    void mouseXChanged();\n    void mouseYChanged();\n    void pressed();\n    void released();\n\nprotected:\n    bool childMouseEventFilter(QQuickItem *item, QEvent *event) Q_DECL_OVERRIDE;\n\nprivate:\n    AsemanDragAreaPrivate *p;\n};\n\ntypedef AsemanDragArea QAsemanDragArea;\n\n#endif // ASEMANDRAGAREA_H\n"
  },
  {
    "path": "src/qml/asemandragobject.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemandragobject.h\"\n#include \"asemanmimedata.h\"\n\n#include <QDrag>\n#include <QPointer>\n#include <QMimeData>\n#include <QDebug>\n#include <QPixmap>\n#include <QQmlContext>\n\nclass AsemanDragObjectPrivate\n{\npublic:\n    QPointer<AsemanMimeData> mime;\n    QPointer<QQuickItem> source;\n\n    QUrl image;\n    QImage imageData;\n\n    int dropAction;\n    QPoint hotSpot;\n\n    QPointer<QDrag> drag;\n\n    bool onDrag;\n};\n\nAsemanDragObject::AsemanDragObject(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanDragObjectPrivate;\n    p->dropAction = Qt::MoveAction;\n    p->onDrag = false;\n}\n\nvoid AsemanDragObject::setMimeData(AsemanMimeData *mime)\n{\n    if(p->mime == mime)\n        return;\n\n    p->mime = mime;\n    Q_EMIT mimeDataChanged();\n}\n\nAsemanMimeData *AsemanDragObject::mimeData() const\n{\n    return p->mime;\n}\n\nvoid AsemanDragObject::setDropAction(int act)\n{\n    if(p->dropAction == act)\n        return;\n\n    p->dropAction = act;\n    Q_EMIT dropActionChanged();\n}\n\nint AsemanDragObject::dropAction() const\n{\n    return p->dropAction;\n}\n\nvoid AsemanDragObject::setSource(QQuickItem *item)\n{\n    if(p->source == item)\n        return;\n\n    p->source = item;\n    Q_EMIT sourceChanged();\n}\n\nQQuickItem *AsemanDragObject::source() const\n{\n    return p->source;\n}\n\nvoid AsemanDragObject::setImage(const QUrl &_url)\n{\n    QUrl url = _url;\n#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))\n    const QQmlContext *context = qmlContext(this);\n    if (context)\n        url = context->resolvedUrl(url);\n#endif\n\n    if(p->image == url)\n        return;\n\n    p->image = url;\n    Q_EMIT imageChanged();\n}\n\nQUrl AsemanDragObject::image() const\n{\n    return p->image;\n}\n\nvoid AsemanDragObject::setImageData(const QImage &img)\n{\n    if(p->imageData == img)\n        return;\n\n    p->imageData = img;\n    Q_EMIT imageDataChanged();\n}\n\nQImage AsemanDragObject::imageData() const\n{\n    return p->imageData;\n}\n\nbool AsemanDragObject::dragging() const\n{\n    return p->onDrag;\n}\n\nvoid AsemanDragObject::setHotSpot(const QPoint &point)\n{\n    if(p->hotSpot == point)\n        return;\n\n    p->hotSpot = point;\n    Q_EMIT hotSpotChanged();\n}\n\nQPoint AsemanDragObject::hotSpot() const\n{\n    return p->hotSpot;\n}\n\nint AsemanDragObject::start()\n{\n    if(!p->source)\n    {\n        qDebug() << \"DragObject: source property is null!\";\n        return -1;\n    }\n    if(p->onDrag)\n        return -1;\n\n    p->onDrag = true;\n    Q_EMIT draggingChanged();\n\n    QMimeData *mime = new QMimeData();\n    if(p->mime)\n    {\n        mime->setText(p->mime->text());\n        mime->setHtml(p->mime->html());\n        mime->setUrls(p->mime->urls());\n\n        const QVariantMap &map = p->mime->dataMap();\n        QMapIterator<QString,QVariant> i(map);\n        while(i.hasNext())\n        {\n            i.next();\n            mime->setData(i.key(), i.value().toByteArray());\n        }\n    }\n\n    p->drag = new QDrag(p->source);\n    p->drag->setMimeData(mime);\n    if(!p->imageData.isNull())\n    {\n        p->drag->setPixmap(QPixmap::fromImage(p->imageData));\n    }\n    else\n    if(p->image.isValid())\n    {\n        QString path = p->image.toString();\n        if(path.left(4) == QStringLiteral(\"qrc:\"))\n            path = path.mid(3);\n\n        p->drag->setPixmap( QPixmap(path) );\n    }\n    if(!p->hotSpot.isNull())\n        p->drag->setHotSpot(p->hotSpot);\n\n    int res = p->drag->exec( static_cast<Qt::DropAction>(p->dropAction) );\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0))\n    p->drag->deleteLater();\n#endif\n\n    p->source->ungrabMouse();\n    p->source->ungrabTouchPoints();\n\n    p->onDrag = false;\n    Q_EMIT draggingChanged();\n\n    return res;\n}\n\nAsemanDragObject::~AsemanDragObject()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/qml/asemandragobject.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANDRAGOBJECT_H\n#define ASEMANDRAGOBJECT_H\n\n#include <QObject>\n#include <QQuickItem>\n#include <QImage>\n\n#include \"asemantools_global.h\"\n\n#include <asemanmimedata.h>\n\nclass AsemanDragObjectPrivate;\nclass LIBQTASEMAN_QML_EXPORT AsemanDragObject : public QObject\n{\n    Q_OBJECT\n\n    Q_PROPERTY(AsemanMimeData* mimeData READ mimeData WRITE setMimeData NOTIFY mimeDataChanged)\n    Q_PROPERTY(int dropAction READ dropAction WRITE setDropAction NOTIFY dropActionChanged)\n    Q_PROPERTY(QQuickItem* source READ source WRITE setSource NOTIFY sourceChanged)\n    Q_PROPERTY(QUrl image READ image WRITE setImage NOTIFY imageChanged)\n    Q_PROPERTY(QPoint hotSpot READ hotSpot WRITE setHotSpot NOTIFY hotSpotChanged)\n    Q_PROPERTY(QImage imageData READ imageData WRITE setImageData NOTIFY imageDataChanged)\n\n    Q_PROPERTY(bool dragging READ dragging NOTIFY draggingChanged)\n\npublic:\n    AsemanDragObject(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanDragObject();\n\n    void setMimeData(AsemanMimeData *mime);\n    AsemanMimeData *mimeData() const;\n\n    void setDropAction(int act);\n    int dropAction() const;\n\n    void setSource(QQuickItem *item);\n    QQuickItem *source() const;\n\n    void setImage(const QUrl & url);\n    QUrl image() const;\n\n    void setImageData(const QImage &img);\n    QImage imageData() const;\n\n    bool dragging() const;\n\n    void setHotSpot(const QPoint &point);\n    QPoint hotSpot() const;\n\npublic Q_SLOTS:\n    int start();\n\nQ_SIGNALS:\n    void mimeDataChanged();\n    void dropActionChanged();\n    void sourceChanged();\n    void imageChanged();\n    void hotSpotChanged();\n    void draggingChanged();\n    void imageDataChanged();\n\nprivate:\n    AsemanDragObjectPrivate *p;\n};\n\ntypedef AsemanDragObject QAsemanDragObject;\n\n#endif // ASEMANDRAGOBJECT_H\n"
  },
  {
    "path": "src/qml/asemanfileresourcemanager.cpp",
    "content": "#define GET_PATH(ROOT, ID) [](const QString &root, const QString &id) -> QString { \\\n        QString path = root + \"/\" + id; \\\n        return path; \\\n    }(ROOT, ID)\n\n#include \"asemanfileresourcemanager.h\"\n\n#include <QDir>\n#include <QThread>\n#include <QFile>\n#include <QCryptographicHash>\n#include <QCoreApplication>\n#include <QQmlEngine>\n#include <QDebug>\n#include <QUuid>\n\nclass AsemanFileResourceManager::Private\n{\npublic:\n    QString root;\n    QMap<QThread*, AsemanFileResourceManager::FileThread*> threads;\n    QQmlEngine *engine;\n};\n\nAsemanFileResourceManager::AsemanFileResourceManager(QQmlEngine *engine) :\n    QObject(engine)\n{\n    p = new Private;\n    p->engine = engine;\n}\n\nvoid AsemanFileResourceManager::setRoot(const QString &root)\n{\n    if(p->root == root)\n        return;\n\n    p->root = root;\n    QDir().mkpath(p->root);\n\n    Q_EMIT rootChanged();\n}\n\nQString AsemanFileResourceManager::root() const\n{\n    return p->root;\n}\n\nvoid AsemanFileResourceManager::insert(const QString &file, const QJSValue &callback)\n{\n    const QString root = p->root;\n\n    QThread *thread = new QThread();\n    thread->start();\n\n    FileThread *copy = new FileThread();\n    copy->moveToThread(thread);\n\n    connect(copy, &AsemanFileResourceManager::FileThread::copyProgress, this, [this, callback](const QString &id, qint64 bytes, qint64 total){\n\n        QQmlEngine *engine = p->engine;\n        if(!engine)\n            engine = qmlEngine(this);\n\n        if(!engine)\n            return;\n\n        QJSValueList args = { engine->toScriptValue<QString>(id),\n                              engine->toScriptValue<qint64>(bytes),\n                              engine->toScriptValue<qint64>(total) };\n\n        if(callback.isCallable())\n            QJSValue(callback).call(args);\n    }, Qt::QueuedConnection);\n    connect(copy, &AsemanFileResourceManager::FileThread::copyFinished, this, [this, copy, thread](){\n        copy->deleteLater();\n        thread->quit();\n        thread->wait();\n        delete thread;\n        p->threads.remove(thread);\n    }, Qt::QueuedConnection);\n\n    p->threads[thread] = copy;\n\n    QMetaObject::invokeMethod(copy, \"copy\", Qt::QueuedConnection, Q_ARG(QString, file), Q_ARG(QString, root));\n}\n\nbool AsemanFileResourceManager::remove(const QString &id)\n{\n    return QFile::remove( GET_PATH(p->root, id) );\n}\n\nQString AsemanFileResourceManager::get(const QString &id)\n{\n    return GET_PATH(p->root, id);\n}\n\nAsemanFileResourceManager::~AsemanFileResourceManager()\n{\n    QMapIterator<QThread*, AsemanFileResourceManager::FileThread*> i(p->threads);\n    while(i.hasNext())\n    {\n        i.next();\n        i.value()->deleteLater();\n        i.key()->quit();\n        i.key()->wait();\n        delete i.key();\n    }\n\n    delete p;\n}\n\n\n\nvoid AsemanFileResourceManager::FileThread::copy(const QString &src, const QString &root)\n{\n    QFileInfo info(src);\n    const QString tmpId = QUuid::createUuid().toString();\n    const QString &tmpDst = GET_PATH(root, tmpId);\n\n    QFile srcFile(src);\n    if(!srcFile.open(QFile::ReadOnly)) {\n        Q_EMIT copyFinished();\n        return;\n    }\n\n    QFile dstFile(tmpDst);\n    if(!dstFile.open(QFile::WriteOnly)) {\n        Q_EMIT copyFinished();\n        return;\n    }\n\n    QCryptographicHash hash(QCryptographicHash::Md5);\n\n    qint64 bytes = 0;\n    while(!srcFile.atEnd()) {\n        QByteArray data = srcFile.read(512*1024);\n\n        hash.addData(data);\n        dstFile.write(data);\n\n        bytes += data.size();\n        Q_EMIT copyProgress(QString(), bytes, srcFile.size());\n    }\n\n    dstFile.close();\n    srcFile.close();\n\n    const QString id = hash.result().toHex() + \".\" + info.suffix();\n    const QString &dst = GET_PATH(root, id);\n\n    QFile::remove(dst);\n    QFile::rename(tmpDst, dst);\n\n    Q_EMIT copyProgress(id, srcFile.size(), srcFile.size());\n    Q_EMIT copyFinished();\n}\n"
  },
  {
    "path": "src/qml/asemanfileresourcemanager.h",
    "content": "#ifndef ASEMANFILERESOURCEMANAGER_H\n#define ASEMANFILERESOURCEMANAGER_H\n\n#include <QObject>\n#include <QJSValue>\n#include <QThread>\n#include <QQmlEngine>\n\n#include \"asemantools_global.h\"\n\nclass LIBQTASEMAN_QML_EXPORT AsemanFileResourceManager : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QString root READ root WRITE setRoot NOTIFY rootChanged)\n\n    class Private;\n    class FileThread;\n\npublic:\n    AsemanFileResourceManager(QQmlEngine *parent = Q_NULLPTR);\n    virtual ~AsemanFileResourceManager();\n\n    void setRoot(const QString &root);\n    QString root() const;\n\npublic Q_SLOTS:\n    /*!\n     * Callback is a js function that is (path, copiedByteSize, totalSize) signature\n     * that send progress of the copy process to the js area.\n     */\n    void insert(const QString &file, const QJSValue &callback);\n    bool remove(const QString &id);\n    QString get(const QString &id);\n\nQ_SIGNALS:\n    void rootChanged();\n\nprivate:\n    Private *p;\n};\n\nclass AsemanFileResourceManager::FileThread: public QObject\n{\n    Q_OBJECT\npublic:\n    FileThread(): QObject() {}\n    virtual ~FileThread() {}\n\npublic Q_SLOTS:\n    void copy(const QString &src, const QString &root);\n\nQ_SIGNALS:\n    void copyFinished();\n    void copyProgress(const QString &id, qint64 bytes, qint64 total);\n};\n\ntypedef AsemanFileResourceManager QAsemanFileResourceManager;\n\n#endif // ASEMANFILERESOURCEMANAGER_H\n"
  },
  {
    "path": "src/qml/asemanitemgrabber.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanitemgrabber.h\"\n\n#include <QPointer>\n#include <QQuickItemGrabResult>\n#include <QImageWriter>\n#include <QDir>\n#include <QUuid>\n\nclass AsemanItemGrabberPrivate\n{\npublic:\n    QPointer<QQuickItem> item;\n    QSharedPointer<QQuickItemGrabResult> result;\n    QString dest;\n    QString suffix;\n    QString fileName;\n};\n\nAsemanItemGrabber::AsemanItemGrabber(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanItemGrabberPrivate;\n    p->suffix = QStringLiteral(\"png\");\n}\n\nvoid AsemanItemGrabber::setItem(QQuickItem *item)\n{\n    if(p->item == item)\n        return;\n\n    p->item = item;\n    Q_EMIT itemChanged();\n}\n\nQQuickItem *AsemanItemGrabber::item() const\n{\n    return p->item;\n}\n\nvoid AsemanItemGrabber::setSuffix(const QString &suffix)\n{\n    if(p->suffix == suffix)\n        return;\n\n    p->suffix = suffix;\n    Q_EMIT suffixChanged();\n}\n\nQString AsemanItemGrabber::suffix() const\n{\n    return p->suffix;\n}\n\nvoid AsemanItemGrabber::setFileName(const QString &fileName)\n{\n    if(p->fileName == fileName)\n        return;\n\n    p->fileName = fileName;\n    Q_EMIT fileNameChanged();\n}\n\nQString AsemanItemGrabber::fileName() const\n{\n    return p->fileName;\n}\n\nvoid AsemanItemGrabber::save(const QString &dest, const QSize &size)\n{\n    if(!p->item)\n    {\n        Q_EMIT failed();\n        return;\n    }\n\n    p->result = p->item->grabToImage(size);\n    if(!p->result)\n    {\n        Q_EMIT failed();\n        return;\n    }\n\n    connect(p->result.data(), &QQuickItemGrabResult::ready, this, &AsemanItemGrabber::ready);\n\n    QDir().mkpath(dest);\n\n    QString fileName = p->fileName;\n    if(fileName.isEmpty())\n        fileName = QUuid::createUuid().toString().remove(QStringLiteral(\"{\")).remove(QStringLiteral(\"}\"));\n    if(!p->suffix.isEmpty())\n        fileName += QStringLiteral(\".\") + p->suffix;\n\n    p->dest = dest + QStringLiteral(\"/\") + fileName;\n}\n\nvoid AsemanItemGrabber::ready()\n{\n    disconnect(p->result.data(), &QQuickItemGrabResult::ready, this, &AsemanItemGrabber::ready);\n\n    const QImage & img = p->result->image();\n\n    QImageWriter writer(p->dest);\n    writer.write(img);\n\n    Q_EMIT saved(p->dest);\n}\n\nAsemanItemGrabber::~AsemanItemGrabber()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/qml/asemanitemgrabber.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANITEMGRABBER_H\n#define ASEMANITEMGRABBER_H\n\n#include <QObject>\n#include <QQuickItem>\n\n#include \"asemantools_global.h\"\n\nclass AsemanItemGrabberPrivate;\nclass LIBQTASEMAN_QML_EXPORT AsemanItemGrabber : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QQuickItem* item READ item WRITE setItem NOTIFY itemChanged)\n    Q_PROPERTY(QString suffix READ suffix WRITE setSuffix NOTIFY suffixChanged)\n    Q_PROPERTY(QString fileName READ fileName WRITE setFileName NOTIFY fileNameChanged)\n\npublic:\n    AsemanItemGrabber(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanItemGrabber();\n\n    void setItem(QQuickItem *item);\n    QQuickItem *item() const;\n\n    void setSuffix(const QString &suffix);\n    QString suffix() const;\n\n    void setFileName(const QString &fileName);\n    QString fileName() const;\n\npublic Q_SLOTS:\n    void save(const QString &dest, const QSize &size);\n\nQ_SIGNALS:\n    void itemChanged();\n    void suffixChanged();\n    void fileNameChanged();\n    void saved(const QString &dest);\n    void failed();\n\nprivate Q_SLOTS:\n    void ready();\n\nprivate:\n    AsemanItemGrabberPrivate *p;\n};\n\ntypedef AsemanItemGrabber QAsemanItemGrabber;\n\n#endif // ASEMANITEMGRABBER_H\n"
  },
  {
    "path": "src/qml/asemanmouseeventlistener.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanmouseeventlistener.h\"\n\n#include <QDebug>\n\nclass AsemanMouseEventListenerPrivate\n{\npublic:\n    QPointF point;\n    bool ignoreEvent;\n};\n\nAsemanMouseEventListener::AsemanMouseEventListener(QQuickItem *parent) :\n    QQuickItem(parent)\n{\n    p = new AsemanMouseEventListenerPrivate;\n    p->ignoreEvent = false;\n    setFiltersChildMouseEvents(true);\n}\n\nbool AsemanMouseEventListener::childMouseEventFilter(QQuickItem *item, QEvent *e)\n{\n    QMouseEvent *mevent = static_cast<QMouseEvent*>(e);\n    switch(static_cast<int>(e->type()))\n    {\n    case QEvent::MouseMove:\n    {\n        QPointF newP = mapFromItem(item, mevent->pos());\n        bool xChanged = (newP.x() != p->point.x());\n        bool yChanged = (newP.y() != p->point.y());\n        p->point = newP;\n        if(xChanged) Q_EMIT mouseXChanged();\n        if(yChanged) Q_EMIT mouseYChanged();\n        Q_EMIT mousePositionChanged();\n        break;\n    }\n    case QEvent::MouseButtonPress:\n        p->point = mapFromItem(item, mevent->pos());\n        Q_EMIT mousePressed();\n        break;\n    case QEvent::MouseButtonRelease:\n        p->point = mapFromItem(item, mevent->pos());\n        Q_EMIT mouseReleased();\n        break;\n\n    default:\n        p->ignoreEvent = false;\n        break;\n    }\n\n    if(p->ignoreEvent)\n    {\n        p->ignoreEvent = false;\n        return true;\n    }\n    else\n        return QQuickItem::childMouseEventFilter(item, e);\n}\n\nqreal AsemanMouseEventListener::mouseX() const\n{\n    return p->point.x();\n}\n\nqreal AsemanMouseEventListener::mouseY() const\n{\n    return p->point.y();\n}\n\nQPointF AsemanMouseEventListener::mousePosition() const\n{\n    return p->point;\n}\n\nvoid AsemanMouseEventListener::ignoreEvent()\n{\n    p->ignoreEvent = true;\n}\n\nvoid AsemanMouseEventListener::acceptEvent()\n{\n    p->ignoreEvent = false;\n}\n\nAsemanMouseEventListener::~AsemanMouseEventListener()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/qml/asemanmouseeventlistener.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANMOUSEEVENTLISTENER_H\n#define ASEMANMOUSEEVENTLISTENER_H\n\n#include <QQuickItem>\n\n#include \"asemantools_global.h\"\n\nclass AsemanMouseEventListenerPrivate;\nclass LIBQTASEMAN_QML_EXPORT AsemanMouseEventListener : public QQuickItem\n{\n    Q_OBJECT\n    Q_PROPERTY(qreal mouseX READ mouseX NOTIFY mouseXChanged)\n    Q_PROPERTY(qreal mouseY READ mouseY NOTIFY mouseYChanged)\n    Q_PROPERTY(QPointF mousePosition READ mousePosition NOTIFY mousePositionChanged)\n\npublic:\n    AsemanMouseEventListener(QQuickItem *parent = Q_NULLPTR);\n    virtual ~AsemanMouseEventListener();\n\n    qreal mouseX() const;\n    qreal mouseY() const;\n    QPointF mousePosition() const;\n\npublic Q_SLOTS:\n    void ignoreEvent();\n    void acceptEvent();\n\nQ_SIGNALS:\n    void mouseXChanged();\n    void mouseYChanged();\n    void mousePositionChanged();\n    void mousePressed();\n    void mouseReleased();\n\nprotected:\n    bool childMouseEventFilter(QQuickItem *item, QEvent *event) Q_DECL_OVERRIDE;\n\nprivate:\n    AsemanMouseEventListenerPrivate *p;\n};\n\ntypedef AsemanMouseEventListener QAsemanMouseEventListener;\n\n#endif // ASEMANMOUSEEVENTLISTENER_H\n"
  },
  {
    "path": "src/qml/asemanprocess.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanprocess.h\"\n\n#include <QPointer>\n#include <QProcess>\n\nclass AsemanProcess::Private\n{\npublic:\n    QString command;\n    QStringList arguments;\n    QPointer<QProcess> process;\n};\n\nAsemanProcess::AsemanProcess(QObject *parent) :\n    QObject(parent)\n{\n    p = new Private;\n}\n\nvoid AsemanProcess::setCommand(const QString &command)\n{\n    if(p->command == command)\n        return;\n\n    p->command = command;\n    Q_EMIT commandChanged();\n}\n\nQString AsemanProcess::command() const\n{\n    return p->command;\n}\n\nvoid AsemanProcess::setArguments(const QStringList &arguments)\n{\n    if(p->arguments == arguments)\n        return;\n\n    p->arguments = arguments;\n    Q_EMIT argumentsChanged();\n}\n\nvoid AsemanProcess::start()\n{\n    if(p->process)\n        p->process->terminate();\n\n    QProcess *process = new QProcess(this);\n    process->setProcessChannelMode(QProcess::ForwardedChannels);\n\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n    connect(process, static_cast<void(QProcess::*)(int)>(&QProcess::finished), this, [process](int){\n#else\n    connect(process, &QProcess::finished, this, [process](int){\n#endif\n        process->deleteLater();\n    });\n    connect(process, &QProcess::destroyed, this, [this, process](){\n        if(!p->process || p->process == process)\n            Q_EMIT runningChanged();\n    });\n    connect(process, &QProcess::readyReadStandardOutput, this, [this, process](){\n        Q_EMIT standardOutput(QString::fromUtf8(process->readAllStandardOutput()));\n    });\n    connect(process, &QProcess::readAllStandardError, this, [this, process](){\n        Q_EMIT standardOutput(QString::fromUtf8(process->readAllStandardError()));\n    });\n\n    p->process = process;\n    p->process->start(p->command, p->arguments);\n\n    Q_EMIT runningChanged();\n}\n\nvoid AsemanProcess::terminate()\n{\n    if(!p->process)\n        return;\n\n    p->process->terminate();\n    Q_EMIT runningChanged();\n}\n\nQStringList AsemanProcess::arguments() const\n{\n    return p->arguments;\n}\n\nbool AsemanProcess::running() const\n{\n    return p->process;\n}\n\nAsemanProcess::~AsemanProcess()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/qml/asemanprocess.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANPROCESS_H\n#define ASEMANPROCESS_H\n\n#include <QObject>\n#include <QStringList>\n\n#include \"asemantools_global.h\"\n\nclass LIBQTASEMAN_QML_EXPORT AsemanProcess : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QStringList arguments READ arguments WRITE setArguments NOTIFY argumentsChanged)\n    Q_PROPERTY(QString command READ command WRITE setCommand NOTIFY commandChanged)\n    Q_PROPERTY(bool running READ running NOTIFY runningChanged)\n\n    class Private;\n\npublic:\n    AsemanProcess(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanProcess();\n\n    void setCommand(const QString &command);\n    QString command() const;\n\n    void setArguments(const QStringList &arguments);\n    QStringList arguments() const;\n\n    bool running() const;\n\nQ_SIGNALS:\n    void commandChanged();\n    void argumentsChanged();\n    void runningChanged();\n    void standardOutput(const QString &output);\n    void errorOutput(const QString &output);\n\npublic Q_SLOTS:\n    void start();\n    void terminate();\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanProcess QAsemanProcess;\n\n#endif // ASEMANPROCESS_H\n"
  },
  {
    "path": "src/qml/asemanproxycomponent.cpp",
    "content": "#include \"asemanproxycomponent.h\"\n\n#include <QPointer>\n#include <QQuickItem>\n#include <QDebug>\n\nclass AsemanProxyComponent::Private\n{\npublic:\n    QPointer<QQmlComponent> source;\n    QPointer<QObject> object;\n};\n\nAsemanProxyComponent::AsemanProxyComponent(QObject *parent) :\n    QObject(parent)\n{\n    p = new Private;\n}\n\nQQmlComponent *AsemanProxyComponent::source() const\n{\n    return p->source;\n}\n\nvoid AsemanProxyComponent::setSource(QQmlComponent *source)\n{\n    if(p->source == source)\n        return;\n\n    p->source = source;\n    create();\n    Q_EMIT sourceChanged();\n}\n\nQObject *AsemanProxyComponent::object() const\n{\n    return p->object;\n}\n\nvoid AsemanProxyComponent::setObject(QObject *object)\n{\n    if(p->object == object)\n        return;\n    if(p->object)\n        p->object->deleteLater();\n\n    p->object = object;\n    Q_EMIT objectChanged();\n}\n\nvoid AsemanProxyComponent::create()\n{\n    if(!p->source)\n    {\n        setObject(Q_NULLPTR);\n        return;\n    }\n\n    QObject *parent = AsemanProxyComponent::parent();\n\n    QQmlContext *context = qmlContext(this);\n    QObject *object = p->source->create(context);\n    if(object)\n    {\n        object->setParent(parent);\n\n        QQuickItem *parentItem = qobject_cast<QQuickItem*>(parent);\n        QQuickItem *objectItem = qobject_cast<QQuickItem*>(object);\n        if(parentItem && objectItem)\n            objectItem->setParentItem(parentItem);\n    }\n\n    setObject(object);\n}\n\nAsemanProxyComponent::~AsemanProxyComponent()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/qml/asemanproxycomponent.h",
    "content": "#ifndef ASEMANPROXYCOMPONENT_H\n#define ASEMANPROXYCOMPONENT_H\n\n#include <QObject>\n#include <QQmlComponent>\n\n#include \"asemantools_global.h\"\n\nclass LIBQTASEMAN_QML_EXPORT AsemanProxyComponent : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QQmlComponent* source READ source WRITE setSource NOTIFY sourceChanged)\n    Q_PROPERTY(QObject* object READ object NOTIFY objectChanged)\n\n    class Private;\n\npublic:\n    AsemanProxyComponent(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanProxyComponent();\n\n    QQmlComponent *source() const;\n    void setSource(QQmlComponent *component);\n\n    QObject *object() const;\n\nQ_SIGNALS:\n    void sourceChanged();\n    void objectChanged();\n\nprivate:\n    void create();\n    void setObject(QObject *object);\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanProxyComponent QAsemanProxyComponent;\n\n#endif // ASEMANPROXYCOMPONENT_H\n"
  },
  {
    "path": "src/qml/asemanqmlengine.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanqmlengine.h\"\n#include \"asemanqttools.h\"\n\n#include <QDebug>\n\nclass AsemanQmlEnginePrivate\n{\npublic:\n};\n\nAsemanQmlEngine::AsemanQmlEngine(QObject *parent) :\n    QQmlApplicationEngine(parent)\n{\n    p = new AsemanQmlEnginePrivate;\n}\n\nAsemanQmlEngine::~AsemanQmlEngine()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/qml/asemanqmlengine.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQMLENGINE_H\n#define ASEMANQMLENGINE_H\n\n#include <QQmlApplicationEngine>\n\n#include \"asemantools_global.h\"\n\nclass AsemanQmlEnginePrivate;\nclass LIBQTASEMAN_QML_EXPORT AsemanQmlEngine : public QQmlApplicationEngine\n{\n    Q_OBJECT\npublic:\n    AsemanQmlEngine(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanQmlEngine();\n\nQ_SIGNALS:\n\npublic Q_SLOTS:\n\nprivate:\n    AsemanQmlEnginePrivate *p;\n};\n\ntypedef AsemanQmlEngine QAsemanQmlEngine;\n\n#endif // ASEMANQMLENGINE_H\n"
  },
  {
    "path": "src/qml/asemanqmlimage.cpp",
    "content": "#include \"asemanqmlimage.h\"\n#include \"asemantools.h\"\n\n#include <QPainter>\n#include <QMutex>\n#include <QImageReader>\n#include <QImage>\n#include <QFileInfo>\n#include <QCryptographicHash>\n#include <QQmlContext>\n\nclass AsemanQmlImage::Private\n{\npublic:\n    QUrl source;\n    int fillMode;\n    bool asynchronous;\n    bool autoTransform;\n    bool cache;\n    int horizontalAlignment;\n    int verticalAlignment;\n    bool mirror;\n    bool smooth;\n    qreal progress;\n    QMutex mutex;\n\n    QString cacheHash;\n    QImage cacheImage;\n};\n\nAsemanQmlImage::AsemanQmlImage(QQuickItem *parent) :\n    QQuickPaintedItem(parent)\n{\n    p = new Private;\n    p->fillMode = PreserveAspectFit;\n    p->asynchronous = false;\n    p->autoTransform = false;\n    p->cache = true;\n    p->horizontalAlignment = 0;\n    p->verticalAlignment = 0;\n    p->mirror = false;\n    p->progress = 0;\n    p->smooth = false;\n//    setRenderTarget(FramebufferObject);\n}\n\nvoid AsemanQmlImage::paint(QPainter *painter)\n{\n    p->mutex.lock();\n    QUrl source = p->source;\n    QSizeF paintSize = paintedSize();\n    p->mutex.unlock();\n\n    QString cacheHash = hash();\n    if(cacheHash != p->cacheHash)\n    {\n        QString path = AsemanTools::urlToLocalPath(source);\n        if(!QFileInfo::exists(path))\n            return;\n\n        QImageReader reader(path);\n        reader.setScaledSize(paintSize.toSize());\n\n        p->cacheImage = reader.read();\n        p->cacheHash = cacheHash;\n    }\n\n    qreal x = width()/2 - p->cacheImage.width()/2;\n    qreal y = height()/2 - p->cacheImage.height()/2;\n\n\n    painter->drawImage(x, y, p->cacheImage);\n}\n\nvoid AsemanQmlImage::setSource(const QUrl &_src)\n{\n    QUrl source = _src;\n#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))\n    const QQmlContext *context = qmlContext(this);\n    if (context)\n        source = context->resolvedUrl(source);\n#endif\n\n    if(p->source == source)\n        return;\n\n    p->mutex.lock();\n    p->source = source;\n    p->mutex.unlock();\n\n    refresh();\n    Q_EMIT sourceChanged();\n}\n\nQUrl AsemanQmlImage::source() const\n{\n    return p->source;\n}\n\nvoid AsemanQmlImage::setFillMode(int fillMode)\n{\n    if(p->fillMode == fillMode)\n        return;\n\n    p->mutex.lock();\n    p->fillMode = fillMode;\n    p->mutex.unlock();\n\n    refresh();\n    Q_EMIT fillModeChanged();\n}\n\nint AsemanQmlImage::fillMode() const\n{\n    return p->fillMode;\n}\n\nvoid AsemanQmlImage::setAsynchronous(bool asynchronous)\n{\n    if(p->asynchronous == asynchronous)\n        return;\n\n    p->mutex.lock();\n    p->asynchronous = asynchronous;\n    p->mutex.unlock();\n\n    refresh();\n    Q_EMIT asynchronousChanged();\n}\n\nbool AsemanQmlImage::asynchronous() const\n{\n    return p->asynchronous;\n}\n\nvoid AsemanQmlImage::setAutoTransform(bool autoTransform)\n{\n    if(p->autoTransform == autoTransform)\n        return;\n\n    p->mutex.lock();\n    p->autoTransform = autoTransform;\n    p->mutex.unlock();\n\n    refresh();\n    Q_EMIT autoTransformChanged();\n}\n\nbool AsemanQmlImage::autoTransform() const\n{\n    return p->autoTransform;\n}\n\nvoid AsemanQmlImage::setCache(bool cache)\n{\n    if(p->cache == cache)\n        return;\n\n    p->mutex.lock();\n    p->cache = cache;\n    p->mutex.unlock();\n\n    refresh();\n    Q_EMIT cacheChanged();\n}\n\nbool AsemanQmlImage::cache() const\n{\n    return p->cache;\n}\n\nvoid AsemanQmlImage::setHorizontalAlignment(int horizontalAlignment)\n{\n    if(p->horizontalAlignment == horizontalAlignment)\n        return;\n\n    p->mutex.lock();\n    p->horizontalAlignment = horizontalAlignment;\n    p->mutex.unlock();\n\n    refresh();\n    Q_EMIT horizontalAlignmentChanged();\n}\n\nint AsemanQmlImage::horizontalAlignment() const\n{\n    return p->horizontalAlignment;\n}\n\nvoid AsemanQmlImage::setVerticalAlignment(int verticalAlignment)\n{\n    if(p->verticalAlignment == verticalAlignment)\n        return;\n\n    p->mutex.lock();\n    p->verticalAlignment = verticalAlignment;\n    p->mutex.unlock();\n\n    refresh();\n    Q_EMIT verticalAlignmentChanged();\n}\n\nint AsemanQmlImage::verticalAlignment() const\n{\n    return p->verticalAlignment;\n}\n\nvoid AsemanQmlImage::setMipmap(bool mipmap)\n{\n    if(QQuickPaintedItem::mipmap() == mipmap)\n        return;\n\n\n    p->mutex.lock();\n    QQuickPaintedItem::setMipmap(mipmap);\n    p->mutex.unlock();\n\n    refresh();\n    Q_EMIT mipmapChanged();\n}\n\nbool AsemanQmlImage::mipmap() const\n{\n    return QQuickPaintedItem::mipmap();\n}\n\nvoid AsemanQmlImage::setMirror(bool mirror)\n{\n    if(p->mirror == mirror)\n        return;\n\n    p->mutex.lock();\n    p->mirror = mirror;\n    p->mutex.unlock();\n\n    refresh();\n    Q_EMIT mirrorChanged();\n}\n\nbool AsemanQmlImage::mirror() const\n{\n    return p->mirror;\n}\n\nvoid AsemanQmlImage::setSmooth(bool smooth)\n{\n    if(p->smooth == smooth)\n        return;\n\n    p->mutex.lock();\n    p->smooth = smooth;\n    p->mutex.unlock();\n\n    refresh();\n    Q_EMIT smoothChanged();\n}\n\nbool AsemanQmlImage::smooth() const\n{\n    return p->smooth;\n}\n\nqreal AsemanQmlImage::paintedHeight() const\n{\n    return paintedSize().height();\n}\n\nqreal AsemanQmlImage::paintedWidth() const\n{\n    return paintedSize().width();\n}\n\nQSize AsemanQmlImage::imageSize() const\n{\n    QString path = AsemanTools::urlToLocalPath(p->source);\n    QImageReader reader(path);\n    return reader.size();\n}\n\nQSizeF AsemanQmlImage::paintedSize() const\n{\n    qreal ratio = width()/height();\n\n    QSize imgSize = imageSize();\n    qreal imgRatio = (qreal)imgSize.width()/imgSize.height();\n\n    QSizeF res;\n    switch(p->fillMode)\n    {\n    case PreserveAspectCrop:\n    {\n        if(ratio > imgRatio)\n        {\n            res.setWidth(width());\n            res.setHeight(width()/imgRatio);\n        }\n        else\n        {\n            res.setWidth(height()*imgRatio);\n            res.setHeight(height());\n        }\n    }\n        break;\n\n    case PreserveAspectFit:\n    {\n        if(ratio > imgRatio)\n        {\n            res.setWidth(height()*imgRatio);\n            res.setHeight(height());\n        }\n        else\n        {\n            res.setWidth(width());\n            res.setHeight(width()/imgRatio);\n        }\n    }\n        break;\n\n    case Stretch:\n    {\n        res.setWidth(width());\n        res.setHeight(height());\n    }\n        break;\n\n    case Tile:\n    {\n        res = imgSize;\n        break;\n    }\n    }\n\n    return res;\n}\n\nqreal AsemanQmlImage::progress() const\n{\n    return p->progress;\n}\n\nvoid AsemanQmlImage::refresh()\n{\n    update();\n}\n\nQString AsemanQmlImage::hash()\n{\n    QByteArray data;\n    QDataStream stream(&data, QIODevice::WriteOnly);\n    stream << p->asynchronous;\n    stream << p->autoTransform;\n    stream << p->cache;\n    stream << p->fillMode;\n    stream << p->horizontalAlignment;\n    stream << p->mirror;\n    stream << p->smooth;\n    stream << p->source;\n    stream << p->verticalAlignment;\n\n    return QString::fromUtf8(QCryptographicHash::hash(data, QCryptographicHash::Md5).toHex());\n}\n\nAsemanQmlImage::~AsemanQmlImage()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/qml/asemanqmlimage.h",
    "content": "#ifndef ASEMANQMLIMAGE_H\n#define ASEMANQMLIMAGE_H\n\n#include <QQuickPaintedItem>\n#include <QUrl>\n#include <QVariant>\n\n#include \"asemantools_global.h\"\n\nclass LIBQTASEMAN_QML_EXPORT AsemanQmlImage : public QQuickPaintedItem\n{\n    Q_OBJECT\n    Q_ENUMS(FillMode)\n\n    Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)\n    Q_PROPERTY(int fillMode READ fillMode WRITE setFillMode NOTIFY fillModeChanged)\n    Q_PROPERTY(bool asynchronous READ asynchronous WRITE setAsynchronous NOTIFY asynchronousChanged)\n    Q_PROPERTY(bool autoTransform READ autoTransform WRITE setAutoTransform NOTIFY autoTransformChanged)\n    Q_PROPERTY(bool cache READ cache WRITE setCache NOTIFY cacheChanged)\n    Q_PROPERTY(int horizontalAlignment READ horizontalAlignment WRITE setHorizontalAlignment NOTIFY horizontalAlignmentChanged)\n    Q_PROPERTY(int verticalAlignment READ verticalAlignment WRITE setVerticalAlignment NOTIFY verticalAlignmentChanged)\n    Q_PROPERTY(bool mipmap READ mipmap WRITE setMipmap NOTIFY mipmapChanged)\n    Q_PROPERTY(bool mirror READ mirror WRITE setMirror NOTIFY mirrorChanged)\n    Q_PROPERTY(qreal paintedWidth READ paintedWidth NOTIFY paintedSizeChanged)\n    Q_PROPERTY(qreal paintedHeight READ paintedHeight NOTIFY paintedSizeChanged)\n    Q_PROPERTY(qreal progress READ progress NOTIFY progressChanged)\n    Q_PROPERTY(bool smooth READ smooth WRITE setSmooth NOTIFY smoothChanged)\n    Q_PROPERTY(QSize sourceSize READ imageSize NOTIFY sourceSizeChanged)\n\n    class Private;\n\npublic:\n    enum FillMode {\n        Stretch,\n        PreserveAspectFit,\n        PreserveAspectCrop,\n        Tile\n    };\n\n    AsemanQmlImage(QQuickItem *parent = Q_NULLPTR);\n    virtual ~AsemanQmlImage();\n\n    virtual void paint(QPainter *painter) Q_DECL_OVERRIDE;\n\n    void setSource(const QUrl &source);\n    QUrl source() const;\n\n    void setFillMode(int fillMode);\n    int fillMode() const;\n\n    void setAsynchronous(bool asynchronous);\n    bool asynchronous() const;\n\n    void setAutoTransform(bool autoTransform);\n    bool autoTransform() const;\n\n    void setCache(bool cache);\n    bool cache() const;\n\n    void setHorizontalAlignment(int horizontalAlignment);\n    int horizontalAlignment() const;\n\n    void setVerticalAlignment(int verticalAlignment);\n    int verticalAlignment() const;\n\n    void setMipmap(bool mipmap);\n    bool mipmap() const;\n\n    void setMirror(bool mirror);\n    bool mirror() const;\n\n    void setSmooth(bool smooth);\n    bool smooth() const;\n\n    qreal paintedHeight() const;\n    qreal paintedWidth() const;\n\n    QSize imageSize() const;\n    QSizeF paintedSize() const;\n\n    qreal progress() const;\n\nQ_SIGNALS:\n    void sourceChanged();\n    void fillModeChanged();\n    void asynchronousChanged();\n    void autoTransformChanged();\n    void cacheChanged();\n    void horizontalAlignmentChanged();\n    void verticalAlignmentChanged();\n    void mipmapChanged();\n    void mirrorChanged();\n    void paintedSizeChanged();\n    void progressChanged();\n    void smoothChanged();\n    void sourceSizeChanged();\n\npublic Q_SLOTS:\n    void refresh();\n\nprotected:\n    QString hash();\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanQmlImage QAsemanQmlImage;\n\n#endif // ASEMANQMLIMAGE_H\n"
  },
  {
    "path": "src/qml/asemanqttools.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanbackhandler.h\"\n#include \"asemanqttools.h\"\n#include \"asemanquickview.h\"\n#include \"asemanqtlogger.h\"\n#include \"asemandevicesitem.h\"\n#include \"asemantoolsitem.h\"\n#include \"asemanapplicationitem.h\"\n#include \"asemanquickviewwrapper.h\"\n#include \"asemanapplicationsingleton.h\"\n#include \"asemandesktoptools.h\"\n#include <asemantexttools.h>\n#include <asemancalendarconverter.h>\n\n#ifdef Q_OS_ANDROID\n#include \"asemanjavalayer.h\"\n#endif\n\n#include <qqml.h>\n#include <QHash>\n#include <QPointer>\n#include <asemanglobaltranslations.h>\n\nvoid AsemanQtTools::initializeEngine(QQmlEngine *engine, const char *uri)\n{\n    Q_UNUSED(uri)\n    Q_UNUSED(engine)\n}\n\nAsemanQuickViewWrapper *AsemanQtTools::quickView(QQmlEngine *engine)\n{\n    AsemanQuickView *view = new AsemanQuickView(engine, Q_NULLPTR);\n    return new AsemanQuickViewWrapper(view, engine);\n}\n\nAsemanApplicationSingleton *AsemanQtTools::application(QQmlEngine *engine)\n{\n    return new AsemanApplicationSingleton(engine);\n}\n\nAsemanDesktopTools *AsemanQtTools::desktopTools()\n{\n    return new AsemanDesktopTools();\n}\n\nAsemanDevicesItem *AsemanQtTools::devices()\n{\n    return new AsemanDevicesItem();\n}\n\nAsemanQtLogger *AsemanQtTools::qtLogger()\n{\n    QString path = QString::fromUtf8(qgetenv(\"ASEMAN_LOG_PATH\"));\n    if(path.isEmpty())\n        path = AsemanApplicationItem::logPath() + \"/log\";\n\n    return new AsemanQtLogger(path);\n}\n\n#ifdef Q_OS_ANDROID\nAsemanJavaLayer *AsemanQtTools::javaLayer()\n{\n    return new AsemanJavaLayer();\n}\n#endif\n\nAsemanToolsItem *AsemanQtTools::tools()\n{\n    return new AsemanToolsItem();\n}\n\nAsemanTextTools *AsemanQtTools::textTools()\n{\n    return new AsemanTextTools();\n}\n\nAsemanCalendarConverter *AsemanQtTools::calendar(QQmlEngine *)\n{\n    return new AsemanCalendarConverter();\n}\n\nAsemanBackHandler *AsemanQtTools::backHandler(QQmlEngine *)\n{\n    return new AsemanBackHandler();\n}\n\nAsemanGlobalTranslations *AsemanQtTools::globalTranslations(QQmlEngine *)\n{\n    return new AsemanGlobalTranslations();\n}\n"
  },
  {
    "path": "src/qml/asemanqttools.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQTTOOLS_H\n#define ASEMANQTTOOLS_H\n\n#include <QtGlobal>\n#include <QString>\n\n#include \"asemantools_global.h\"\n\nclass QObject;\nclass QQmlEngine;\nclass QJSEngine;\nclass LIBQTASEMAN_QML_EXPORT AsemanQtTools\n{\npublic:\n    static void initializeEngine(QQmlEngine *engine, const char *uri);\n\n    static class AsemanQuickViewWrapper *quickView(QQmlEngine *engine);\n    static class AsemanApplicationSingleton *application(QQmlEngine *engine);\n    static class AsemanDesktopTools *desktopTools();\n    static class AsemanDevicesItem *devices();\n    static class AsemanQtLogger *qtLogger();\n#ifdef Q_OS_ANDROID\n    static class AsemanJavaLayer *javaLayer();\n#endif\n    static class AsemanToolsItem *tools();\n    static class AsemanTextTools *textTools();\n    static class AsemanCalendarConverter *calendar(QQmlEngine *engine);\n    static class AsemanBackHandler *backHandler(QQmlEngine *engine);\n    static class AsemanGlobalTranslations *globalTranslations(QQmlEngine *engine);\n\nprotected:\n    static QString fixType(const QString &type);\n};\n\n#endif // ASEMANQTTOOLS_H\n"
  },
  {
    "path": "src/qml/asemanquickobject.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanquickobject.h\"\n\n#include <QSet>\n\nQSet<AsemanQuickObject*> aseman_quick_objs;\n\nclass AsemanQuickObjectPrivate\n{\npublic:\n    QList<QObject*> items;\n};\n\nAsemanQuickObject::AsemanQuickObject(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanQuickObjectPrivate;\n    aseman_quick_objs.insert(this);\n}\n\nQQmlListProperty<QObject> AsemanQuickObject::items()\n{\n    return QQmlListProperty<QObject>(this, &p->items, QQmlListProperty<QObject>::AppendFunction(append),\n                                                      QQmlListProperty<QObject>::CountFunction(count),\n                                                      QQmlListProperty<QObject>::AtFunction(at),\n                                     QQmlListProperty<QObject>::ClearFunction(clear) );\n}\n\nQList<QObject *> AsemanQuickObject::itemsList() const\n{\n    return p->items;\n}\n\nbool AsemanQuickObject::isValid(AsemanQuickObject *obj)\n{\n    return aseman_quick_objs.contains(obj);\n}\n\nvoid AsemanQuickObject::append(QQmlListProperty<QObject> *p, QObject *v)\n{\n    AsemanQuickObject *aobj = static_cast<AsemanQuickObject*>(p->object);\n    aobj->p->items.append(v);\n    Q_EMIT aobj->itemsChanged();\n}\n\nint AsemanQuickObject::count(QQmlListProperty<QObject> *p)\n{\n    AsemanQuickObject *aobj = static_cast<AsemanQuickObject*>(p->object);\n    return aobj->p->items.count();\n}\n\nQObject *AsemanQuickObject::at(QQmlListProperty<QObject> *p, int idx)\n{\n    AsemanQuickObject *aobj = static_cast<AsemanQuickObject*>(p->object);\n    return aobj->p->items.at(idx);\n}\n\nvoid AsemanQuickObject::clear(QQmlListProperty<QObject> *p)\n{\n    AsemanQuickObject *aobj = static_cast<AsemanQuickObject*>(p->object);\n    aobj->p->items.clear();\n    Q_EMIT aobj->itemsChanged();\n}\n\nAsemanQuickObject::~AsemanQuickObject()\n{\n    aseman_quick_objs.remove(this);\n    delete p;\n}\n"
  },
  {
    "path": "src/qml/asemanquickobject.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQUICKOBJECT_H\n#define ASEMANQUICKOBJECT_H\n\n#include <QObject>\n#include <QQmlListProperty>\n\n#include \"asemanglobals.h\"\n\n#include \"asemantools_global.h\"\n\n#define aqobject_cast(OBJECT) static_cast<AsemanQuickObject*>(OBJECT)\n\n#define DEFINE_QML_PROEPRTY(TYPE, PNAME) \\\n    private: \\\n        QVariant _##PNAME; \\\n    Q_SIGNALS: \\\n        void PNAME##Changed(); \\\n    public: \\\n        Q_PROPERTY(TYPE PNAME READ PNAME WRITE set##PNAME NOTIFY PNAME##Changed) \\\n        TYPE PNAME() const { return _##PNAME.value<TYPE>(); } \\\n        void set##PNAME(TYPE PNAME) { SET_PROPERTY(PNAME) }\n\nclass AsemanQuickObjectPrivate;\nclass LIBQTASEMAN_QML_EXPORT AsemanQuickObject : public QObject\n{\n    Q_OBJECT\n\n    Q_PROPERTY(QQmlListProperty<QObject> items READ items NOTIFY itemsChanged)\n    Q_PROPERTY(QObject *parent READ parent NOTIFY parentChanged)\n    Q_CLASSINFO(\"DefaultProperty\", \"items\")\n\npublic:\n    Q_INVOKABLE explicit AsemanQuickObject(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanQuickObject();\n\n    QQmlListProperty<QObject> items();\n    QList<QObject*> itemsList() const;\n\n    static bool isValid(AsemanQuickObject* obj);\n\nQ_SIGNALS:\n    void itemsChanged();\n    void parentChanged();\n\nprivate:\n    static void append(QQmlListProperty<QObject> *p, QObject *v);\n    static int count(QQmlListProperty<QObject> *p);\n    static QObject *at(QQmlListProperty<QObject> *p, int idx);\n    static void clear(QQmlListProperty<QObject> *p);\n\nprivate:\n    AsemanQuickObjectPrivate *p;\n};\n\ntypedef AsemanQuickObject QAsemanQuickObject;\n\n#endif // ASEMANQUICKOBJECT_H\n"
  },
  {
    "path": "src/qml/asemanquickview.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanquickview.h\"\n#include \"asemandevicesitem.h\"\n#include \"asemanqttools.h\"\n#include \"asemantoolsitem.h\"\n#include \"aseman_macros.h\"\n#ifdef Q_OS_ANDROID\n#include \"asemanjavalayer.h\"\n#endif\n\n#include <QPointer>\n#include <QSharedPointer>\n#include <QtQml>\n#include <QQmlEngine>\n#include <QQmlContext>\n#include <QQuickItem>\n#include <QScreen>\n#include <QSet>\n#include <QDebug>\n\nclass AsemanQuickViewPrivate\n{\npublic:\n    QPointer<QObject> root;\n    QPointer<QQuickItem> focused_text;\n\n    bool reverseScroll;\n\n    QQmlEngine *engine;\n};\n\nAsemanQuickView::AsemanQuickView(QQmlEngine *engine, QObject *parent ) :\n    QObject(parent)\n{\n    p = new AsemanQuickViewPrivate;\n    p->engine = engine;\n    p->reverseScroll = false;\n\n    connect(devices(), &AsemanDevices::statusBarHeightChanged, this, &AsemanQuickView::statusBarHeightChanged);\n    connect(devices(), &AsemanDevices::navigationBarHeightChanged, this, &AsemanQuickView::navigationBarHeightChanged);\n}\n\nAsemanDesktopTools *AsemanQuickView::desktopTools() const\n{\n    return AsemanQtTools::desktopTools();\n}\n\nAsemanDevicesItem *AsemanQuickView::devices() const\n{\n    return AsemanQtTools::devices();\n}\n\nAsemanQtLogger *AsemanQuickView::qtLogger() const\n{\n    return AsemanQtTools::qtLogger();\n}\n\nAsemanToolsItem *AsemanQuickView::tools() const\n{\n    return AsemanQtTools::tools();\n}\n\n#ifdef Q_OS_ANDROID\nAsemanJavaLayer *AsemanQuickView::javaLayer() const\n{\n    return AsemanJavaLayer::instance();\n}\n#endif\n\nAsemanCalendarConverter *AsemanQuickView::calendar() const\n{\n    return AsemanQtTools::calendar(p->engine);\n}\n\nAsemanBackHandler *AsemanQuickView::backHandler() const\n{\n    return AsemanQtTools::backHandler(p->engine);\n}\n\nvoid AsemanQuickView::setReverseScroll(bool stt)\n{\n    if(p->reverseScroll == stt)\n        return;\n\n    p->reverseScroll = stt;\n    Q_EMIT reverseScrollChanged();\n}\n\nbool AsemanQuickView::reverseScroll() const\n{\n    return p->reverseScroll;\n}\n\nqreal AsemanQuickView::statusBarHeight() const\n{\n    return devices()->statusBarHeight();\n}\n\nqreal AsemanQuickView::navigationBarHeight() const\n{\n    return devices()->navigationBarHeight();\n}\n\nvoid AsemanQuickView::setRoot(QObject *root)\n{\n    if( p->root == root )\n        return;\n\n    p->root = root;\n    Q_EMIT rootChanged();\n}\n\nQObject *AsemanQuickView::root() const\n{\n    if( p->root )\n        return p->root;\n\n    return p->root;\n}\n\nvoid AsemanQuickView::setFocusedText(QQuickItem *item)\n{\n    if( p->focused_text == item )\n        return;\n    if( p->focused_text )\n        disconnect(p->focused_text, &QQuickItem::destroyed, this, &AsemanQuickView::focusedTextChanged);\n\n    p->focused_text = item;\n    if( item )\n    {\n        connect(p->focused_text, &QQuickItem::destroyed, this, &AsemanQuickView::focusedTextChanged);\n        devices()->showKeyboard();\n    }\n    else\n    {\n        devices()->hideKeyboard();\n    }\n\n    Q_EMIT focusedTextChanged();\n}\n\nQQuickItem *AsemanQuickView::focusedText() const\n{\n    return p->focused_text;\n}\n\nqreal AsemanQuickView::flickVelocity() const\n{\n#ifdef DESKTOP_DEVICE\n    return 2500;\n#else\n    return 25000;\n#endif\n}\n\nvoid AsemanQuickView::setOfflineStoragePath(const QString &path)\n{\n    if(path == offlineStoragePath())\n        return;\n\n    p->engine->setOfflineStoragePath(path);\n    Q_EMIT offlineStoragePathChanged();\n}\n\nQString AsemanQuickView::offlineStoragePath() const\n{\n    return p->engine->offlineStoragePath();\n}\n\nvoid AsemanQuickView::registerWindow(QQuickWindow *window)\n{\n#ifdef Q_OS_IOS\n    window->setFlag(Qt::MaximizeUsingFullscreenGeometryHint, true);\n#endif\n    window->installEventFilter(this);\n}\n\nvoid AsemanQuickView::discardFocusedText()\n{\n    setFocusedText(0);\n}\n\nbool AsemanQuickView::eventFilter(QObject *o, QEvent *e)\n{\n    QQuickWindow *win = qobject_cast<QQuickWindow*>(o);\n    if(win)\n    {\n        switch( static_cast<int>(e->type()) )\n        {\n        case QEvent::Close:\n            if(o->property(\"backController\").toBool())\n            {\n                QCloseEvent *ce = static_cast<QCloseEvent*>(e);\n                if( o->property(\"try_close\").toBool() || AsemanDevices::isDesktop() )\n                    ce->accept();\n                else\n                {\n                    ce->ignore();\n                    QMetaObject::invokeMethod(o, \"closeRequest\");\n                }\n            }\n            break;\n        case QEvent::KeyPress:\n        {\n            QKeyEvent *ke = static_cast<QKeyEvent*>(e);\n            switch(ke->key())\n            {\n            case Qt::Key_Escape:\n            case Qt::Key_Back:\n                QMetaObject::invokeMethod(o, \"closeRequest\");\n                break;\n            }\n        }\n            break;\n        }\n    }\n\n    return QObject::eventFilter(o,e);\n}\n\nAsemanQuickView::~AsemanQuickView()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/qml/asemanquickview.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQUICKVIEW_H\n#define ASEMANQUICKVIEW_H\n\n#include <QQuickView>\n#include <QQmlEngine>\n#include <QQuickItem>\n\n#include \"asemantools_global.h\"\n\nclass AsemanBackHandler;\nclass AsemanDesktopTools;\nclass AsemanDevicesItem;\nclass AsemanJavaLayer;\nclass AsemanQtLogger;\nclass AsemanToolsItem;\nclass AsemanCalendarConverter;\nclass AsemanQuickViewPrivate;\nclass LIBQTASEMAN_QML_EXPORT AsemanQuickView : public QObject\n{\n    Q_OBJECT\n\n    Q_PROPERTY(bool reverseScroll READ reverseScroll WRITE setReverseScroll NOTIFY reverseScrollChanged)\n\n    Q_PROPERTY(qreal statusBarHeight READ statusBarHeight NOTIFY statusBarHeightChanged)\n    Q_PROPERTY(qreal navigationBarHeight READ navigationBarHeight NOTIFY navigationBarHeightChanged)\n\n    Q_PROPERTY(QObject*    root        READ root        WRITE setRoot        NOTIFY rootChanged)\n    Q_PROPERTY(QQuickItem* focusedText READ focusedText WRITE setFocusedText NOTIFY focusedTextChanged)\n\n    Q_PROPERTY(QString offlineStoragePath READ offlineStoragePath WRITE setOfflineStoragePath NOTIFY offlineStoragePathChanged)\n\n    Q_PROPERTY(qreal flickVelocity READ flickVelocity NOTIFY fakeSignal)\n\npublic:\n    AsemanQuickView(QQmlEngine *engine, QObject *parent = Q_NULLPTR);\n    virtual ~AsemanQuickView();\n\n    AsemanDesktopTools *desktopTools() const;\n    AsemanDevicesItem *devices() const;\n    AsemanQtLogger *qtLogger() const;\n    AsemanToolsItem *tools() const;\n#ifdef Q_OS_ANDROID\n    AsemanJavaLayer *javaLayer() const;\n#endif\n    AsemanCalendarConverter *calendar() const;\n    AsemanBackHandler *backHandler() const;\n\n    void setReverseScroll(bool stt);\n    bool reverseScroll() const;\n\n    qreal statusBarHeight() const;\n    qreal navigationBarHeight() const;\n\n    void setRoot( QObject *root );\n    QObject *root() const;\n\n    void setFocusedText( QQuickItem *item );\n    QQuickItem *focusedText() const;\n\n    qreal flickVelocity() const;\n\n    void setOfflineStoragePath(const QString &path);\n    QString offlineStoragePath() const;\n\n    Q_INVOKABLE void registerWindow(QQuickWindow *window);\n\npublic Q_SLOTS:\n    void discardFocusedText();\n\nQ_SIGNALS:\n    void statusBarHeightChanged();\n    void navigationBarHeightChanged();\n    void rootChanged();\n    void focusedTextChanged();\n    void reverseScrollChanged();\n    void fakeSignal();\n    void closeRequest();\n    void offlineStoragePathChanged();\n\nprotected:\n    bool eventFilter(QObject *watched, QEvent *event) Q_DECL_OVERRIDE;\n\nprivate:\n    AsemanQuickViewPrivate *p;\n};\n\ntypedef AsemanQuickView QAsemanQuickView;\n\n#endif // ASEMANQUICKVIEW_H\n"
  },
  {
    "path": "src/qml/asemanquickviewwrapper.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanquickviewwrapper.h\"\n\nAsemanQuickViewWrapper::AsemanQuickViewWrapper(AsemanQuickView *view, QObject *parent) :\n    QObject(parent),\n    mView(view)\n{\n    connect(mView, &AsemanQuickView::statusBarHeightChanged, this, &AsemanQuickViewWrapper::statusBarHeightChanged);\n    connect(mView, &AsemanQuickView::navigationBarHeightChanged, this, &AsemanQuickViewWrapper::navigationBarHeightChanged);\n    connect(mView, &AsemanQuickView::rootChanged, this, &AsemanQuickViewWrapper::rootChanged);\n    connect(mView, &AsemanQuickView::focusedTextChanged, this, &AsemanQuickViewWrapper::focusedTextChanged);\n    connect(mView, &AsemanQuickView::reverseScrollChanged, this, &AsemanQuickViewWrapper::reverseScrollChanged);\n    connect(mView, &AsemanQuickView::fakeSignal, this, &AsemanQuickViewWrapper::fakeSignal);\n    connect(mView, &AsemanQuickView::closeRequest, this, &AsemanQuickViewWrapper::closeRequest);\n    connect(mView, &AsemanQuickView::destroyed, this, &AsemanQuickViewWrapper::viewDestroyed);\n    connect(mView, &AsemanQuickView::offlineStoragePathChanged, this, &AsemanQuickViewWrapper::offlineStoragePathChanged);\n}\n\nAsemanQuickViewWrapper::~AsemanQuickViewWrapper()\n{\n}\n\nvoid AsemanQuickViewWrapper::setReverseScroll(bool stt)\n{\n    mView->setReverseScroll(stt);\n}\n\nbool AsemanQuickViewWrapper::reverseScroll() const\n{\n    return mView->reverseScroll();\n}\n\nqreal AsemanQuickViewWrapper::statusBarHeight() const\n{\n    return mView->statusBarHeight();\n}\n\nqreal AsemanQuickViewWrapper::navigationBarHeight() const\n{\n    return mView->navigationBarHeight();\n}\n\nvoid AsemanQuickViewWrapper::setRoot(QObject *root)\n{\n    mView->setRoot(root);\n}\n\nQObject *AsemanQuickViewWrapper::root() const\n{\n    return mView->root();\n}\n\nvoid AsemanQuickViewWrapper::setFocusedText(QQuickItem *item)\n{\n    mView->setFocusedText(item);\n}\n\nQQuickItem *AsemanQuickViewWrapper::focusedText() const\n{\n    return mView->focusedText();\n}\n\nqreal AsemanQuickViewWrapper::flickVelocity() const\n{\n    return mView->flickVelocity();\n}\n\nQWindow *AsemanQuickViewWrapper::window() const\n{\n    return 0;\n}\n\nvoid AsemanQuickViewWrapper::setOfflineStoragePath(const QString &path)\n{\n    mView->setOfflineStoragePath(path);\n}\n\nQString AsemanQuickViewWrapper::offlineStoragePath() const\n{\n    return mView->offlineStoragePath();\n}\n\nvoid AsemanQuickViewWrapper::registerWindow(QQuickWindow *window)\n{\n    mView->registerWindow(window);\n}\n\nvoid AsemanQuickViewWrapper::discardFocusedText()\n{\n    mView->discardFocusedText();\n}\n\nvoid AsemanQuickViewWrapper::viewDestroyed()\n{\n    deleteLater();\n}\n"
  },
  {
    "path": "src/qml/asemanquickviewwrapper.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANQUICKVIEWWRAPPER_H\n#define ASEMANQUICKVIEWWRAPPER_H\n\n#include <QObject>\n#include \"asemanquickview.h\"\n\n#include \"asemantools_global.h\"\n\nclass LIBQTASEMAN_QML_EXPORT AsemanQuickViewWrapper : public QObject\n{\n    Q_OBJECT\n\n    Q_PROPERTY(bool reverseScroll READ reverseScroll WRITE setReverseScroll NOTIFY reverseScrollChanged)\n\n    Q_PROPERTY(qreal statusBarHeight READ statusBarHeight NOTIFY statusBarHeightChanged)\n    Q_PROPERTY(qreal navigationBarHeight READ navigationBarHeight NOTIFY navigationBarHeightChanged)\n\n    Q_PROPERTY(QObject*    root        READ root        WRITE setRoot        NOTIFY rootChanged)\n    Q_PROPERTY(QQuickItem* focusedText READ focusedText WRITE setFocusedText NOTIFY focusedTextChanged)\n\n    Q_PROPERTY(QString offlineStoragePath READ offlineStoragePath WRITE setOfflineStoragePath NOTIFY offlineStoragePathChanged)\n\n    Q_PROPERTY(qreal flickVelocity READ flickVelocity NOTIFY fakeSignal)\n    Q_PROPERTY(QWindow* window READ window NOTIFY fakeSignal)\n\npublic:\n    AsemanQuickViewWrapper(AsemanQuickView *view, QObject *parent = Q_NULLPTR);\n    virtual ~AsemanQuickViewWrapper();\n\n    void setReverseScroll(bool stt);\n    bool reverseScroll() const;\n\n    qreal statusBarHeight() const;\n    qreal navigationBarHeight() const;\n\n    void setRoot( QObject *root );\n    QObject *root() const;\n\n    void setFocusedText( QQuickItem *item );\n    QQuickItem *focusedText() const;\n\n    void setBackController(bool stt);\n    bool backController() const;\n\n    qreal flickVelocity() const;\n\n    QWindow *window() const;\n\n    void setOfflineStoragePath(const QString &path);\n    QString offlineStoragePath() const;\n\n    Q_INVOKABLE void registerWindow(QQuickWindow *window);\n\npublic Q_SLOTS:\n    void discardFocusedText();\n\nQ_SIGNALS:\n    void fullscreenChanged();\n    void statusBarHeightChanged();\n    void navigationBarHeightChanged();\n    void rootChanged();\n    void focusedTextChanged();\n    void backControllerChanged();\n    void reverseScrollChanged();\n    void fakeSignal();\n    void closeRequest();\n    void offlineStoragePathChanged();\n\nprivate Q_SLOTS:\n    void viewDestroyed();\n\nprivate:\n    AsemanQuickView *mView;\n};\n\ntypedef AsemanQuickViewWrapper QAsemanQuickViewWrapper;\n\n#endif // ASEMANQUICKVIEWWRAPPER_H\n"
  },
  {
    "path": "src/qml/asemantools_global.h",
    "content": "#ifndef ASEMAN_QML_GLOBAL_H\n#define ASEMAN_QML_GLOBAL_H\n\n#include <QtCore/qglobal.h>\n\n#if !defined(QT_STATIC) && !defined(QASEMAN_STATIC)\n#if defined(LIBQTASEMAN_QML_LIBRARY)\n#  define LIBQTASEMAN_QML_EXPORT Q_DECL_EXPORT\n#else\n#  define LIBQTASEMAN_QML_EXPORT Q_DECL_IMPORT\n#endif\n#else\n#define LIBQTASEMAN_QML_EXPORT\n#endif\n\n#endif // ASEMAN_QML_GLOBAL_H\n"
  },
  {
    "path": "src/qml/asemantoolsitem.cpp",
    "content": "#include \"asemantoolsitem.h\"\n#include \"asemanqttools.h\"\n\n#include <QJsonDocument>\n#include <QTimerEvent>\n\nclass AsemanToolsItemPrivate\n{\npublic:\n    QHash<int, QJSValue> js_delay_call_timers;\n};\n\nAsemanToolsItem::AsemanToolsItem(QObject *parent) :\n    AsemanTools(parent)\n{\n    p = new AsemanToolsItemPrivate;\n}\n\nQVariant AsemanToolsItem::jsonToVariant(const QString &json)\n{\n    return QJsonDocument::fromJson(json.toUtf8()).toVariant();\n}\n\nQString AsemanToolsItem::variantToJson(QVariant value, bool compact)\n{\n    value = value.value<QJSValue>().toVariant();\n    return QString::fromUtf8(QJsonDocument::fromVariant(value).toJson(compact? QJsonDocument::Compact : QJsonDocument::Indented));\n}\n\nvoid AsemanToolsItem::jsDelayCall(int ms, const QJSValue &value)\n{\n    p->js_delay_call_timers[ startTimer(ms) ] = value;\n}\n\nvoid AsemanToolsItem::imageResize(const QString &path, const QSize &size, const QString &dest, const QJSValue &callback)\n{\n    AsemanTools::imageResize(path, size, dest, this, [callback](bool stt){\n        QJSValue(callback).call(QJSValueList() << stt);\n    });\n}\n\nvoid AsemanToolsItem::setInAppStoreProperty(QObject *store, const QString &propertyName, const QString &value)\n{\n#ifdef QT_PURCHASING_LIB\n    if(!store)\n        return;\n    QList<QObject*> childs = store->children();\n    childs.prepend(store);\n    for(QObject *obj: childs)\n        if( qobject_cast<QInAppStore*>(obj) )\n            qobject_cast<QInAppStore*>(obj)->setPlatformProperty(propertyName, value);\n#else\n    Q_UNUSED(store)\n    Q_UNUSED(propertyName)\n    Q_UNUSED(value)\n#endif\n}\n\nvoid AsemanToolsItem::timerEvent(QTimerEvent *e)\n{\n    if(p->js_delay_call_timers.contains(e->timerId()))\n    {\n        p->js_delay_call_timers.take(e->timerId()).call();\n    }\n    else\n        QObject::timerEvent(e);\n}\n\nAsemanToolsItem::~AsemanToolsItem()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/qml/asemantoolsitem.h",
    "content": "#ifndef ASEMANTOOLSITEM_H\n#define ASEMANTOOLSITEM_H\n\n#include <QJSValue>\n#include <QObject>\n\n#include <asemantools.h>\n\n#include \"asemantools_global.h\"\n\nclass AsemanToolsItemPrivate;\nclass LIBQTASEMAN_QML_EXPORT AsemanToolsItem : public AsemanTools\n{\n    Q_OBJECT\npublic:\n    AsemanToolsItem(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanToolsItem();\n\npublic Q_SLOTS:\n    static QString variantToJson(QVariant value, bool compact = false);\n    static QVariant jsonToVariant(const QString &json);\n\n    void jsDelayCall(int ms, const QJSValue &value);\n    void imageResize(const QString &path, const QSize &size, const QString &dest, const QJSValue &callback);\n\n    static void setInAppStoreProperty(QObject *store, const QString &propertyName, const QString &value);\n\nprotected:\n    void timerEvent(QTimerEvent *e) Q_DECL_OVERRIDE;\n\nprivate:\n    AsemanToolsItemPrivate *p;\n};\n\ntypedef AsemanToolsItem QAsemanToolsItem;\n\n#endif // ASEMANTOOLSITEM_H\n"
  },
  {
    "path": "src/qml/private/osxviewcontroller.h",
    "content": "#ifndef MYVIEWCONTROLLER_H\n#define MYVIEWCONTROLLER_H\n\n#include <QtGlobal>\n\n#ifdef Q_OS_IOS\n\n#import <UIKit/UIKit.h>\n\n@interface QIOSViewController : UIViewController\n@end\n\n\n@interface QIOSViewController (MyView)\n@end\n\n#endif\n#endif // MYVIEWCONTROLLER_H\n"
  },
  {
    "path": "src/qml/private/osxviewcontroller.mm",
    "content": "#import \"osxviewcontroller.h\"\n\n@implementation QIOSViewController (MyView)\n\n- (UIStatusBarStyle)preferredStatusBarStyle\n{\n    return UIStatusBarStyleLightContent;\n}\n\n@end\n"
  },
  {
    "path": "src/qml/private/quickios/qidevice.cpp",
    "content": "#include <QPointer>\n#include <QCoreApplication>\n#include \"qidevice.h\"\n\nstatic QPointer<QIDevice> m_instance;\n\nQIDevice::QIDevice(QObject* parent) : QObject(parent)\n{\n    m_screenFillStatusBar = false;\n    m_screenWidth = -1;\n    m_screenHeight = -1;\n\n    QVariantMap data = fetch();\n\n    QStringList properties;\n    properties << \"identifierForVendor\";\n\n    for (int i = 0 ; i < properties.count() ;i++) {\n        QString property = properties.at(i);\n        if (data.contains(property)) {\n            setProperty(property.toLocal8Bit().constData(),\n                        data[property]);\n        }\n    }\n\n\n}\n\nQString QIDevice::identifierForVendor() const\n{\n    return m_identifierForVendor;\n}\n\nvoid QIDevice::setIdentifierForVendor(const QString &identifierForVendor)\n{\n    m_identifierForVendor = identifierForVendor;\n    emit identifierForVendorChanged();\n}\n\n#ifndef Q_OS_IOS\nQVariantMap QIDevice::fetch() const\n{\n    QVariantMap data;\n    return data;\n}\n#endif\n\n\nQIDevice::~QIDevice()\n{\n\n}\n\nbool QIDevice::screenFillStatusBar() const\n{\n    return m_screenFillStatusBar;\n}\n\nvoid QIDevice::setScreenFillStatusBar(bool screenFillStatusBar)\n{\n    m_screenFillStatusBar = screenFillStatusBar;\n    emit screenFillStatusBarChanged();\n}\n\nint QIDevice::screenWidth() const\n{\n    return m_screenWidth;\n}\n\nvoid QIDevice::setScreenWidth(int screenWidth)\n{\n    m_screenWidth = screenWidth;\n    emit screenHeightChanged();\n}\n\nint QIDevice::screenHeight() const\n{\n    return m_screenHeight;\n}\n\nvoid QIDevice::setScreenHeight(int screenHeight)\n{\n    m_screenHeight = screenHeight;\n    emit screenHeightChanged();\n}\n\nQIDevice *QIDevice::instance()\n{\n    if (m_instance.isNull()) {\n        QCoreApplication* app = QCoreApplication::instance();\n        m_instance = new QIDevice(app);\n    }\n\n    return m_instance;\n}\n\n\n\n\n"
  },
  {
    "path": "src/qml/private/quickios/qidevice.h",
    "content": "#ifndef QIDEVICE_H\n#define QIDEVICE_H\n\n#include <QObject>\n#include <QVariantMap>\n\n#include <QtGlobal>\n\n#ifdef Q_OS_IOS\n\n/// Device information provider\n\nclass QIDevice : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(bool screenFillStatusBar READ screenFillStatusBar WRITE setScreenFillStatusBar NOTIFY screenFillStatusBarChanged)\n    Q_PROPERTY(int screenWidth READ screenWidth WRITE setScreenWidth NOTIFY screenWidthChanged)\n    Q_PROPERTY(int screenHeight READ screenHeight WRITE setScreenHeight NOTIFY screenHeightChanged)\n    Q_PROPERTY(QString identifierForVendor READ identifierForVendor WRITE setIdentifierForVendor NOTIFY identifierForVendorChanged)\n\npublic:\n    ~QIDevice();\n\n    /// It is truth if the status bar area should be filled by the application\n    bool screenFillStatusBar() const;\n    void setScreenFillStatusBar(bool screenFillStatusBar);\n\n    int screenWidth() const;\n    void setScreenWidth(int screenWidth);\n\n    int screenHeight() const;\n    void setScreenHeight(int screenHeight);\n\n    static QIDevice* instance();\n\n    QString identifierForVendor() const;\n    void setIdentifierForVendor(const QString &identifierForVendor);\n\nQ_SIGNALS:\n    void screenFillStatusBarChanged();\n    void screenHeightChanged();\n    void screenWidthChanged();\n\n    void identifierForVendorChanged();\n\nprivate:\n    // Fetch device specific information.\n    QVariantMap fetch() const;\n\n    QIDevice(QObject* parent = 0);\n\n    bool m_screenFillStatusBar;\n    int m_screenWidth;\n    int m_screenHeight;\n\n    QString m_identifierForVendor;\n};\n\n#endif\n\n#endif // QIDEVICE_H\n"
  },
  {
    "path": "src/qml/private/quickios/qidevice.mm",
    "content": "#import <UIKit/UIKit.h>\n#include \"qidevice.h\"\n\nQVariantMap QIDevice::fetch() const {\n    UIDevice* device = [UIDevice currentDevice];\n\n    QVariantMap result;\n\n    result[\"identifierForVendor\"] = QString::fromNSString([[device identifierForVendor] UUIDString]);\n\n    return result;\n}\n\n\n"
  },
  {
    "path": "src/qml/private/quickios/qiimagepicker.cpp",
    "content": "#include <QStandardPaths>\n#include <QFileDialog>\n#include <QTemporaryFile>\n#include <QUrl>\n#include <QRunnable>\n#include <QPointer>\n#include <QDebug>\n#include <QThreadPool>\n#include <QImageWriter>\n#include <QImageReader>\n#include \"qisystemdispatcher.h\"\n#include \"qiimagepicker.h\"\n\nclass QIImagePickerSaver : public QRunnable {\npublic:\n    QPointer<QIImagePicker> owner;\n    QImage image;\n    QString fileName;\n\n    void run() {\n        if (fileName.isNull()) { // Save as temp\n            QTemporaryFile tmp;\n            QStringList paths = QStandardPaths::standardLocations(QStandardPaths::TempLocation);\n            QString tmpPath = paths.at(0);\n\n            tmp.setFileTemplate(tmpPath + \"/XXXXXX.jpg\");\n            tmp.open();\n            fileName = tmp.fileName();\n            tmp.close();\n        }\n\n        image.save(fileName);\n        QImageWriter writer;\n        writer.setFileName(fileName);\n        if (!writer.write(image)) {\n            qWarning() << QString(\"Failed to save %1 : %2\").arg(fileName).arg(writer.errorString());\n        }\n\n        if (!owner.isNull()) {\n            QMetaObject::invokeMethod(owner.data(),\"endSave\",Qt::QueuedConnection,\n                                      Q_ARG(QString,fileName));\n        }\n    }\n};\n\nQIImagePicker::QIImagePicker(QObject *parent) : QObject(parent)\n{\n    m_sourceType = PhotoLibrary;\n    m_status = Null;\n    m_busy = false;\n}\n\nQIImagePicker::~QIImagePicker()\n{\n\n}\n\nvoid QIImagePicker::show(bool animated)\n{\n    if (m_status == Running || m_status == Saving) {\n        return;\n    }\n\n    QISystemDispatcher* system = QISystemDispatcher::instance();\n\n    QVariantMap data;\n    data[\"sourceType\"] = m_sourceType;\n    data[\"animated\"] = animated;\n\n    connect(system,SIGNAL(dispatched(QString,QVariantMap)),\n            this,SLOT(onReceived(QString,QVariantMap)));\n\n    bool res = system->dispatch(\"imagePickerControllerPresent\",data);\n\n    if (res) {\n        setStatus(Running);\n    }\n}\n\nvoid QIImagePicker::close(bool animated)\n{\n    QISystemDispatcher* system = QISystemDispatcher::instance();\n    QVariantMap data;\n    data[\"animated\"] = animated;\n\n    system->dispatch(\"imagePickerControllerDismiss\",data);\n}\n\nvoid QIImagePicker::save(QString fileName)\n{\n    QIImagePickerSaver* saver = new QIImagePickerSaver();\n    saver->setAutoDelete(true);\n    saver->owner = this;\n    saver->fileName = fileName;\n    saver->image = m_image;\n\n    QThreadPool::globalInstance()->start(saver);\n}\n\nvoid QIImagePicker::saveAsTemp()\n{\n    save(QString());\n}\n\nvoid QIImagePicker::clear()\n{\n    setImage(QImage());\n    setStatus(Null);\n}\n\nQIImagePicker::SourceType QIImagePicker::sourceType() const\n{\n    return m_sourceType;\n}\n\nvoid QIImagePicker::setSourceType(const SourceType &sourceType)\n{\n    m_sourceType = sourceType;\n    emit sourceTypeChanged();\n}\n\nQImage QIImagePicker::image() const\n{\n    return m_image;\n}\n\nvoid QIImagePicker::setImage(const QImage &image)\n{\n    m_image = image;\n}\n\nQIImagePicker::Status QIImagePicker::status() const\n{\n    return m_status;\n}\n\nvoid QIImagePicker::setStatus(const Status &status)\n{\n    if (m_status == status)\n        return;\n    m_status = status;\n    emit statusChanged();\n}\n\nvoid QIImagePicker::onReceived(QString name, QVariantMap data)\n{\n    QISystemDispatcher* system = QISystemDispatcher::instance();\n\n    if (name == \"imagePickerControllerDidCancel\") {\n        setStatus(Null);\n        system->disconnect(this);\n        close();\n    }\n\n    if (name != \"imagePickerControllerDisFinishPickingMetaWithInfo\")\n        return;\n\n    system->disconnect(this);\n    QImage image = data[\"image\"].value<QImage>();\n    setImage(image);\n    setMediaType(data[\"mediaType\"].toString());\n    setMediaUrl(data[\"mediaUrl\"].toString());\n    setReferenceUrl(data[\"referenceUrl\"].toString());\n\n    setStatus(Ready);\n    emit ready();\n}\n\nvoid QIImagePicker::endSave(QString fileName)\n{\n    QUrl url = QUrl::fromLocalFile(fileName);\n\n    emit saved(url.toString());\n\n    if (m_image.isNull()) {\n        setStatus(Null);\n    } else {\n        setStatus(Ready);\n    }\n}\nQString QIImagePicker::referenceUrl() const\n{\n    return m_referenceUrl;\n}\n\nvoid QIImagePicker::setReferenceUrl(const QString &referenceUrl)\n{\n    m_referenceUrl = referenceUrl;\n    emit referenceUrlChanged();\n}\n\nQString QIImagePicker::mediaUrl() const\n{\n    return m_mediaUrl;\n}\n\nvoid QIImagePicker::setMediaUrl(const QString &mediaUrl)\n{\n    m_mediaUrl = mediaUrl;\n    emit mediaUrlChanged();\n}\n\nQString QIImagePicker::mediaType() const\n{\n    return m_mediaType;\n}\n\nvoid QIImagePicker::setMediaType(const QString &mediaType)\n{\n    m_mediaType = mediaType;\n    emit mediaTypeChanged();\n}\n\nbool QIImagePicker::busy() const\n{\n    return m_busy;\n}\n\nvoid QIImagePicker::setBusy(bool busy)\n{\n    if (m_busy == busy)\n        return;\n\n    m_busy = busy;\n    QISystemDispatcher* system = QISystemDispatcher::instance();\n\n    QVariantMap data;\n    data[\"active\"] = m_busy;\n\n    system->dispatch(\"imagePickerControllerSetIndicator\",data);\n    emit busyChanged();\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/qml/private/quickios/qiimagepicker.h",
    "content": "#ifndef QIIMAGEPICKER_H\n#define QIIMAGEPICKER_H\n\n#include <QtGlobal>\n\n#ifdef Q_OS_IOS\n\n#include <QObject>\n#include <QImage>\n#include <QVariantMap>\n\n/// QIImagePicker provides a simple interface to access camera and camera roll via the UIImagePickerController\nclass QIImagePicker : public QObject\n{\n    Q_OBJECT\n    Q_ENUMS(SourceType)\n    Q_ENUMS(Status)\n    Q_PROPERTY(SourceType sourceType READ sourceType WRITE setSourceType NOTIFY sourceTypeChanged)\n    Q_PROPERTY(QImage image READ image WRITE setImage NOTIFY imageChanged)\n    Q_PROPERTY(Status status READ status WRITE setStatus NOTIFY statusChanged)\n    Q_PROPERTY(bool busy READ busy WRITE setBusy NOTIFY busyChanged)\n    Q_PROPERTY(QString mediaType READ mediaType WRITE setMediaType NOTIFY mediaTypeChanged)\n    Q_PROPERTY(QString mediaUrl READ mediaUrl WRITE setMediaUrl NOTIFY mediaUrlChanged)\n    Q_PROPERTY(QString referenceUrl READ referenceUrl WRITE setReferenceUrl NOTIFY referenceUrlChanged)\n\npublic:\n    enum SourceType {\n        PhotoLibrary,\n        Camera,\n        SavedPhotosAlbum\n    };\n\n    enum Status {\n        Null, // Nothing loaded\n        Running, // The view controller is running\n        Ready, // The image is ready\n        Saving // The image is saving\n    };\n\n    QIImagePicker(QObject* parent = nullptr);\n    ~QIImagePicker();\n\n    Q_INVOKABLE void show(bool animated = true);\n\n    Q_INVOKABLE void close(bool animated = true);\n\n    Q_INVOKABLE void save(QString fileName);\n\n    /// Save the stored image to tmp file.\n    Q_INVOKABLE void saveAsTemp();\n\n    Q_INVOKABLE void clear();\n\n    SourceType sourceType() const;\n    void setSourceType(const SourceType &sourceType);\n\n    QImage image() const;\n    void setImage(const QImage &image);\n\n    Status status() const;\n    void setStatus(const Status &status);\n\n    bool busy() const;\n    void setBusy(bool busy);\n\n    QString mediaType() const;\n    void setMediaType(const QString &mediaType);\n\n    QString mediaUrl() const;\n    void setMediaUrl(const QString &mediaUrl);\n\n    QString referenceUrl() const;\n    void setReferenceUrl(const QString &referenceUrl);\n\nsignals:\n    void sourceTypeChanged();\n    void imageChanged();\n    void statusChanged();\n    void busyChanged();\n    void referenceUrlChanged();\n    void mediaTypeChanged();\n    void mediaUrlChanged();\n\n    void ready();\n    void saved(QString url);\n\nprivate:\n    Q_INVOKABLE void onReceived(QString name,QVariantMap data);\n\n    Q_INVOKABLE void endSave(QString fileName);\n\n    SourceType m_sourceType;\n    QImage m_image;\n    Status m_status;\n\n    QString m_mediaType;\n    QString m_mediaUrl;\n    QString m_referenceUrl;\n\n    bool m_busy;\n};\n\n#endif\n\n#endif // QIIMAGEPICKER_H\n"
  },
  {
    "path": "src/qml/private/quickios/qisystemdispatcher.cpp",
    "content": "#include <QCoreApplication>\n#include <QPointer>\n#include <QtCore>\n#include \"qisystemdispatcher.h\"\n\ntypedef bool (*handler)(QVariantMap& data);\nstatic QMap<QString,handler> handlers;\nstatic QPointer<QISystemDispatcher> m_instance;\n\nQISystemDispatcher *QISystemDispatcher::instance()\n{\n    if (!m_instance) {\n        QCoreApplication* app = QCoreApplication::instance();\n        m_instance = new QISystemDispatcher(app);\n    }\n    return m_instance;\n}\n\nQISystemDispatcher::QISystemDispatcher(QObject *parent) : QObject(parent) {\n}\n\nbool QISystemDispatcher::dispatch(QString type , QVariantMap message) {\n\n    QMetaObject::invokeMethod(this,\"dispatched\",Qt::QueuedConnection,\n                              Q_ARG(QString , type),\n                              Q_ARG(QVariantMap,message));\n\n    bool res = false;\n    if (handlers.contains(type)) {\n        res = handlers[type](message);\n    }\n\n    return res;\n}\n\nbool QISystemDispatcher::addListener(QString name, bool (*func)(QVariantMap&))\n{\n    if (handlers.contains(name)) {\n        qWarning() << QString(\"%s is already registered\").arg(name);\n        return false;\n    }\n\n    handlers[name] = func;\n    return true;\n}\n"
  },
  {
    "path": "src/qml/private/quickios/qisystemdispatcher.h",
    "content": "#ifndef QQISystemDispatcher_H\n#define QQISystemDispatcher_H\n\n#include <QObject>\n#include <QVariantMap>\n\n#include <QtGlobal>\n\n#ifdef Q_OS_IOS\n\n/// QISystemMessenger provides an simple async messaging interface between C/C++/QML and Objective-C source code.\n/**\n */\n\nclass QISystemDispatcher : public QObject {\n    Q_OBJECT\n\npublic:\n    static QISystemDispatcher* instance();\n\n    /// Deliver a message\n    /** If there has a registered listener function , it will return TRUE. Otherwise, it will return FALSE.\n     *\n     * After processed by the registered helper, the \"received\" signal will be emitted\n     * in next tick of event loop.\n     */\n    Q_INVOKABLE bool dispatch(QString type , QVariantMap message);\n\n    /// Register a message listener.\n    /**\n     * @brief registerMessageHandler\n     * @param name\n     * @return TRUE if it is successfully. If it is already registered, it will return false.\n     */\n    bool addListener(QString name,bool (*func)(QVariantMap&) );\n\n    /// Return TRUE if it there has a message helper registered already.\n    bool hasListener(QString name);\n\nsignals:\n    /// The signal is emitted when a message is received.\n    void dispatched(QString name , QVariantMap data);\n\nprivate:\n    explicit QISystemDispatcher(QObject* parent = 0);\n\n};\n\n#endif\n#endif\n"
  },
  {
    "path": "src/qml/private/quickios/qisystemutils.mm",
    "content": "#include <QCoreApplication>\n#include <UIKit/UIKit.h>\n#include <QPointer>\n#include <QtCore>\n#include <QImage>\n#include \"qisystemdispatcher.h\"\n#include \"qiviewdelegate.h\"\n#include \"quickios.h\"\n\n@interface QIOSViewController : UIViewController\n@property (nonatomic, assign) BOOL prefersStatusBarHidden;\n@property (nonatomic, assign) UIStatusBarAnimation preferredStatusBarUpdateAnimation;\n@property (nonatomic, assign) UIStatusBarStyle preferredStatusBarStyle;\n@end\n\nstatic QImage fromUIImage(UIImage* image) {\n    QImage::Format format = QImage::Format_RGB32;\n\n    CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage);\n    CGFloat width = image.size.width;\n    CGFloat height = image.size.height;\n\n    long int orientation = [image imageOrientation];\n    int degree = 0;\n\n    switch (orientation) {\n    case UIImageOrientationLeft:\n        degree = -90;\n        break;\n    case UIImageOrientationDown: // Down\n        degree = 180;\n        break;\n    case UIImageOrientationRight:\n        degree = 90;\n        break;\n    }\n\n    if (degree == 90 || degree == -90)  {\n        CGFloat tmp = width;\n        width = height;\n        height = tmp;\n    }\n\n    QSizeF size(width,height);\n\n    QImage result = QImage(size.toSize(),format);\n\n    CGContextRef contextRef = CGBitmapContextCreate(result.bits(),                 // Pointer to  data\n                                                   width,                       // Width of bitmap\n                                                   height,                       // Height of bitmap\n                                                   8,                          // Bits per component\n                                                   result.bytesPerLine(),              // Bytes per row\n                                                   colorSpace,                 // Colorspace\n                                                   kCGImageAlphaNoneSkipFirst |\n                                                   kCGBitmapByteOrder32Little); // Bitmap info flags\n\n    CGContextDrawImage(contextRef, CGRectMake(0, 0, width, height), image.CGImage);\n    CGContextRelease(contextRef);\n\n    if (degree != 0) {\n        QTransform myTransform;\n        myTransform.rotate(degree);\n        result = result.transformed(myTransform,Qt::SmoothTransformation);\n    }\n\n    return result;\n}\n\nstatic QString fromNSUrl(NSURL* url) {\n    QString result = QString::fromNSString([url absoluteString]);\n\n    return result;\n}\n\nstatic UIImagePickerController* imagePickerController = nullptr;\nstatic UIActivityIndicatorView* imagePickerControllerActivityIndicator = nullptr;\n\nstatic bool imagePickerControllerPresent(QVariantMap& data) {\n    UIWindow *rootWindow = [[UIApplication sharedApplication] keyWindow];\n    UIViewController* rootViewController = rootWindow.rootViewController;\n\n    int sourceType = data[\"sourceType\"].toInt();\n    bool animated = data[\"animated\"].toBool();\n\n    if (![UIImagePickerController isSourceTypeAvailable:(UIImagePickerControllerSourceType) sourceType]) {\n        UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@\"Error\"\n                          message:@\"The operation is not supported in this device\"\n                          delegate:nil\n                          cancelButtonTitle:@\"OK\"\n                          otherButtonTitles: nil];\n        [myAlertView show];\n//        [myAlertView release];\n        return false;\n    }\n\n    UIImagePickerController *picker = [[UIImagePickerController alloc] init];\n    imagePickerController = picker;\n    picker.sourceType = (UIImagePickerControllerSourceType) sourceType;\n\n    static QIViewDelegate *delegate = nullptr;\n    delegate = [QIViewDelegate alloc];\n\n    delegate->imagePickerControllerDidFinishPickingMediaWithInfo = ^(UIImagePickerController *picker,\n                                                                     NSDictionary* info) {\n        Q_UNUSED(picker);\n\n        QString name = \"imagePickerControllerDisFinishPickingMetaWithInfo\";\n        QVariantMap data;\n\n        data[\"mediaType\"] = QString::fromNSString(info[UIImagePickerControllerMediaType]);\n        data[\"mediaUrl\"] = fromNSUrl(info[UIImagePickerControllerMediaURL]);\n        data[\"referenceUrl\"] = fromNSUrl(info[UIImagePickerControllerPHAsset]);\n\n        UIImage *chosenImage = info[UIImagePickerControllerEditedImage];\n        if (!chosenImage) {\n            chosenImage = info[UIImagePickerControllerOriginalImage];\n        }\n\n        if (!chosenImage) {\n            qWarning() << \"Image Picker: Failed to take image\";\n            name = \"imagePickerControllerDidCancel\";\n        } else {\n            QImage chosenQImage = fromUIImage(chosenImage);\n            data[\"image\"] = QVariant::fromValue<QImage>(chosenQImage);\n        }\n\n        QISystemDispatcher* m_instance = QISystemDispatcher::instance();\n\n        QMetaObject::invokeMethod(m_instance,\"dispatched\",Qt::DirectConnection,\n                                  Q_ARG(QString , name),\n                                  Q_ARG(QVariantMap,data));\n\n        delegate = nil;\n    };\n\n    delegate->imagePickerControllerDidCancel = ^(UIImagePickerController *picker) {\n        Q_UNUSED(picker);\n\n        QString name = \"imagePickerControllerDidCancel\";\n        QVariantMap data;\n        QISystemDispatcher* m_instance = QISystemDispatcher::instance();\n        QMetaObject::invokeMethod(m_instance,\"dispatched\",Qt::DirectConnection,\n                                  Q_ARG(QString , name),\n                                  Q_ARG(QVariantMap,data));\n\n        delegate = nil;\n    };\n\n    picker.delegate = delegate;\n\n    imagePickerControllerActivityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];\n    imagePickerControllerActivityIndicator.center = picker.view.center;\n    [picker.view addSubview:imagePickerControllerActivityIndicator];\n\n    [rootViewController presentViewController:picker animated:animated completion:nullptr];\n\n    return true;\n}\n\nbool imagePickerControllerDismiss(QVariantMap& data) {\n    Q_UNUSED(data);\n    if (!imagePickerController)\n        return false;\n\n    bool animated = data[\"animated\"].toBool();\n\n    [imagePickerController dismissViewControllerAnimated:animated completion:nullptr];\n//    [imagePickerController release];\n\n//    [imagePickerControllerActivityIndicator release];\n\n    imagePickerController = nullptr;\n    imagePickerControllerActivityIndicator = nullptr;\n    return true;\n}\n\nbool imagePickerControllerSetIndicator(QVariantMap& data) {\n    if (!imagePickerControllerActivityIndicator)\n        return false;\n\n    bool active = data[\"active\"].toBool();\n\n    if (active) {\n        [imagePickerControllerActivityIndicator startAnimating];\n    } else {\n        [imagePickerControllerActivityIndicator stopAnimating];\n    }\n\n    return true;\n}\n\nstatic bool applicationSetStatusBarStyle(QVariantMap& data) {\n    if (!data.contains(\"style\")) {\n        qWarning() << \"applicationSetStatusBarStyle: Missing argument\";\n        return false;\n    }\n\n    int style = data[\"style\"].toInt();\n    \n    UIWindow *window = [[UIApplication sharedApplication] keyWindow];\n    QIOSViewController *viewController = static_cast<QIOSViewController *>([window rootViewController]);\n\n    viewController.preferredStatusBarStyle = (UIStatusBarStyle) style;\n    [viewController setNeedsStatusBarAppearanceUpdate];\n\n    return true;\n}\n\nvoid QuickIOS::registerTypes() {\n    static bool typesRegistered = false;\n    if (typesRegistered)\n        return;\n\n    QISystemDispatcher* dispatcher = QISystemDispatcher::instance();\n\n    dispatcher->addListener(\"applicationSetStatusBarStyle\",applicationSetStatusBarStyle);\n\n    dispatcher->addListener(\"imagePickerControllerPresent\",imagePickerControllerPresent);\n    dispatcher->addListener(\"imagePickerControllerDismiss\",imagePickerControllerDismiss);\n    dispatcher->addListener(\"imagePickerControllerSetIndicator\",imagePickerControllerSetIndicator);\n\n    typesRegistered = true;\n}\n"
  },
  {
    "path": "src/qml/private/quickios/qiviewdelegate.h",
    "content": "//\n// QIViewDelegate - A universal delegate class for listening event\n//\n\n#include <QtGlobal>\n\n#ifdef Q_OS_IOS\n\n#include <UIKit/UIKit.h>\n\n@interface QIViewDelegate : NSObject<UIAlertViewDelegate,\n                                     UIActionSheetDelegate,\n                                     UIImagePickerControllerDelegate,\n                                     UINavigationControllerDelegate> {\n\n    @public\n\n    void ( ^ alertViewClickedButtonAtIndex )( int );\n    void ( ^ alertViewDismissWithButtonIndex )( int );\n\n    void ( ^ actionSheetClickedButtonAtIndex) (int);\n    void ( ^ actionSheetDidDismissWithButtonIndex) (int);\n\n    void (^ imagePickerControllerDidFinishPickingMediaWithInfo)(UIImagePickerController* picker,NSDictionary* info);\n    void (^ imagePickerControllerDidCancel)(UIImagePickerController* picker);\n}\n@end\n\n#endif\n"
  },
  {
    "path": "src/qml/private/quickios/qiviewdelegate.mm",
    "content": "#include <QtCore>\n#import \"qiviewdelegate.h\"\n\n@interface QIViewDelegate ()\n\n@end\n\n@implementation QIViewDelegate\n\n- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {\n    if (alertViewClickedButtonAtIndex)\n        alertViewClickedButtonAtIndex(buttonIndex);\n}\n\n- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{\n    if (alertViewDismissWithButtonIndex)\n        alertViewDismissWithButtonIndex(buttonIndex);\n}\n\n- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {\n\n    if (actionSheetClickedButtonAtIndex) {\n        actionSheetClickedButtonAtIndex(buttonIndex);\n    }\n}\n\n- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {\n    if (actionSheetDidDismissWithButtonIndex) {\n        actionSheetDidDismissWithButtonIndex(buttonIndex);\n    };\n}\n\n- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {\n    if (imagePickerControllerDidFinishPickingMediaWithInfo) {\n        imagePickerControllerDidFinishPickingMediaWithInfo(picker,info);\n    }\n}\n\n- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {\n    if (imagePickerControllerDidCancel) {\n        imagePickerControllerDidCancel(picker);\n    }\n}\n\n@end\n"
  },
  {
    "path": "src/qml/private/quickios/quickios.cpp",
    "content": "#include <QtQml>\n#include <QtGui>\n#include <QVariantMap>\n#include <QPointer>\n#include \"quickios.h\"\n#include \"qisystemdispatcher.h\"\n#include \"qidevice.h\"\n#include \"qiimagepicker.h\"\n\nvoid QuickIOS::setStatusBarStyle(QuickIOS::StatusBarStyle style)\n{\n    QISystemDispatcher *system = QISystemDispatcher::instance();\n    QVariantMap data;\n    data[\"style\"] = style;\n\n    system->dispatch(\"applicationSetStatusBarStyle\",data);\n}\n\nvoid QuickIOS::setStatusBarHidden(bool hidden, int animation)\n{\n    QISystemDispatcher* dispatcher = QISystemDispatcher::instance();\n    QVariantMap message;\n    message[\"hidden\"] = hidden;\n    message[\"animation\"] = animation;\n    dispatcher->dispatch(\"applicationSetStatusBarHidden\", message);\n}\n"
  },
  {
    "path": "src/qml/private/quickios/quickios.h",
    "content": "#ifndef QUICKIOS_H\n#define QUICKIOS_H\n\n#include <QtGlobal>\n\n#ifdef Q_OS_IOS\n\n#include <QtPlugin>\n#include <QQuickWindow>\n#include <QObject>\n\nclass QuickIOS: public QObject\n{\n    Q_OBJECT\n    Q_ENUMS(StatusBarStyle)\npublic:\n    QuickIOS(QObject *parent = Q_NULLPTR) : QObject(parent) {}\n    virtual ~QuickIOS() {}\n\n    enum StatusBarStyle {\n        StatusBarStyleDefault,\n        StatusBarStyleLightContent,\n        StatusBarStyleBlackTranslucent,\n        StatusBarStyleBlackOpaque\n    };\n\n    static void registerTypes();\n\npublic Q_SLOTS:\n    static void setStatusBarStyle(StatusBarStyle style);\n    static void setStatusBarHidden(bool hidden, int animation);\n};\n\n#endif\n\n#endif // QUICKIOS_H\n"
  },
  {
    "path": "src/qml/private/quickios/quickios.pri",
    "content": "# https://github.com/benlau/quickios/\n\nQT += gui-private\nCONFIG += no_app_extension_api_only\n\nHEADERS += \\\n    $$PWD/quickios.h \\\n    $$PWD/qiviewdelegate.h \\\n    $$PWD/qidevice.h \\\n    $$PWD/qiimagepicker.h \\\n    $$PWD/qisystemdispatcher.h\n\nSOURCES += \\\n    $$PWD/quickios.cpp \\\n    $$PWD/qidevice.cpp \\\n    $$PWD/qiimagepicker.cpp \\\n    $$PWD/qisystemdispatcher.cpp\n\n\nQMAKE_CXXFLAGS += -fobjc-arc\n\nOBJECTIVE_SOURCES += \\\n    $$PWD/qisystemutils.mm \\\n    $$PWD/qiviewdelegate.mm \\\n    $$PWD/qidevice.mm\n\n"
  },
  {
    "path": "src/qml/qml.pri",
    "content": "INCLUDEPATH += $$PWD $$PWD/../core $$PWD/../gui $$PWD/../network $$PWD/../widgets\nDEPENDPATH += $$PWD\n\nQT += core gui network qml quick\nQT += widgets\n\nHEADERS += \\\n    $$PWD/asemanapplicationitem.h \\\n    $$PWD/asemanbackhandler.h \\\n    $$PWD/asemandragarea.h \\\n    $$PWD/asemandragobject.h \\\n    $$PWD/asemanitemgrabber.h \\\n    $$PWD/asemanmouseeventlistener.h \\\n    $$PWD/asemanqmlengine.h \\\n    $$PWD/asemanqmlimage.h \\\n    $$PWD/asemanqttools.h \\\n    $$PWD/asemanquickobject.h \\\n    $$PWD/asemanquickview.h \\\n    $$PWD/asemanquickviewwrapper.h \\\n    $$PWD/qtsingleapplication/qtlocalpeer.h \\\n    $$PWD/qtsingleapplication/qtlockedfile.h \\\n    $$PWD/asemantools_global.h \\\n    $$PWD/asemandevicesitem.h \\\n    $$PWD/asemantoolsitem.h \\\n    $$PWD/asemanfileresourcemanager.h \\\n    $$PWD/asemanproxycomponent.h  \\\n    $$PWD/asemanapplicationsingleton.h\n\nSOURCES += \\\n    $$PWD/asemanapplicationitem.cpp \\\n    $$PWD/asemanbackhandler.cpp \\\n    $$PWD/asemandragarea.cpp \\\n    $$PWD/asemandragobject.cpp \\\n    $$PWD/asemanitemgrabber.cpp \\\n    $$PWD/asemanmouseeventlistener.cpp \\\n    $$PWD/asemanqmlengine.cpp \\\n    $$PWD/asemanqmlimage.cpp \\\n    $$PWD/asemanqttools.cpp \\\n    $$PWD/asemanquickobject.cpp \\\n    $$PWD/asemanquickview.cpp \\\n    $$PWD/asemanquickviewwrapper.cpp \\\n    $$PWD/qtsingleapplication/qtlocalpeer.cpp \\\n    $$PWD/qtsingleapplication/qtlockedfile_unix.cpp \\\n    $$PWD/qtsingleapplication/qtlockedfile_win.cpp \\\n    $$PWD/qtsingleapplication/qtlockedfile.cpp \\\n    $$PWD/asemandevicesitem.cpp \\\n    $$PWD/asemantoolsitem.cpp \\\n    $$PWD/asemanfileresourcemanager.cpp \\\n    $$PWD/asemanproxycomponent.cpp \\\n    $$PWD/asemanapplicationsingleton.cpp\n\nandroid {\n    lessThan(QT_MAJOR_VERSION, 6) QT += androidextras\n}\nwin {\n    QT += winextras\n}\nmacx {\n    !contains(QMAKE_HOST.arch, x86_64) {\n        LIBS +=  -framework CoreFoundation -framework Carbon -lobjc\n    }\n    lessThan(QT_MAJOR_VERSION, 6) QT += macextras\n}\nios {\n    include(private/quickios/quickios.pri)\n} else {\n    !wasm {\n        HEADERS += \\\n            $$PWD/asemanprocess.h\n        SOURCES += \\\n            $$PWD/asemanprocess.cpp\n    }\n}\n\nDISTFILES +=\n"
  },
  {
    "path": "src/qml/qml.pro",
    "content": "ios {\n    CONFIG += no_app_extension_api_only\n}\n\nload(qt_build_config)\n\nTARGET = QAsemanQml\nQT += asemancore asemangui asemanwidgets asemannetwork\n\nMODULE = asemanqml\n\nload(qt_module)\n\nDEFINES += LIBQTASEMAN_QML_LIBRARY\n\ninclude (qml.pri)\n"
  },
  {
    "path": "src/qml/qtsingleapplication/qtlocalpeer.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/****************************************************************************\n**\n** This file is part of a Qt Solutions component.\n** \n** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\n** \n** Contact:  Qt Software Information (qt-info@nokia.com)\n** \n** Commercial Usage  \n** Licensees holding valid Qt Commercial licenses may use this file in\n** accordance with the Qt Solutions Commercial License Agreement provided\n** with the Software or, alternatively, in accordance with the terms\n** contained in a written agreement between you and Nokia.\n** \n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU Lesser General Public License version 2.1 requirements\n** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n** \n** In addition, as a special exception, Nokia gives you certain\n** additional rights. These rights are described in the Nokia Qt LGPL\n** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this\n** package.\n** \n** GNU General Public License Usage \n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 3.0 as published by the Free Software\n** Foundation and appearing in the file LICENSE.GPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU General Public License version 3.0 requirements will be\n** met: http://www.gnu.org/copyleft/gpl.html.\n** \n** Please note Third Party Software included with Qt Solutions may impose\n** additional restrictions and it is the user's responsibility to ensure\n** that they have met the licensing requirements of the GPL, LGPL, or Qt\n** Solutions Commercial license and the relevant license of the Third\n** Party Software they are using.\n** \n** If you are unsure which license is appropriate for your use, please\n** contact the sales department at qt-sales@nokia.com.\n** \n****************************************************************************/\n\n\n#include \"qtlocalpeer.h\"\n#include <QtCore/QCoreApplication>\n#include <QtCore/QTime>\n#include <QDataStream>\n#include <QRegularExpression>\n\n#if defined(Q_OS_WIN)\n#include <QtCore/QLibrary>\n#include <QtCore/qt_windows.h>\ntypedef BOOL(WINAPI*PProcessIdToSessionId)(DWORD,DWORD*);\nstatic PProcessIdToSessionId pProcessIdToSessionId = 0;\n#endif\n#if defined(Q_OS_UNIX)\n#include <time.h>\n#endif\n\nnamespace QtLP_Private {\n#include \"qtlockedfile.cpp\"\n#if defined(Q_OS_WIN)\n#include \"qtlockedfile_win.cpp\"\n#else\n#include \"qtlockedfile_unix.cpp\"\n#endif\n}\n\nconst char* QtLocalPeer::ack = \"ack\";\n\nQtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId)\n    : QObject(parent), id(appId)\n{\n    QString prefix = id;\n    if (id.isEmpty()) {\n        id = QCoreApplication::applicationFilePath();\n#if defined(Q_OS_WIN)\n        id = id.toLower();\n#endif\n        prefix = id.section(QLatin1Char('/'), -1);\n    }\n    prefix.remove(QRegularExpression(QStringLiteral(\"[^a-zA-Z]\")));\n    prefix.truncate(6);\n\n    QByteArray idc = id.toUtf8();\n    quint16 idNum = qChecksum(idc.constData(), idc.size());\n    socketName = QLatin1String(\"qtsingleapp-\") + prefix\n                 + QLatin1Char('-') + QString::number(idNum, 16);\n\n#if defined(Q_OS_WIN)\n    if (!pProcessIdToSessionId) {\n        QLibrary lib(\"kernel32\");\n        pProcessIdToSessionId = (PProcessIdToSessionId)lib.resolve(\"ProcessIdToSessionId\");\n    }\n    if (pProcessIdToSessionId) {\n        DWORD sessionId = 0;\n        pProcessIdToSessionId(GetCurrentProcessId(), &sessionId);\n        socketName += QLatin1Char('-') + QString::number(sessionId, 16);\n    }\n#else\n//    socketName += QLatin1Char('-') + QString::number(::getuid(), 16);\n#endif\n\n    server = new QLocalServer(this);\n    QString lockName = QDir(QDir::tempPath()).absolutePath()\n                       + QLatin1Char('/') + socketName\n                       + QLatin1String(\"-lockfile\");\n    lockFile.setFileName(lockName);\n    lockFile.open(QIODevice::ReadWrite);\n}\n\n\n\nbool QtLocalPeer::isClient()\n{\n    if (lockFile.isLocked())\n        return false;\n\n    if (!lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false))\n        return true;\n\n    bool res = server->listen(socketName);\n#if defined(Q_OS_UNIX) && (QT_VERSION >= QT_VERSION_CHECK(4,5,0))\n    // ### Workaround\n    if (!res && server->serverError() == QAbstractSocket::AddressInUseError) {\n        QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName);\n        res = server->listen(socketName);\n    }\n#endif\n    if (!res)\n        qWarning(\"QtSingleCoreApplication: listen on local socket failed, %s\", qPrintable(server->errorString()));\n    QObject::connect(server, &QLocalServer::newConnection, this, &QtLocalPeer::receiveConnection);\n    return false;\n}\n\n\nbool QtLocalPeer::sendMessage(const QString &message, int timeout)\n{\n    if (!isClient())\n        return false;\n\n    QLocalSocket socket;\n    bool connOk = false;\n    for(int i = 0; i < 2; i++) {\n        // Try twice, in case the other instance is just starting up\n        socket.connectToServer(socketName);\n        connOk = socket.waitForConnected(timeout/2);\n        if (connOk || i)\n            break;\n        int ms = 250;\n#if defined(Q_OS_WIN)\n        Sleep(DWORD(ms));\n#else\n        struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 };\n        nanosleep(&ts, NULL);\n#endif\n    }\n    if (!connOk)\n        return false;\n\n    QByteArray uMsg(message.toUtf8());\n    QDataStream ds(&socket);\n    ds.writeBytes(uMsg.constData(), uMsg.size());\n    bool res = socket.waitForBytesWritten(timeout);\n    res &= socket.waitForReadyRead(timeout);   // wait for ack\n    res &= (socket.read(qstrlen(ack)) == ack);\n    return res;\n}\n\n\nvoid QtLocalPeer::receiveConnection()\n{\n    QLocalSocket* socket = server->nextPendingConnection();\n    if (!socket)\n        return;\n\n    while (socket->bytesAvailable() < (int)sizeof(quint32))\n        socket->waitForReadyRead();\n    QDataStream ds(socket);\n    QByteArray uMsg;\n    quint32 remaining;\n    ds >> remaining;\n    uMsg.resize(remaining);\n    int got = 0;\n    char* uMsgBuf = uMsg.data();\n    do {\n        got = ds.readRawData(uMsgBuf, remaining);\n        remaining -= got;\n        uMsgBuf += got;\n    } while (remaining && got >= 0 && socket->waitForReadyRead(2000));\n    if (got < 0) {\n        qWarning() << \"QtLocalPeer: Message reception failed\" << socket->errorString();\n        delete socket;\n        return;\n    }\n    QString message(QString::fromUtf8(uMsg));\n    socket->write(ack, qstrlen(ack));\n    socket->waitForBytesWritten(1000);\n    delete socket;\n    Q_EMIT messageReceived(message); //### (might take a long time to return)\n}\n"
  },
  {
    "path": "src/qml/qtsingleapplication/qtlocalpeer.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/****************************************************************************\n**\n** This file is part of a Qt Solutions component.\n** \n** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\n** \n** Contact:  Qt Software Information (qt-info@nokia.com)\n** \n** Commercial Usage  \n** Licensees holding valid Qt Commercial licenses may use this file in\n** accordance with the Qt Solutions Commercial License Agreement provided\n** with the Software or, alternatively, in accordance with the terms\n** contained in a written agreement between you and Nokia.\n** \n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU Lesser General Public License version 2.1 requirements\n** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n** \n** In addition, as a special exception, Nokia gives you certain\n** additional rights. These rights are described in the Nokia Qt LGPL\n** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this\n** package.\n** \n** GNU General Public License Usage \n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 3.0 as published by the Free Software\n** Foundation and appearing in the file LICENSE.GPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU General Public License version 3.0 requirements will be\n** met: http://www.gnu.org/copyleft/gpl.html.\n** \n** Please note Third Party Software included with Qt Solutions may impose\n** additional restrictions and it is the user's responsibility to ensure\n** that they have met the licensing requirements of the GPL, LGPL, or Qt\n** Solutions Commercial license and the relevant license of the Third\n** Party Software they are using.\n** \n** If you are unsure which license is appropriate for your use, please\n** contact the sales department at qt-sales@nokia.com.\n** \n****************************************************************************/\n\n\n#include <QtNetwork/QLocalServer>\n#include <QtNetwork/QLocalSocket>\n#include <QtCore/QDir>\n\nnamespace QtLP_Private {\n#include \"qtlockedfile.h\"\n}\n\nclass QtLocalPeer : public QObject\n{\n    Q_OBJECT\n\npublic:\n    QtLocalPeer(QObject *parent = Q_NULLPTR, const QString &appId = QString());\n    bool isClient();\n    bool sendMessage(const QString &message, int timeout);\n    QString applicationId() const\n        { return id; }\n\nQ_SIGNALS:\n    void messageReceived(const QString &message);\n\nprotected Q_SLOTS:\n    void receiveConnection();\n\nprotected:\n    QString id;\n    QString socketName;\n    QLocalServer* server;\n    QtLP_Private::QtLockedFile lockFile;\n\nprivate:\n    static const char* ack;\n};\n"
  },
  {
    "path": "src/qml/qtsingleapplication/qtlockedfile.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/****************************************************************************\n**\n** This file is part of a Qt Solutions component.\n** \n** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\n** \n** Contact:  Qt Software Information (qt-info@nokia.com)\n** \n** Commercial Usage  \n** Licensees holding valid Qt Commercial licenses may use this file in\n** accordance with the Qt Solutions Commercial License Agreement provided\n** with the Software or, alternatively, in accordance with the terms\n** contained in a written agreement between you and Nokia.\n** \n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU Lesser General Public License version 2.1 requirements\n** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n** \n** In addition, as a special exception, Nokia gives you certain\n** additional rights. These rights are described in the Nokia Qt LGPL\n** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this\n** package.\n** \n** GNU General Public License Usage \n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 3.0 as published by the Free Software\n** Foundation and appearing in the file LICENSE.GPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU General Public License version 3.0 requirements will be\n** met: http://www.gnu.org/copyleft/gpl.html.\n** \n** Please note Third Party Software included with Qt Solutions may impose\n** additional restrictions and it is the user's responsibility to ensure\n** that they have met the licensing requirements of the GPL, LGPL, or Qt\n** Solutions Commercial license and the relevant license of the Third\n** Party Software they are using.\n** \n** If you are unsure which license is appropriate for your use, please\n** contact the sales department at qt-sales@nokia.com.\n** \n****************************************************************************/\n\n#include \"qtlockedfile.h\"\n\n/*!\n    \\class QtLockedFile\n\n    \\brief The QtLockedFile class extends QFile with advisory locking\n    functions.\n\n    A file may be locked in read or write mode. Multiple instances of\n    \\e QtLockedFile, created in multiple processes running on the same\n    machine, may have a file locked in read mode. Exactly one instance\n    may have it locked in write mode. A read and a write lock cannot\n    exist simultaneously on the same file.\n\n    The file locks are advisory. This means that nothing prevents\n    another process from manipulating a locked file using QFile or\n    file system functions offered by the OS. Serialization is only\n    guaranteed if all processes that access the file use\n    QLockedFile. Also, while holding a lock on a file, a process\n    must not open the same file again (through any API), or locks\n    can be unexpectedly lost.\n\n    The lock provided by an instance of \\e QtLockedFile is released\n    whenever the program terminates. This is true even when the\n    program crashes and no destructors are called.\n*/\n\n/*! \\enum QtLockedFile::LockMode\n\n    This enum describes the available lock modes.\n\n    \\value ReadLock A read lock.\n    \\value WriteLock A write lock.\n    \\value NoLock Neither a read lock nor a write lock.\n*/\n\n/*!\n    Constructs an unlocked \\e QtLockedFile object. This constructor\n    behaves in the same way as \\e QFile::QFile().\n\n    \\sa QFile::QFile()\n*/\nQtLockedFile::QtLockedFile()\n    : QFile()\n{\n#ifdef Q_OS_WIN\n    wmutex = 0;\n    rmutex = 0;\n#endif\n    m_lock_mode = NoLock;\n}\n\n/*!\n    Constructs an unlocked QtLockedFile object with file \\a name. This\n    constructor behaves in the same way as \\e QFile::QFile(const\n    QString&).\n\n    \\sa QFile::QFile()\n*/\nQtLockedFile::QtLockedFile(const QString &name)\n    : QFile(name)\n{\n#ifdef Q_OS_WIN\n    wmutex = 0;\n    rmutex = 0;\n#endif\n    m_lock_mode = NoLock;\n}\n\n/*!\n  Opens the file in OpenMode \\a mode.\n\n  This is identical to QFile::open(), with the one exception that the\n  Truncate mode flag is disallowed. Truncation would conflict with the\n  advisory file locking, since the file would be modified before the\n  write lock is obtained. If truncation is required, use resize(0)\n  after obtaining the write lock.\n\n  Returns true if successful; otherwise false.\n\n  \\sa QFile::open(), QFile::resize()\n*/\nbool QtLockedFile::open(OpenMode mode)\n{\n    if (mode & QIODevice::Truncate) {\n        qWarning(\"QtLockedFile::open(): Truncate mode not allowed.\");\n        return false;\n    }\n    return QFile::open(mode);\n}\n\n/*!\n    Returns \\e true if this object has a in read or write lock;\n    otherwise returns \\e false.\n\n    \\sa lockMode()\n*/\nbool QtLockedFile::isLocked() const\n{\n    return m_lock_mode != NoLock;\n}\n\n/*!\n    Returns the type of lock currently held by this object, or \\e\n    QtLockedFile::NoLock.\n\n    \\sa isLocked()\n*/\nQtLockedFile::LockMode QtLockedFile::lockMode() const\n{\n    return m_lock_mode;\n}\n\n/*!\n    \\fn bool QtLockedFile::lock(LockMode mode, bool block = true)\n\n    Obtains a lock of type \\a mode. The file must be opened before it\n    can be locked.\n\n    If \\a block is true, this function will block until the lock is\n    aquired. If \\a block is false, this function returns \\e false\n    immediately if the lock cannot be aquired.\n\n    If this object already has a lock of type \\a mode, this function\n    returns \\e true immediately. If this object has a lock of a\n    different type than \\a mode, the lock is first released and then a\n    new lock is obtained.\n\n    This function returns \\e true if, after it executes, the file is\n    locked by this object, and \\e false otherwise.\n\n    \\sa unlock(), isLocked(), lockMode()\n*/\n\n/*!\n    \\fn bool QtLockedFile::unlock()\n\n    Releases a lock.\n\n    If the object has no lock, this function returns immediately.\n\n    This function returns \\e true if, after it executes, the file is\n    not locked by this object, and \\e false otherwise.\n\n    \\sa lock(), isLocked(), lockMode()\n*/\n\n/*!\n    \\fn QtLockedFile::~QtLockedFile()\n\n    Destroys the \\e QtLockedFile object. If any locks were held, they\n    are released.\n*/\n"
  },
  {
    "path": "src/qml/qtsingleapplication/qtlockedfile.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/****************************************************************************\n**\n** This file is part of a Qt Solutions component.\n** \n** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\n** \n** Contact:  Qt Software Information (qt-info@nokia.com)\n** \n** Commercial Usage  \n** Licensees holding valid Qt Commercial licenses may use this file in\n** accordance with the Qt Solutions Commercial License Agreement provided\n** with the Software or, alternatively, in accordance with the terms\n** contained in a written agreement between you and Nokia.\n** \n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU Lesser General Public License version 2.1 requirements\n** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n** \n** In addition, as a special exception, Nokia gives you certain\n** additional rights. These rights are described in the Nokia Qt LGPL\n** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this\n** package.\n** \n** GNU General Public License Usage \n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 3.0 as published by the Free Software\n** Foundation and appearing in the file LICENSE.GPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU General Public License version 3.0 requirements will be\n** met: http://www.gnu.org/copyleft/gpl.html.\n** \n** Please note Third Party Software included with Qt Solutions may impose\n** additional restrictions and it is the user's responsibility to ensure\n** that they have met the licensing requirements of the GPL, LGPL, or Qt\n** Solutions Commercial license and the relevant license of the Third\n** Party Software they are using.\n** \n** If you are unsure which license is appropriate for your use, please\n** contact the sales department at qt-sales@nokia.com.\n** \n****************************************************************************/\n\n#ifndef QTLOCKEDFILE_H\n#define QTLOCKEDFILE_H\n\n#include <QtCore/QFile>\n#ifdef Q_OS_WIN\n#include <QtCore/QVector>\n#endif\n\n#if defined(Q_WS_WIN)\n#  if !defined(QT_QTLOCKEDFILE_EXPORT) && !defined(QT_QTLOCKEDFILE_IMPORT)\n#    define QT_QTLOCKEDFILE_EXPORT\n#  elif defined(QT_QTLOCKEDFILE_IMPORT)\n#    if defined(QT_QTLOCKEDFILE_EXPORT)\n#      undef QT_QTLOCKEDFILE_EXPORT\n#    endif\n#    define QT_QTLOCKEDFILE_EXPORT __declspec(dllimport)\n#  elif defined(QT_QTLOCKEDFILE_EXPORT)\n#    undef QT_QTLOCKEDFILE_EXPORT\n#    define QT_QTLOCKEDFILE_EXPORT __declspec(dllexport)\n#  endif\n#else\n#  define QT_QTLOCKEDFILE_EXPORT\n#endif\n\nclass QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile\n{\npublic:\n    enum LockMode { NoLock = 0, ReadLock, WriteLock };\n\n    QtLockedFile();\n    QtLockedFile(const QString &name);\n    virtual ~QtLockedFile();\n\n    bool open(OpenMode mode) Q_DECL_OVERRIDE;\n\n    bool lock(LockMode mode, bool block = true);\n    bool unlock();\n    bool isLocked() const;\n    LockMode lockMode() const;\n\nprivate:\n#ifdef Q_OS_WIN\n    Qt::HANDLE wmutex;\n    Qt::HANDLE rmutex;\n    QVector<Qt::HANDLE> rmutexes;\n    QString mutexname;\n\n    Qt::HANDLE getMutexHandle(int idx, bool doCreate);\n    bool waitMutex(Qt::HANDLE mutex, bool doBlock);\n\n#endif\n    LockMode m_lock_mode;\n};\n\n#endif\n"
  },
  {
    "path": "src/qml/qtsingleapplication/qtlockedfile_unix.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/****************************************************************************\n**\n** This file is part of a Qt Solutions component.\n** \n** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\n** \n** Contact:  Qt Software Information (qt-info@nokia.com)\n** \n** Commercial Usage  \n** Licensees holding valid Qt Commercial licenses may use this file in\n** accordance with the Qt Solutions Commercial License Agreement provided\n** with the Software or, alternatively, in accordance with the terms\n** contained in a written agreement between you and Nokia.\n** \n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU Lesser General Public License version 2.1 requirements\n** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n** \n** In addition, as a special exception, Nokia gives you certain\n** additional rights. These rights are described in the Nokia Qt LGPL\n** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this\n** package.\n** \n** GNU General Public License Usage \n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 3.0 as published by the Free Software\n** Foundation and appearing in the file LICENSE.GPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU General Public License version 3.0 requirements will be\n** met: http://www.gnu.org/copyleft/gpl.html.\n** \n** Please note Third Party Software included with Qt Solutions may impose\n** additional restrictions and it is the user's responsibility to ensure\n** that they have met the licensing requirements of the GPL, LGPL, or Qt\n** Solutions Commercial license and the relevant license of the Third\n** Party Software they are using.\n** \n** If you are unsure which license is appropriate for your use, please\n** contact the sales department at qt-sales@nokia.com.\n** \n****************************************************************************/\n\n#include <string.h>\n#include <errno.h>\n#include <unistd.h>\n#include <fcntl.h>\n\n#include \"qtlockedfile.h\"\n\nbool QtLockedFile::lock(LockMode mode, bool block)\n{\n    if (!isOpen()) {\n        qWarning(\"QtLockedFile::lock(): file is not opened\");\n        return false;\n    }\n \n    if (mode == NoLock)\n        return unlock();\n           \n    if (mode == m_lock_mode)\n        return true;\n\n    if (m_lock_mode != NoLock)\n        unlock();\n\n    struct flock fl;\n    fl.l_whence = SEEK_SET;\n    fl.l_start = 0;\n    fl.l_len = 0;\n    fl.l_type = (mode == ReadLock) ? F_RDLCK : F_WRLCK;\n    int cmd = block ? F_SETLKW : F_SETLK;\n    int ret = fcntl(handle(), cmd, &fl);\n    \n    if (ret == -1) {\n        if (errno != EINTR && errno != EAGAIN)\n            qWarning(\"QtLockedFile::lock(): fcntl: %s\", strerror(errno));\n        return false;\n    }\n\n    \n    m_lock_mode = mode;\n    return true;\n}\n\n\nbool QtLockedFile::unlock()\n{\n    if (!isOpen()) {\n        qWarning(\"QtLockedFile::unlock(): file is not opened\");\n        return false;\n    }\n\n    if (!isLocked())\n        return true;\n\n    struct flock fl;\n    fl.l_whence = SEEK_SET;\n    fl.l_start = 0;\n    fl.l_len = 0;\n    fl.l_type = F_UNLCK;\n    int ret = fcntl(handle(), F_SETLKW, &fl);\n    \n    if (ret == -1) {\n        qWarning(\"QtLockedFile::lock(): fcntl: %s\", strerror(errno));\n        return false;\n    }\n    \n    m_lock_mode = NoLock;\n    return true;\n}\n\nQtLockedFile::~QtLockedFile()\n{\n    if (isOpen())\n        unlock();\n}\n"
  },
  {
    "path": "src/qml/qtsingleapplication/qtlockedfile_win.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/****************************************************************************\n**\n** This file is part of a Qt Solutions component.\n** \n** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\n** \n** Contact:  Qt Software Information (qt-info@nokia.com)\n** \n** Commercial Usage  \n** Licensees holding valid Qt Commercial licenses may use this file in\n** accordance with the Qt Solutions Commercial License Agreement provided\n** with the Software or, alternatively, in accordance with the terms\n** contained in a written agreement between you and Nokia.\n** \n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU Lesser General Public License version 2.1 requirements\n** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n** \n** In addition, as a special exception, Nokia gives you certain\n** additional rights. These rights are described in the Nokia Qt LGPL\n** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this\n** package.\n** \n** GNU General Public License Usage \n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 3.0 as published by the Free Software\n** Foundation and appearing in the file LICENSE.GPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU General Public License version 3.0 requirements will be\n** met: http://www.gnu.org/copyleft/gpl.html.\n** \n** Please note Third Party Software included with Qt Solutions may impose\n** additional restrictions and it is the user's responsibility to ensure\n** that they have met the licensing requirements of the GPL, LGPL, or Qt\n** Solutions Commercial license and the relevant license of the Third\n** Party Software they are using.\n** \n** If you are unsure which license is appropriate for your use, please\n** contact the sales department at qt-sales@nokia.com.\n** \n****************************************************************************/\n\n#include \"qtlockedfile.h\"\n#include <qt_windows.h>\n#include <QtCore/QFileInfo>\n\n#define MUTEX_PREFIX \"QtLockedFile mutex \"\n// Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS\n#define MAX_READERS MAXIMUM_WAIT_OBJECTS\n\nQt::HANDLE QtLockedFile::getMutexHandle(int idx, bool doCreate)\n{\n    if (mutexname.isEmpty()) {\n        QFileInfo fi(*this);\n        mutexname = QString::fromLatin1(MUTEX_PREFIX)\n                    + fi.absoluteFilePath().toLower();\n    }\n    QString mname(mutexname);\n    if (idx >= 0)\n        mname += QString::number(idx);\n\n    Qt::HANDLE mutex;\n    if (doCreate) {\n        mutex = CreateMutexW(NULL, FALSE, (TCHAR*)mname.utf16());\n        if (!mutex) {\n            qErrnoWarning(\"QtLockedFile::lock(): CreateMutex failed\");\n            return 0;\n        }\n    }\n    else {\n        mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (TCHAR*)mname.utf16());\n        if (!mutex) {\n            if (GetLastError() != ERROR_FILE_NOT_FOUND)\n                qErrnoWarning(\"QtLockedFile::lock(): OpenMutex failed\");\n            return 0;\n        }\n    }\n    return mutex;\n}\n\nbool QtLockedFile::waitMutex(Qt::HANDLE mutex, bool doBlock)\n{\n    Q_ASSERT(mutex);\n    DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0);\n    switch (res) {\n    case WAIT_OBJECT_0:\n    case WAIT_ABANDONED:\n        return true;\n        break;\n    case WAIT_TIMEOUT:\n        break;\n    default:\n        qErrnoWarning(\"QtLockedFile::lock(): WaitForSingleObject failed\");\n    }\n    return false;\n}\n\n\n\nbool QtLockedFile::lock(LockMode mode, bool block)\n{\n    if (!isOpen()) {\n        qWarning(\"QtLockedFile::lock(): file is not opened\");\n        return false;\n    }\n\n    if (mode == NoLock)\n        return unlock();\n\n    if (mode == m_lock_mode)\n        return true;\n\n    if (m_lock_mode != NoLock)\n        unlock();\n\n    if (!wmutex && !(wmutex = getMutexHandle(-1, true)))\n        return false;\n\n    if (!waitMutex(wmutex, block))\n        return false;\n\n    if (mode == ReadLock) {\n        int idx = 0;\n        for (; idx < MAX_READERS; idx++) {\n            rmutex = getMutexHandle(idx, false);\n            if (!rmutex || waitMutex(rmutex, false))\n                break;\n            CloseHandle(rmutex);\n        }\n        bool ok = true;\n        if (idx >= MAX_READERS) {\n            qWarning(\"QtLockedFile::lock(): too many readers\");\n            rmutex = 0;\n            ok = false;\n        }\n        else if (!rmutex) {\n            rmutex = getMutexHandle(idx, true);\n            if (!rmutex || !waitMutex(rmutex, false))\n                ok = false;\n        }\n        if (!ok && rmutex) {\n            CloseHandle(rmutex);\n            rmutex = 0;\n        }\n        ReleaseMutex(wmutex);\n        if (!ok)\n            return false;\n    }\n    else {\n        Q_ASSERT(rmutexes.isEmpty());\n        for (int i = 0; i < MAX_READERS; i++) {\n            Qt::HANDLE mutex = getMutexHandle(i, false);\n            if (mutex)\n                rmutexes.append(mutex);\n        }\n        if (rmutexes.size()) {\n            DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(),\n                                               TRUE, block ? INFINITE : 0);\n            if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) {\n                if (res != WAIT_TIMEOUT)\n                    qErrnoWarning(\"QtLockedFile::lock(): WaitForMultipleObjects failed\");\n                m_lock_mode = WriteLock;  // trick unlock() to clean up - semiyucky\n                unlock();\n                return false;\n            }\n        }\n    }\n\n    m_lock_mode = mode;\n    return true;\n}\n\nbool QtLockedFile::unlock()\n{\n    if (!isOpen()) {\n        qWarning(\"QtLockedFile::unlock(): file is not opened\");\n        return false;\n    }\n\n    if (!isLocked())\n        return true;\n\n    if (m_lock_mode == ReadLock) {\n        ReleaseMutex(rmutex);\n        CloseHandle(rmutex);\n        rmutex = 0;\n    }\n    else {\n        for(Qt::HANDLE mutex: rmutexes) {\n            ReleaseMutex(mutex);\n            CloseHandle(mutex);\n        }\n        rmutexes.clear();\n        ReleaseMutex(wmutex);\n    }\n\n    m_lock_mode = QtLockedFile::NoLock;\n    return true;\n}\n\nQtLockedFile::~QtLockedFile()\n{\n    if (isOpen())\n        unlock();\n    if (wmutex)\n        CloseHandle(wmutex);\n}\n"
  },
  {
    "path": "src/qml/qtsingleapplication/qtsingleapplication.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/****************************************************************************\n**\n** This file is part of a Qt Solutions component.\n** \n** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\n** \n** Contact:  Qt Software Information (qt-info@nokia.com)\n** \n** Commercial Usage  \n** Licensees holding valid Qt Commercial licenses may use this file in\n** accordance with the Qt Solutions Commercial License Agreement provided\n** with the Software or, alternatively, in accordance with the terms\n** contained in a written agreement between you and Nokia.\n** \n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU Lesser General Public License version 2.1 requirements\n** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n** \n** In addition, as a special exception, Nokia gives you certain\n** additional rights. These rights are described in the Nokia Qt LGPL\n** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this\n** package.\n** \n** GNU General Public License Usage \n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 3.0 as published by the Free Software\n** Foundation and appearing in the file LICENSE.GPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU General Public License version 3.0 requirements will be\n** met: http://www.gnu.org/copyleft/gpl.html.\n** \n** Please note Third Party Software included with Qt Solutions may impose\n** additional restrictions and it is the user's responsibility to ensure\n** that they have met the licensing requirements of the GPL, LGPL, or Qt\n** Solutions Commercial license and the relevant license of the Third\n** Party Software they are using.\n** \n** If you are unsure which license is appropriate for your use, please\n** contact the sales department at qt-sales@nokia.com.\n** \n****************************************************************************/\n\n\n#include \"qtsingleapplication.h\"\n#include \"qtlocalpeer.h\"\n#include <QWidget>\n\n\n/*!\n    \\class QtSingleApplication qtsingleapplication.h\n    \\brief The QtSingleApplication class provides an API to detect and\n    communicate with running instances of an application.\n\n    This class allows you to create applications where only one\n    instance should be running at a time. I.e., if the user tries to\n    launch another instance, the already running instance will be\n    activated instead. Another usecase is a client-server system,\n    where the first started instance will assume the role of server,\n    and the later instances will act as clients of that server.\n\n    By default, the full path of the executable file is used to\n    determine whether two processes are instances of the same\n    application. You can also provide an explicit identifier string\n    that will be compared instead.\n\n    The application should create the QtSingleApplication object early\n    in the startup phase, and call isRunning() or sendMessage() to\n    find out if another instance of this application is already\n    running. Startup parameters (e.g. the name of the file the user\n    wanted this new instance to open) can be passed to the running\n    instance in the sendMessage() function.\n\n    If isRunning() or sendMessage() returns false, it means that no\n    other instance is running, and this instance has assumed the role\n    as the running instance. The application should continue with the\n    initialization of the application user interface before entering\n    the event loop with exec(), as normal. The messageReceived()\n    signal will be emitted when the application receives messages from\n    another instance of the same application.\n\n    If isRunning() or sendMessage() returns true, another instance is\n    already running, and the application should terminate or enter\n    client mode.\n\n    If a message is received it might be helpful to the user to raise\n    the application so that it becomes visible. To facilitate this,\n    QtSingleApplication provides the setActivationWindow() function\n    and the activateWindow() slot.\n\n    Here's an example that shows how to convert an existing\n    application to use QtSingleApplication. It is very simple and does\n    not make use of all QtSingleApplication's functionality (see the\n    examples for that).\n\n    \\code\n    // Original\n    int main(int argc, char **argv)\n    {\n        QApplication app(argc, argv);\n\n        MyMainWidget mmw;\n\n        mmw.show();\n        return app.exec();\n    }\n\n    // Single instance\n    int main(int argc, char **argv)\n    {\n        QtSingleApplication app(argc, argv);\n\n        if (app.isRunning())\n            return 0;\n\n        MyMainWidget mmw;\n\n        app.setActivationWindow(&mmw);\n\n        mmw.show();\n        return app.exec();\n    }\n    \\endcode\n\n    Once this QtSingleApplication instance is destroyed(for example,\n    when the user quits), when the user next attempts to run the\n    application this instance will not, of course, be encountered. The\n    next instance to call isRunning() or sendMessage() will assume the\n    role as the new running instance.\n\n    For console (non-GUI) applications, QtSingleCoreApplication may be\n    used instead of this class, to avoid the dependency on the QtGui\n    library.\n\n    \\sa QtSingleCoreApplication\n*/\n\n\nvoid QtSingleApplication::sysInit(const QString &appId)\n{\n    actWin = 0;\n    peer = new QtLocalPeer(this, appId);\n    connect(peer, &QtLocalPeer::messageReceived, this, &QtSingleApplication::messageReceived);\n}\n\n\n/*!\n    Creates a QtSingleApplication object. The application identifier\n    will be QCoreApplication::applicationFilePath(). \\a argc, \\a\n    argv, and \\a GUIenabled are passed on to the QAppliation constructor.\n\n    If you are creating a console application (i.e. setting \\a\n    GUIenabled to false), you may consider using\n    QtSingleCoreApplication instead.\n*/\n\nQtSingleApplication::QtSingleApplication(int &argc, char **argv, bool GUIenabled)\n    : QApplication(argc, argv, GUIenabled)\n{\n    sysInit();\n}\n\n\n/*!\n    Creates a QtSingleApplication object with the application\n    identifier \\a appId. \\a argc and \\a argv are passed on to the\n    QAppliation constructor.\n*/\n\nQtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char **argv)\n    : QApplication(argc, argv)\n{\n    sysInit(appId);\n}\n\n\n/*!\n    Creates a QtSingleApplication object. The application identifier\n    will be QCoreApplication::applicationFilePath(). \\a argc, \\a\n    argv, and \\a type are passed on to the QAppliation constructor.\n*/\n//QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type)\n//    : QApplication(argc, argv, type)\n//{\n//    sysInit();\n//}\n\n\n#if defined(Q_WS_X11)\n/*!\n  Special constructor for X11, ref. the documentation of\n  QApplication's corresponding constructor. The application identifier\n  will be QCoreApplication::applicationFilePath(). \\a dpy, \\a visual,\n  and \\a cmap are passed on to the QApplication constructor.\n*/\nQtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HANDLE cmap)\n    : QApplication(dpy, visual, cmap)\n{\n    sysInit();\n}\n\n/*!\n  Special constructor for X11, ref. the documentation of\n  QApplication's corresponding constructor. The application identifier\n  will be QCoreApplication::applicationFilePath(). \\a dpy, \\a argc, \\a\n  argv, \\a visual, and \\a cmap are passed on to the QApplication\n  constructor.\n*/\nQtSingleApplication::QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap)\n    : QApplication(dpy, argc, argv, visual, cmap)\n{\n    sysInit();\n}\n\n/*!\n  Special constructor for X11, ref. the documentation of\n  QApplication's corresponding constructor. The application identifier\n  will be \\a appId. \\a dpy, \\a argc, \\a\n  argv, \\a visual, and \\a cmap are passed on to the QApplication\n  constructor.\n*/\nQtSingleApplication::QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap)\n    : QApplication(dpy, argc, argv, visual, cmap)\n{\n    sysInit(appId);\n}\n#endif\n\n\n/*!\n    Returns true if another instance of this application is running;\n    otherwise false.\n\n    This function does not find instances of this application that are\n    being run by a different user (on Windows: that are running in\n    another session).\n\n    \\sa sendMessage()\n*/\n\nbool QtSingleApplication::isRunning()\n{\n    return peer->isClient();\n}\n\n\n/*!\n    Tries to send the text \\a message to the currently running\n    instance. The QtSingleApplication object in the running instance\n    will Q_EMIT the messageReceived() signal when it receives the\n    message.\n\n    This function returns true if the message has been sent to, and\n    processed by, the current instance. If there is no instance\n    currently running, or if the running instance fails to process the\n    message within \\a timeout milliseconds, this function return false.\n\n    \\sa isRunning(), messageReceived()\n*/\nbool QtSingleApplication::sendMessage(const QString &message, int timeout)\n{\n    return peer->sendMessage(message, timeout);\n}\n\n\n/*!\n    Returns the application identifier. Two processes with the same\n    identifier will be regarded as instances of the same application.\n*/\nQString QtSingleApplication::id() const\n{\n    return peer->applicationId();\n}\n\n\n/*!\n  Sets the activation window of this application to \\a aw. The\n  activation window is the widget that will be activated by\n  activateWindow(). This is typically the application's main window.\n\n  If \\a activateOnMessage is true (the default), the window will be\n  activated automatically every time a message is received, just prior\n  to the messageReceived() signal being emitted.\n\n  \\sa activateWindow(), messageReceived()\n*/\n\nvoid QtSingleApplication::setActivationWindow(QWidget* aw, bool activateOnMessage)\n{\n    actWin = aw;\n    if (activateOnMessage)\n        connect(peer, &QtLocalPeer::messageReceived, this, &QtSingleApplication::activateWindow);\n    else\n        disconnect(peer, &QtLocalPeer::messageReceived, this, &QtSingleApplication::activateWindow);\n}\n\n\n/*!\n    Returns the applications activation window if one has been set by\n    calling setActivationWindow(), otherwise returns 0.\n\n    \\sa setActivationWindow()\n*/\nQWidget* QtSingleApplication::activationWindow() const\n{\n    return actWin;\n}\n\n\n/*!\n  De-minimizes, raises, and activates this application's activation window.\n  This function does nothing if no activation window has been set.\n\n  This is a convenience function to show the user that this\n  application instance has been activated when he has tried to start\n  another instance.\n\n  This function should typically be called in response to the\n  messageReceived() signal. By default, that will happen\n  automatically, if an activation window has been set.\n\n  \\sa setActivationWindow(), messageReceived(), initialize()\n*/\nvoid QtSingleApplication::activateWindow()\n{\n    if (actWin) {\n        actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized);\n        actWin->raise();\n        actWin->activateWindow();\n    }\n}\n\n\n/*!\n    \\fn void QtSingleApplication::messageReceived(const QString& message)\n\n    This signal is emitted when the current instance receives a \\a\n    message from another instance of this application.\n\n    \\sa sendMessage(), setActivationWindow(), activateWindow()\n*/\n\n\n/*!\n    \\fn void QtSingleApplication::initialize(bool dummy = true)\n\n    \\obsolete\n*/\n"
  },
  {
    "path": "src/qml/qtsingleapplication/qtsingleapplication.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/****************************************************************************\n**\n** This file is part of a Qt Solutions component.\n** \n** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\n** \n** Contact:  Qt Software Information (qt-info@nokia.com)\n** \n** Commercial Usage  \n** Licensees holding valid Qt Commercial licenses may use this file in\n** accordance with the Qt Solutions Commercial License Agreement provided\n** with the Software or, alternatively, in accordance with the terms\n** contained in a written agreement between you and Nokia.\n** \n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU Lesser General Public License version 2.1 requirements\n** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n** \n** In addition, as a special exception, Nokia gives you certain\n** additional rights. These rights are described in the Nokia Qt LGPL\n** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this\n** package.\n** \n** GNU General Public License Usage \n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 3.0 as published by the Free Software\n** Foundation and appearing in the file LICENSE.GPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU General Public License version 3.0 requirements will be\n** met: http://www.gnu.org/copyleft/gpl.html.\n** \n** Please note Third Party Software included with Qt Solutions may impose\n** additional restrictions and it is the user's responsibility to ensure\n** that they have met the licensing requirements of the GPL, LGPL, or Qt\n** Solutions Commercial license and the relevant license of the Third\n** Party Software they are using.\n** \n** If you are unsure which license is appropriate for your use, please\n** contact the sales department at qt-sales@nokia.com.\n** \n****************************************************************************/\n\n#ifndef QtSingleApplication_H\n#define QtSingleApplication_H\n\n#include <QApplication>\n\nclass QtLocalPeer;\n\n#if defined(Q_WS_WIN)\n#  if !defined(QT_QTSINGLEAPPLICATION_EXPORT) && !defined(QT_QTSINGLEAPPLICATION_IMPORT)\n#    define QT_QTSINGLEAPPLICATION_EXPORT\n#  elif defined(QT_QTSINGLEAPPLICATION_IMPORT)\n#    if defined(QT_QTSINGLEAPPLICATION_EXPORT)\n#      undef QT_QTSINGLEAPPLICATION_EXPORT\n#    endif\n#    define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllimport)\n#  elif defined(QT_QTSINGLEAPPLICATION_EXPORT)\n#    undef QT_QTSINGLEAPPLICATION_EXPORT\n#    define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllexport)\n#  endif\n#else\n#  define QT_QTSINGLEAPPLICATION_EXPORT\n#endif\n\nclass QT_QTSINGLEAPPLICATION_EXPORT QtSingleApplication : public QApplication\n{\n    Q_OBJECT\n\npublic:\n    QtSingleApplication(int &argc, char **argv, bool GUIenabled = true);\n    QtSingleApplication(const QString &id, int &argc, char **argv);\n//    QtSingleApplication(int &argc, char **argv, Type type);\n#if defined(Q_WS_X11)\n    QtSingleApplication(Display* dpy, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0);\n    QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap= 0);\n    QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0);\n#endif\n\n    bool isRunning();\n    QString id() const;\n\n    void setActivationWindow(QWidget* aw, bool activateOnMessage = true);\n    QWidget* activationWindow() const;\n\n    // Obsolete:\n    void initialize(bool dummy = true)\n        { isRunning(); Q_UNUSED(dummy) }\n\npublic Q_SLOTS:\n    bool sendMessage(const QString &message, int timeout = 5000);\n    void activateWindow();\n\n\nQ_SIGNALS:\n    void messageReceived(const QString &message);\n\n\nprivate:\n    void sysInit(const QString &appId = QString());\n    QtLocalPeer *peer;\n    QWidget *actWin;\n};\n\n#endif\n"
  },
  {
    "path": "src/qml/qtsingleapplication/qtsinglecoreapplication.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/****************************************************************************\n**\n** This file is part of a Qt Solutions component.\n** \n** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\n** \n** Contact:  Qt Software Information (qt-info@nokia.com)\n** \n** Commercial Usage  \n** Licensees holding valid Qt Commercial licenses may use this file in\n** accordance with the Qt Solutions Commercial License Agreement provided\n** with the Software or, alternatively, in accordance with the terms\n** contained in a written agreement between you and Nokia.\n** \n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU Lesser General Public License version 2.1 requirements\n** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n** \n** In addition, as a special exception, Nokia gives you certain\n** additional rights. These rights are described in the Nokia Qt LGPL\n** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this\n** package.\n** \n** GNU General Public License Usage \n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 3.0 as published by the Free Software\n** Foundation and appearing in the file LICENSE.GPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU General Public License version 3.0 requirements will be\n** met: http://www.gnu.org/copyleft/gpl.html.\n** \n** Please note Third Party Software included with Qt Solutions may impose\n** additional restrictions and it is the user's responsibility to ensure\n** that they have met the licensing requirements of the GPL, LGPL, or Qt\n** Solutions Commercial license and the relevant license of the Third\n** Party Software they are using.\n** \n** If you are unsure which license is appropriate for your use, please\n** contact the sales department at qt-sales@nokia.com.\n** \n****************************************************************************/\n\n\n#include \"qtsinglecoreapplication.h\"\n#include \"qtlocalpeer.h\"\n\n/*!\n    \\class QtSingleCoreApplication qtsinglecoreapplication.h\n    \\brief A variant of the QtSingleApplication class for non-GUI applications.\n\n    This class is a variant of QtSingleApplication suited for use in\n    console (non-GUI) applications. It is an extension of\n    QCoreApplication (instead of QApplication). It does not require\n    the QtGui library.\n\n    The API and usage is identical to QtSingleApplication, except that\n    functions relating to the \"activation window\" are not present, for\n    obvious reasons. Please refer to the QtSingleApplication\n    documentation for explanation of the usage.\n\n    A QtSingleCoreApplication instance can communicate to a\n    QtSingleApplication instance if they share the same application\n    id. Hence, this class can be used to create a light-weight\n    command-line tool that sends commands to a GUI application.\n\n    \\sa QtSingleApplication\n*/\n\n/*!\n    Creates a QtSingleCoreApplication object. The application identifier\n    will be QCoreApplication::applicationFilePath(). \\a argc and \\a\n    argv are passed on to the QCoreAppliation constructor.\n*/\n\nQtSingleCoreApplication::QtSingleCoreApplication(int &argc, char **argv)\n    : QCoreApplication(argc, argv)\n{\n    peer = new QtLocalPeer(this);\n    connect(peer, &QtLocalPeer::messageReceived, this, &QtSingleCoreApplication::messageReceived);\n}\n\n\n/*!\n    Creates a QtSingleCoreApplication object with the application\n    identifier \\a appId. \\a argc and \\a argv are passed on to the\n    QCoreAppliation constructor.\n*/\nQtSingleCoreApplication::QtSingleCoreApplication(const QString &appId, int &argc, char **argv)\n    : QCoreApplication(argc, argv)\n{\n    peer = new QtLocalPeer(this, appId);\n    connect(peer, &QtLocalPeer::messageReceived, this, &QtSingleCoreApplication::messageReceived);\n}\n\n\n/*!\n    Returns true if another instance of this application is running;\n    otherwise false.\n\n    This function does not find instances of this application that are\n    being run by a different user (on Windows: that are running in\n    another session).\n\n    \\sa sendMessage()\n*/\n\nbool QtSingleCoreApplication::isRunning()\n{\n    return peer->isClient();\n}\n\n\n/*!\n    Tries to send the text \\a message to the currently running\n    instance. The QtSingleCoreApplication object in the running instance\n    will Q_EMIT the messageReceived() signal when it receives the\n    message.\n\n    This function returns true if the message has been sent to, and\n    processed by, the current instance. If there is no instance\n    currently running, or if the running instance fails to process the\n    message within \\a timeout milliseconds, this function return false.\n\n    \\sa isRunning(), messageReceived()\n*/\n\nbool QtSingleCoreApplication::sendMessage(const QString &message, int timeout)\n{\n    return peer->sendMessage(message, timeout);\n}\n\n\n/*!\n    Returns the application identifier. Two processes with the same\n    identifier will be regarded as instances of the same application.\n*/\n\nQString QtSingleCoreApplication::id() const\n{\n    return peer->applicationId();\n}\n\n\n/*!\n    \\fn void QtSingleCoreApplication::messageReceived(const QString& message)\n\n    This signal is emitted when the current instance receives a \\a\n    message from another instance of this application.\n\n    \\sa sendMessage()\n*/\n"
  },
  {
    "path": "src/qml/qtsingleapplication/qtsinglecoreapplication.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n/****************************************************************************\n**\n** This file is part of a Qt Solutions component.\n** \n** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).\n** \n** Contact:  Qt Software Information (qt-info@nokia.com)\n** \n** Commercial Usage  \n** Licensees holding valid Qt Commercial licenses may use this file in\n** accordance with the Qt Solutions Commercial License Agreement provided\n** with the Software or, alternatively, in accordance with the terms\n** contained in a written agreement between you and Nokia.\n** \n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 2.1 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU Lesser General Public License version 2.1 requirements\n** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n** \n** In addition, as a special exception, Nokia gives you certain\n** additional rights. These rights are described in the Nokia Qt LGPL\n** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this\n** package.\n** \n** GNU General Public License Usage \n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 3.0 as published by the Free Software\n** Foundation and appearing in the file LICENSE.GPL included in the\n** packaging of this file.  Please review the following information to\n** ensure the GNU General Public License version 3.0 requirements will be\n** met: http://www.gnu.org/copyleft/gpl.html.\n** \n** Please note Third Party Software included with Qt Solutions may impose\n** additional restrictions and it is the user's responsibility to ensure\n** that they have met the licensing requirements of the GPL, LGPL, or Qt\n** Solutions Commercial license and the relevant license of the Third\n** Party Software they are using.\n** \n** If you are unsure which license is appropriate for your use, please\n** contact the sales department at qt-sales@nokia.com.\n** \n****************************************************************************/\n\n\n#include <QtCore/QCoreApplication>\n\nclass QtLocalPeer;\n\nclass QtSingleCoreApplication : public QCoreApplication\n{\n    Q_OBJECT\n\npublic:\n    QtSingleCoreApplication(int &argc, char **argv);\n    QtSingleCoreApplication(const QString &id, int &argc, char **argv);\n\n    bool isRunning();\n    QString id() const;\n\npublic Q_SLOTS:\n    bool sendMessage(const QString &message, int timeout = 5000);\n\n\nQ_SIGNALS:\n    void messageReceived(const QString &message);\n\n\nprivate:\n    QtLocalPeer* peer;\n};\n"
  },
  {
    "path": "src/sql/CMakeLists.txt",
    "content": "set(SOURCE\n    ${SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemansql_global.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemansqlobject.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemansqlobject.cpp\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/sql/asemansql_global.h",
    "content": "#ifndef ASEMAN_SQL_GLOBAL_H\n#define ASEMAN_SQL_GLOBAL_H\n\n#include <QtCore/qglobal.h>\n\n#if !defined(QT_STATIC) && !defined(QASEMAN_STATIC)\n#if defined(LIBQTASEMAN_SQL_LIBRARY)\n#  define LIBQTASEMAN_SQL_EXPORT Q_DECL_EXPORT\n#else\n#  define LIBQTASEMAN_SQL_EXPORT Q_DECL_IMPORT\n#endif\n#else\n#define LIBQTASEMAN_SQL_EXPORT\n#endif\n\n#endif // ASEMAN_SQL_GLOBAL_H\n"
  },
  {
    "path": "src/sql/asemansqlobject.cpp",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemansqlobject.h\"\n\n#ifdef QT_SQL_LIB\n#include <QSqlDatabase>\n#include <QSqlRecord>\n#include <QSqlQuery>\n#include <QSqlError>\n#endif\n\n#include <QTimer>\n#include <QDataStream>\n#include <QBuffer>\n#include <QCryptographicHash>\n#include <QSharedPointer>\n#include <QMetaObject>\n#include <QMetaProperty>\n#include <QDateTime>\n#include <QDebug>\n#include <QJsonDocument>\n#include <QMutex>\n#include <QUuid>\n\n#define MSSQL_FIX_VALUE(VALUE) { \\\n        switch ( static_cast<qint32>(VALUE.type()) ) { \\\n        case QVariant::DateTime: \\\n            VALUE = VALUE.toDateTime().toString(QStringLiteral(\"yyyyMMdd HH:mm:ss\")); \\\n            break; \\\n        case QVariant::Date: \\\n            VALUE = VALUE.toDateTime().toString(QStringLiteral(\"yyyyMMdd\")); \\\n            break; \\\n        case QVariant::Time: \\\n            VALUE = VALUE.toDateTime().toString(QStringLiteral(\"HH:mm:ss\")); \\\n            break; \\\n        } \\\n    }\n\nclass AsemanSqlObject::Private\n{\npublic:\n    QString table;\n    QStringList primaryKeys;\n    QVariant driver;\n\n    QString driverStr;\n    QString databaseName;\n    QString databaseNameTemplate;\n    QString host;\n    qint32 port;\n    QString userName;\n    QString password;\n    QString createQuery;\n    QString lastError;\n\n    QTimer *initTimer;\n\n    static QHash<AsemanSqlObject*, Core*> cores;\n    QString key;\n};\n\nclass AsemanSqlObject::Core {\npublic:\n    ~Core() {\n        QMutexLocker locker(&mutex);\n#ifdef QT_SQL_LIB\n        if (_db->isOpen())\n            _db->close();\n\n        delete _db;\n        if(_connectionName.length()) {\n            QSqlDatabase::removeDatabase(_connectionName);\n        }\n#endif\n\n        objects.remove(_connectionName);\n    }\n\n#ifdef QT_SQL_LIB\n    QSqlDatabase &get() { return *_db; }\n#endif\n\n    static Core *getInstance(const QString &driver, const QString &connectionName) {\n        QMutexLocker locker(&mutex);\n        Core *res = objects.value(connectionName);\n#ifdef QT_SQL_LIB\n        if(!res)\n        {\n            res = new Core(driver, connectionName);\n            objects[connectionName] = res;\n        }\n#else\n        Q_UNUSED(driver)\n#endif\n        return res;\n    }\n\nprivate:\n    Core(const QString &driver, const QString &connectionName):\n        _connectionName(connectionName)\n    {\n#ifdef QT_SQL_LIB\n        *_db = QSqlDatabase::addDatabase(driver, connectionName);\n#endif\n        objects.insert(_connectionName, this);\n    }\n\n    QString _connectionName;\n#ifdef QT_SQL_LIB\n    QSqlDatabase *_db = new QSqlDatabase;\n#endif\n\n    static QMutex mutex;\n    static QHash<QString, Core*> objects;\n};\n\nQHash<AsemanSqlObject*, AsemanSqlObject::Core*> AsemanSqlObject::Private::cores;\nQHash<QString, AsemanSqlObject::Core*> AsemanSqlObject::Core::objects;\nQMutex AsemanSqlObject::Core::mutex;\n\n\nAsemanSqlObject::AsemanSqlObject(QObject *parent) :\n    QObject(parent)\n{\n    p = new Private;\n\n    p->initTimer = new QTimer(this);\n    p->initTimer->setSingleShot(true);\n    p->initTimer->setInterval(100);\n\n    connect(p->initTimer, &QTimer::timeout, this, &AsemanSqlObject::initialize);\n}\n\nvoid AsemanSqlObject::initialize()\n{\n    init();\n}\n\nvoid AsemanSqlObject::setDriver(const QVariant &driver)\n{\n    if (p->driver == driver)\n        return;\n\n    p->driver = driver;\n    if (p->driver.type() == QVariant::String)\n        p->driverStr = p->driver.toString();\n    else\n    {\n        switch (p->driver.toInt())\n        {\n        case NoneDriver:\n            p->driverStr = QStringLiteral(\"\");\n            break;\n\n        case SQLite:\n            p->driverStr = QStringLiteral(\"QSQLITE\");\n            break;\n\n        case MySQL:\n            p->driverStr = QStringLiteral(\"MYSQL\");\n            break;\n\n        case PostgreSQL:\n            p->driverStr = QStringLiteral(\"QPSQL\");\n            break;\n\n        case MSSQL:\n            p->databaseNameTemplate = QStringLiteral( \"%1;\"\n                                                      \"SERVER=%HOSTADDRESS%;\"\n                                                      \"DATABASE=%DATABASENAME%;\"\n                                                      \"UID=%USERNAME%;\"\n                                                      \"PWD=%PASSWORD%;\");\n        #ifdef Q_OS_LINUX\n            p->databaseNameTemplate = p->databaseNameTemplate.arg(\"DRIVER={ODBC Driver 17 for SQL Server}\");\n        #else\n            p->databaseNameTemplate = p->databaseNameTemplate.arg(\"DRIVER={SQL Server}\");\n        #endif\n            p->driverStr = QStringLiteral(\"QODBC\");\n            break;\n\n        case ODBC:\n            p->driverStr = QStringLiteral(\"QODBC\");\n            break;\n        }\n    }\n    refreshKey();\n\n    Q_EMIT driverChanged();\n}\n\nQVariant AsemanSqlObject::driver() const\n{\n    return p->driver;\n}\n\nvoid AsemanSqlObject::setTable(const QString &table)\n{\n    if (p->table == table)\n        return;\n\n    p->table = table;\n    Q_EMIT tableChanged();\n}\n\nQString AsemanSqlObject::table() const\n{\n    return p->table;\n}\n\nvoid AsemanSqlObject::setPrimaryKeys(const QStringList &primaryKeys)\n{\n    if (p->primaryKeys == primaryKeys)\n        return;\n\n    p->primaryKeys = primaryKeys;\n    Q_EMIT primaryKeysChanged();\n}\n\nQStringList AsemanSqlObject::primaryKeys() const\n{\n    return p->primaryKeys;\n}\n\nqint32 AsemanSqlObject::port() const\n{\n    return p->port;\n}\n\nvoid AsemanSqlObject::setPort(qint32 port)\n{\n    if (p->port == port)\n        return;\n\n    p->port = port;\n    refreshKey();\n    void portChanged();\n}\n\nQString AsemanSqlObject::host() const\n{\n    return p->host;\n}\n\nvoid AsemanSqlObject::setHost(const QString &host)\n{\n    if (p->host == host)\n        return;\n\n    p->host = host;\n    refreshKey();\n    void hostChanged();\n}\n\nQString AsemanSqlObject::databaseName() const\n{\n    return p->databaseName;\n}\n\nvoid AsemanSqlObject::setDatabaseName(const QString &databaseName)\n{\n    if (p->databaseName == databaseName)\n        return;\n\n    p->databaseName = databaseName;\n    refreshKey();\n    void databaseNameChanged();\n}\n\nQString AsemanSqlObject::userName() const\n{\n    return p->userName;\n}\n\nvoid AsemanSqlObject::setUserName(const QString &userName)\n{\n    if (p->userName == userName)\n        return;\n\n    p->userName = userName;\n    refreshKey();\n    void userNameChanged();\n}\n\nQString AsemanSqlObject::password() const\n{\n    return p->password;\n}\n\nvoid AsemanSqlObject::setPassword(const QString &password)\n{\n    if (p->password == password)\n        return;\n\n    p->password = password;\n    refreshKey();\n    void passwordChanged();\n}\n\nQString AsemanSqlObject::createQuery() const\n{\n    return p->createQuery;\n}\n\nvoid AsemanSqlObject::setCreateQuery(const QString &createQuery)\n{\n    if (p->createQuery == createQuery)\n        return;\n\n    p->createQuery = createQuery;\n    Q_EMIT createQueryChanged();\n}\n\nQString AsemanSqlObject::lastError() const\n{\n    return p->lastError;\n}\n\nqint32 AsemanSqlObject::insert(const QString &extra)\n{\n#ifdef QT_SQL_LIB\n    Core *core = init();\n\n    QStringList properties = AsemanSqlObject::properties();\n    if(primaryKeys().contains(QStringLiteral(\"id\")) && property(\"id\").type() == QVariant::Int && property(\"id\").toInt() == 0)\n        properties.removeAll(QStringLiteral(\"id\"));\n\n    QString queryArgs = properties.join(QStringLiteral(\", \"));\n    QString queryArgsBinds = QStringLiteral(\":\") + properties.join(QStringLiteral(\", :\"));\n\n    QString query = QStringLiteral(\"REPLACE INTO \") + p->table + QStringLiteral(\" (\") + queryArgs + QStringLiteral(\")\") +\n                    QStringLiteral(\" VALUES (\") + queryArgsBinds + QStringLiteral(\")\");\n\n    QSqlQuery q(core->get());\n    q.prepare(query + QStringLiteral(\" \") + extra);\n    for (const QString &key: properties)\n    {\n        QVariant value = property(key.toUtf8());\n        if (p->driver.toInt() == MSSQL)\n            MSSQL_FIX_VALUE(value)\n\n        q.bindValue(\":\" + key, value);\n    }\n\n    if (!queryExec(q))\n        return 0;\n    else\n        return q.lastInsertId().toInt();\n#else\n    return 0;\n#endif\n}\n\nvoid AsemanSqlObject::update(const QString &_where, const QVariantMap &binds)\n{\n    QString query = \"UPDATE \" + p->table + \" SET \";\n\n    QStringList properties = AsemanSqlObject::properties();\n    QStringList pkeys = primaryKeys();\n\n    QString set;\n    for (const QString &pr: properties)\n    {\n        if (set.length())\n            set += QStringLiteral(\", \");\n        set += (\":\" + pr + \" = \" + pr);\n    }\n\n    QString where = _where;\n    for (const QString &pk: pkeys)\n    {\n        if (where.length())\n            where += QStringLiteral(\" AND \");\n        where += (\":\" + pk + \" = \" + pk);\n    }\n\n    query += set + \" WHERE \" + where;\n\n    AsemanSqlObject::query(query, binds);\n}\n\nQVariantList AsemanSqlObject::select()\n{\n    QString where;\n    QStringList properties = AsemanSqlObject::properties();\n    QStringList pkeys = primaryKeys();\n    for (const QString &pk: pkeys)\n    {\n        if (where.length())\n            where += QStringLiteral(\" AND \");\n        where += (\":\" + pk + \" = \" + pk);\n    }\n\n    return select(QStringLiteral(\"\"), where, QStringLiteral(\"\"), {});\n}\n\nQVariantList AsemanSqlObject::select(const QString join, const QString &where, const QString &extra, const QVariantMap &binds)\n{\n    QString query = QStringLiteral(\"SELECT * FROM \") + p->table + (join.count()? QStringLiteral(\" \") + join : QStringLiteral(\"\"))\n                    + (where.count()? QStringLiteral(\" WHERE \") + where : QStringLiteral(\"\"))\n                    + (extra.count()? QStringLiteral(\" \") + extra : QStringLiteral(\"\"));\n\n    return AsemanSqlObject::query(query, binds);\n}\n\nvoid AsemanSqlObject::fetch()\n{\n    QStringList properties = AsemanSqlObject::properties();\n    QStringList pkeys = primaryKeys();\n    QVariantList list = select();\n    if (list.isEmpty())\n        return;\n\n    QVariantMap map = list.first().toMap();\n    QMapIterator<QString, QVariant> i(map);\n    while (i.hasNext())\n    {\n        i.next();\n        const QString &key = i.key();\n        if(!properties.contains(key) || pkeys.contains(key))\n            continue;\n\n        setProperty(key.toUtf8(), i.value());\n    }\n}\n\nvoid AsemanSqlObject::deleteQuery(const QString &where, const QVariantMap &binds)\n{\n    QString query = QStringLiteral(\"DELETE FROM \") + p->table + (where.count()? QStringLiteral(\" WHERE \") + where : QStringLiteral(\"\"));\n    AsemanSqlObject::query(query, binds);\n}\n\nQVariantList AsemanSqlObject::query(const QString &query, const QVariantMap &binds)\n{\n    QVariantList res;\n#ifdef QT_SQL_LIB\n    Core *core = init();\n\n    QSqlQuery q(core->get());\n    q.prepare(query);\n\n    QVariantMap fixedBinds = prepareBinds(binds);\n    QMapIterator<QString, QVariant> i(fixedBinds);\n    while (i.hasNext())\n    {\n        i.next();\n        q.bindValue(i.key(), i.value());\n    }\n\n    if (!queryExec(q))\n        return QVariantList();\n\n    return generateResult(q);\n#else\n    return res;\n#endif\n}\n\nvoid AsemanSqlObject::queryAsync(const QString &query, const QVariantMap &binds, std::function<void (QVariantList result, const QString &error)> callback)\n{\n    Core *core = init(QUuid::createUuid().toString());\n    QVariantMap fixedBinds = prepareBinds(binds);\n\n    AsemanSqlObjectAsync *async = new AsemanSqlObjectAsync(core, query, fixedBinds);\n\n    connect(async, &AsemanSqlObjectAsync::error, this, [this, callback](const QString &error){\n        setLastError(error);\n        callback(QVariantList(), error);\n    });\n    connect(async, &AsemanSqlObjectAsync::result, this, [callback](const QVariantList &result){\n        callback(result, QString());\n    });\n    connect(async, &AsemanSqlObjectAsync::finished, async, [async](){\n        async->deleteLater();\n    });\n\n    async->start();\n}\n\nQVariantMap AsemanSqlObject::prepareBinds(const QVariantMap &binds) const\n{\n    QVariantMap res;\n\n    QStringList properties = AsemanSqlObject::properties();\n    for (const QString &key: properties)\n    {\n        QVariant value = property(key.toUtf8());\n        if (p->driver.toInt() == MSSQL)\n            MSSQL_FIX_VALUE(value)\n\n        res[\":\" + key] = value;\n    }\n\n    QMapIterator<QString, QVariant> i(binds);\n    while (i.hasNext())\n    {\n        i.next();\n        QVariant value = i.value();\n        if (p->driver.toInt() == MSSQL)\n            MSSQL_FIX_VALUE(value)\n\n        res[\":\" + i.key()] = value;\n    }\n\n    return res;\n}\n\nQVariantList AsemanSqlObject::generateResult(QSqlQuery &q)\n{\n    QVariantList res;\n#ifdef QT_SQL_LIB\n    while (q.next())\n    {\n        QSqlRecord r = q.record();\n        QVariantMap map;\n        for (qint32 i=0; i<r.count(); i++)\n            map[r.fieldName(i)] = r.value(i);\n\n        res << map;\n    }\n#endif\n    return res;\n}\n\nvoid AsemanSqlObject::create()\n{\n    QStringList queries = p->createQuery.split(QStringLiteral(\";\"), Qt::SkipEmptyParts);\n    for (const QString &q: queries)\n        AsemanSqlObject::query(q);\n}\n\nvoid AsemanSqlObject::drop()\n{\n    AsemanSqlObject::query(\"DROP TABLE \" + p->table);\n}\n\nQVariantMap AsemanSqlObject::getData()\n{\n    QStringList properties = AsemanSqlObject::properties();\n    if(primaryKeys().contains(QStringLiteral(\"id\")) && property(\"id\").type() == QVariant::Int && property(\"id\").toInt() == 0)\n        properties.removeAll(QStringLiteral(\"id\"));\n\n    QVariantMap res;\n    for (const QString &key: properties)\n    {\n        QVariant value = property(key.toUtf8());\n        if (p->driver.toInt() == MSSQL)\n            MSSQL_FIX_VALUE(value)\n\n        res[key] = value;\n    }\n\n    return res;\n}\n\nvoid AsemanSqlObject::setLastError(const QString &lastError)\n{\n    if (p->lastError == lastError)\n        return;\n\n    p->lastError = lastError;\n    Q_EMIT lastErrorChanged();\n}\n\n#ifdef QT_SQL_LIB\nint AsemanSqlObject::queryExec(QSqlQuery &q)\n{\n    bool ret = q.exec();\n    if (!ret)\n        setLastError(q.lastError().text());\n\n    return ret;\n}\n#endif\n\nQStringList AsemanSqlObject::properties() const\n{\n    QStringList res;\n\n    const QMetaObject *meta = metaObject();\n    for (int i=0; i<meta->propertyCount(); i++)\n    {\n        QMetaProperty property = meta->property(i);\n        const QByteArray &propertyName = property.name();\n        if (propertyName == \"table\" ||\n            propertyName == \"driver\" ||\n            propertyName == \"databaseName\" ||\n            propertyName == \"host\" ||\n            propertyName == \"port\" ||\n            propertyName == \"userName\" ||\n            propertyName == \"password\" ||\n            propertyName == \"createQuery\" ||\n            propertyName == \"primaryKeys\" ||\n            propertyName == \"lastError\" ||\n            propertyName == \"objectName\")\n            continue;\n\n        res << QString::fromUtf8(propertyName);\n    }\n\n    return res;\n}\n\nAsemanSqlObject::Core *AsemanSqlObject::init(const QString &forceConnectionName)\n{\n    if (forceConnectionName.isEmpty())\n        p->initTimer->stop();\n\n    Core *core = Core::getInstance(p->driverStr, (forceConnectionName.count()? forceConnectionName : p->key));\n#ifdef QT_SQL_LIB\n    if (!core->get().isOpen())\n    {\n        if (p->databaseNameTemplate.count())\n        {\n            QString portStr = QString::number(p->port);\n            QString dbName = p->databaseNameTemplate;\n            dbName.replace(QStringLiteral(\"%HOSTADDRESS%\"), (p->port? p->host + \":\" + portStr : p->host));\n            dbName.replace(QStringLiteral(\"%DATABASENAME%\"), p->databaseName);\n            dbName.replace(QStringLiteral(\"%USERNAME%\"), p->userName);\n            dbName.replace(QStringLiteral(\"%PASSWORD%\"), p->password);\n\n            core->get().setDatabaseName(dbName);\n        }\n        else\n        {\n            core->get().setHostName(p->host);\n            core->get().setPort(p->port);\n            core->get().setUserName(p->userName);\n            core->get().setPassword(p->password);\n            core->get().setDatabaseName(p->databaseName);\n        }\n\n        if (!core->get().open())\n            setLastError(core->get().lastError().text());\n    }\n#endif\n\n    if (forceConnectionName.count())\n        return core;\n\n    if (Private::cores.value(this) == core)\n        return core;\n    if (Private::cores.contains(this))\n    {\n        Core *oldCore = Private::cores.take(this);\n        if (Private::cores.keys(oldCore).isEmpty()) // It means there is no need to this object anymore\n            delete oldCore;\n    }\n\n    Private::cores[this] = core;\n    return core;\n}\n\nvoid AsemanSqlObject::refreshKey()\n{\n    QByteArray data;\n    QDataStream stream(&data, QIODevice::WriteOnly);\n    stream << p->host << p->port << p->driver\n           << p->userName << p->password << p->databaseName\n           << p->databaseNameTemplate;\n\n    p->key = QString::fromUtf8( QCryptographicHash::hash(data, QCryptographicHash::Md5).toHex() );\n}\n\nAsemanSqlObject::~AsemanSqlObject()\n{\n    Core *oldCore = Private::cores.take(this);\n    if (Private::cores.keys(oldCore).isEmpty()) // It means there is no need to this object anymore\n        delete oldCore;\n\n    delete p;\n}\n\n\nAsemanSqlObjectAsync::AsemanSqlObjectAsync(AsemanSqlObject::Core *core, const QString &query, const QVariantMap &binds, QObject *parent) :\n    QThread(parent),\n    mCore(core),\n    mQuery(query),\n    mBinds(binds)\n{\n}\n\nvoid AsemanSqlObjectAsync::run()\n{\n#ifdef QT_SQL_LIB\n    QSqlDatabase db = mCore->get();\n    QSqlQuery q(db);\n    q.prepare(mQuery);\n\n    QMapIterator<QString, QVariant> i(mBinds);\n    while (i.hasNext())\n    {\n        i.next();\n        q.bindValue(i.key(), i.value());\n    }\n\n    if (!q.exec())\n        Q_EMIT error(q.lastError().text());\n    else\n        Q_EMIT result( AsemanSqlObject::generateResult(q) );\n#else\n    Q_EMIT error(QStringLiteral(\"SQL not supported. Rebuilt Qt and AsemanQml with sql support.\"));\n#endif\n}\n\nAsemanSqlObjectAsync::~AsemanSqlObjectAsync()\n{\n    delete mCore;\n}\n"
  },
  {
    "path": "src/sql/asemansqlobject.h",
    "content": "/*\n    Copyright (C) 2019 Aseman Team\n    http://aseman.io\n\n    This project is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This project is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANSQLOBJECT_H\n#define ASEMANSQLOBJECT_H\n\n#include <QObject>\n#include <QThread>\n#include <QVariant>\n\n#include <functional>\n\n#include \"asemansql_global.h\"\n\nclass LIBQTASEMAN_SQL_EXPORT AsemanSqlObject : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QString table READ table WRITE setTable NOTIFY tableChanged)\n    Q_PROPERTY(QVariant driver READ driver WRITE setDriver NOTIFY driverChanged)\n    Q_PROPERTY(QString databaseName READ databaseName WRITE setDatabaseName NOTIFY databaseNameChanged)\n    Q_PROPERTY(QString host READ host WRITE setHost NOTIFY hostChanged)\n    Q_PROPERTY(qint32 port READ port WRITE setPort NOTIFY portChanged)\n    Q_PROPERTY(QString userName READ userName WRITE setUserName NOTIFY userNameChanged)\n    Q_PROPERTY(QString password READ password WRITE setPassword NOTIFY passwordChanged)\n    Q_PROPERTY(QString createQuery READ createQuery WRITE setCreateQuery NOTIFY createQueryChanged)\n    Q_PROPERTY(QStringList primaryKeys READ primaryKeys WRITE setPrimaryKeys NOTIFY primaryKeysChanged)\n    Q_PROPERTY(QString lastError READ lastError NOTIFY lastErrorChanged)\n    Q_ENUMS(DriverTypes)\n\n    class Private;\n    friend class AsemanSqlObjectAsync;\n\npublic:\n    enum DriverTypes {\n        NoneDriver,\n        SQLite,\n        MySQL,\n        PostgreSQL,\n        ODBC,\n        MSSQL\n    };\n\n    class Core;\n\n    AsemanSqlObject(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanSqlObject();\n\n    void setTable(const QString &table);\n    QString table() const;\n\n    void setPrimaryKeys(const QStringList &primaryKeys);\n    QStringList primaryKeys() const;\n\n    void setDriver(const QVariant &driver);\n    QVariant driver() const;\n\n    QString databaseName() const;\n    void setDatabaseName(const QString &databaseName);\n\n    QString host() const;\n    void setHost(const QString &host);\n\n    qint32 port() const;\n    void setPort(qint32 port);\n\n    QString userName() const;\n    void setUserName(const QString &userName);\n\n    QString password() const;\n    void setPassword(const QString &password);\n\n    QString createQuery() const;\n    void setCreateQuery(const QString &createQuery);\n\n    QString lastError() const;\n\n    void queryAsync(const QString &query, const QVariantMap &binds, std::function<void (QVariantList result, const QString &error)> callback);\n\npublic Q_SLOTS:\n    qint32 insert(const QString &extra = QString());\n    void update(const QString &where = QString(), const QVariantMap &binds = QVariantMap());\n\n    QVariantList select();\n    QVariantList select(const QString &where, const QVariantMap &binds) { return select(QStringLiteral(\"\"), where, QStringLiteral(\"\"), binds); }\n    QVariantList select(const QString join, const QString &where, const QVariantMap &binds) { return select(join, where, QStringLiteral(\"\"), binds); }\n    QVariantList select(const QString join, const QString &where, const QString &extra, const QVariantMap &binds);\n\n    void push() { insert(); }\n    void fetch();\n\n    void deleteQuery(const QString &where, const QVariantMap &binds = QVariantMap());\n\n    QVariantList query(const QString &query, const QVariantMap &binds = QVariantMap());\n\n    void create();\n    void drop();\n\n    QVariantMap getData();\n\nQ_SIGNALS:\n    void tableChanged();\n    void databaseNameChanged();\n    void hostChanged();\n    void portChanged();\n    void driverChanged();\n    void userNameChanged();\n    void passwordChanged();\n    void primaryKeysChanged();\n    void createQueryChanged();\n    void lastErrorChanged();\n\nprotected:\n    QVariantMap prepareBinds(const QVariantMap &binds) const;\n    static QVariantList generateResult(class QSqlQuery &res);\n\nprivate:\n    void initialize();\n    Core *init(const QString &forceConnectionName = QString());\n    void refreshKey();\n\n    void setLastError(const QString &lastError);\n#ifdef QT_SQL_LIB\n    int queryExec(class QSqlQuery &q);\n#endif\n\n    QStringList properties() const;\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanSqlObject QAsemanSqlObject;\n\nclass AsemanSqlObjectAsync: public QThread\n{\n    Q_OBJECT\n\npublic:\n    AsemanSqlObjectAsync(AsemanSqlObject::Core *core, const QString &query, const QVariantMap &binds, QObject *parent = Q_NULLPTR);\n    virtual ~AsemanSqlObjectAsync();\n\nQ_SIGNALS:\n    void error(const QString &error);\n    void result(const QVariantList &result);\n\nprotected:\n    void run() override;\n\nprivate:\n    AsemanSqlObject::Core *mCore;\n    QString mQuery;\n    QVariantMap mBinds;\n};\n\n#endif // ASEMANSQLOBJECT_H\n"
  },
  {
    "path": "src/sql/sql.pri",
    "content": "INCLUDEPATH += $$PWD\nDEPENDPATH += $$PWD\n\nQT += core\n\nqtHaveModule(sql): QT += sql\n\nHEADERS += \\\n    $$PWD/asemansql_global.h \\\n    $$PWD/asemansqlobject.h\n\nSOURCES += \\\n    $$PWD/asemansqlobject.cpp\n"
  },
  {
    "path": "src/sql/sql.pro",
    "content": "load(qt_build_config)\n\nTARGET = QAsemanSql\nQT += asemancore\n\nMODULE = asemansql\n\nload(qt_module)\n\nDEFINES += LIBQTASEMAN_SQL_LIBRARY\n\ninclude (sql.pri)\n"
  },
  {
    "path": "src/src.pri",
    "content": "\r\nDEFINES += QT_ASEMAN_EMBEDDED\r\ncontains(QT_ASEMAN_MODULES, core) {\r\n    include ($$PWD/core/core.pri)\r\n}\r\ncontains(QT_ASEMAN_MODULES, gui) {\r\n    include ($$PWD/gui/gui.pri)\r\n}\r\ncontains(QT_ASEMAN_MODULES, widgets) {\r\n    include ($$PWD/widgets/widgets.pri)\r\n}\r\ncontains(QT_ASEMAN_MODULES, network) {\r\n    include ($$PWD/network/network.pri)\r\n}\r\ncontains(QT_ASEMAN_MODULES, qml) {\r\n    include ($$PWD/qml/qml.pri)\r\n    include ($$PWD/asemanqml/asemanqml.pri)\r\n}\r\ncontains(QT_ASEMAN_MODULES, sql) {\r\n    include ($$PWD/sql/sql.pri)\r\n}\r\n\r\nlessThan(QT_MAJOR_VERSION, 6): { # Deprecated Modules\r\n    contains(QT_ASEMAN_MODULES, multimedia) {\r\n        include ($$PWD/multimedia/multimedia.pri)\r\n    }\r\n}\r\nqtHaveModule(positioning): {\r\n    contains(QT_ASEMAN_MODULES, geo) {\r\n        include ($$PWD/geo/geo.pri)\r\n    }\r\n}\r\n"
  },
  {
    "path": "src/src.pro",
    "content": "TEMPLATE = subdirs\r\nCONFIG += ordered\r\nSUBDIRS = \\\r\n    core \\\r\n    gui \\\r\n    widgets \\\r\n    network \\\r\n    qml \\\r\n    sql\r\n\r\nlessThan(QT_MAJOR_VERSION, 6): { # Deprecated Modules\r\n    SUBDIRS += \\\r\n        multimedia \\\r\n        geo\r\n}\r\n\r\nexists($$PWD/httpserver/qhttp/qhttp.pro): !wasm: SUBDIRS += httpserver\r\n\r\nqtHaveModule(positioning):\r\n\r\nSUBDIRS += \\\r\n    asemanqml \\\r\n    styles \r\n\r\nandroid: SUBDIRS += android\r\nlinux: !android: SUBDIRS += wizards\r\n\r\ngui.depends += core\r\nnetwork.depends += core gui\r\nwidgets.depends += gui core\r\nmultimedia.depends += core gui\r\ngeo.depends += core gui\r\nqml.depends += core gui widgets\r\nasemanqml.depends += qml\r\n"
  },
  {
    "path": "src/styles/iosstyle/ApplicationWindow.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Window 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\n\nT.ApplicationWindow {\n    id: window\n\n    color: IOSStyle.backgroundColor\n\n//    overlay.modal: Rectangle {\n//        color: window.IOSStyle.backgroundDimColor\n//        Behavior on opacity { NumberAnimation { duration: 150 } }\n//    }\n\n//    overlay.modeless: Rectangle {\n//        color: window.IOSStyle.backgroundDimColor\n//        Behavior on opacity { NumberAnimation { duration: 150 } }\n//    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/BoxShadow.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\n/*\n   A implementation of CSS's box-shadow, used by ElevationEffect for a IOSStyle Design\n   elevation shadow effect.\n */\nRectangularGlow {\n    // The 4 properties from CSS box-shadow, plus the inherited color property\n    property int offsetX\n    property int offsetY\n    property int blurRadius\n    property int spreadRadius\n\n    // The source item the shadow is being applied to, used for correctly\n    // calculating the corner radious\n    property Item source\n\n    property bool fullWidth\n    property bool fullHeight\n\n    x: (parent.width - width)/2 + offsetX\n    y: (parent.height - height)/2 + offsetY\n\n    implicitWidth: source ? source.width : parent.width\n    implicitHeight: source ? source.height : parent.height\n\n    width: implicitWidth + 2 * spreadRadius + (fullWidth ? 2 * cornerRadius : 0)\n    height: implicitHeight + 2 * spreadRadius + (fullHeight ? 2 * cornerRadius : 0)\n    glowRadius: blurRadius/2\n    spread: 0.05\n    cornerRadius: blurRadius + (source && source.radius || 0)\n}\n"
  },
  {
    "path": "src/styles/iosstyle/BusyIndicator.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.9\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\n\nT.BusyIndicator {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding)\n\n    contentItem: Item {\n        implicitWidth: 24\n        implicitHeight: implicitWidth\n        opacity: control.running ? 1 : 0\n        Behavior on opacity { OpacityAnimator { duration: 250 } }\n\n\n        Timer {\n            interval: 80\n            repeat: true\n            running: control.running\n            onTriggered: parent.rotation = (parent.rotation + 30) % 360\n        }\n\n        Repeater {\n            model: 12\n            Rectangle {\n                property real size: parent.width\n\n                width: 2\n                height: size / 4\n                radius: 16\n                x: size/2 + size/2 * Math.sin(rotation * Math.PI/180).toFixed(12) - 1\n                y: size/2 - size/2 * Math.cos(rotation * Math.PI/180).toFixed(12)\n                rotation: index * 30\n                antialiasing: true\n                transformOrigin: Item.Top\n                opacity: 1/16 * index + 4/16\n                color: control.IOSStyle.foreground\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/Button.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.Button {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding)\n\n    topInset: 6\n    bottomInset: 6\n    padding: 12\n    horizontalPadding: padding - 4\n    spacing: 6\n\n    icon.width: 24\n    icon.height: 24\n    icon.color: !enabled ? IOSStyle.hintTextColor :\n        flat && highlighted ? IOSStyle.accentColor :\n        highlighted ? IOSStyle.primaryHighlightedTextColor : IOSStyle.foreground\n\n    contentItem: IconLabel {\n        id: content\n        spacing: control.spacing\n        mirrored: control.mirrored\n        display: control.display\n\n        icon: control.icon\n        text: control.text\n        font: control.font\n        color: !control.enabled ? control.IOSStyle.hintTextColor :\n            control.flat && control.highlighted ? control.IOSStyle.accentColor :\n            control.highlighted ? control.IOSStyle.primaryHighlightedTextColor :\n            control.flat ? control.IOSStyle.foreground : control.IOSStyle.accentColor\n    }\n\n    background: Rectangle {\n        id: background\n        implicitWidth: 128\n        implicitHeight: control.IOSStyle.buttonHeight\n\n        radius: 8\n        opacity: control.flat? (control.pressed? 0.2 : 0) : 1\n        border.width: 0\n        color: {\n            if(!control.enabled)\n                return control.IOSStyle.buttonDisabledColor\n\n            if (control.highlighted)\n                return Qt.lighter(control.IOSStyle.highlightedButtonColor, control.pressed? 1.2 : 1)\n            if (control.flat)\n                return control.IOSStyle.foreground\n            else\n                return Qt.darker(control.IOSStyle.backgroundColor, control.pressed? 1.05 : 1)\n        }\n\n        Behavior on border.color {\n            ColorAnimation {\n                duration: 250\n            }\n        }\n\n        Behavior on color {\n            ColorAnimation {\n                duration: 250\n            }\n        }\n\n        Behavior on opacity {\n            NumberAnimation {\n                duration: 250\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/CheckBox.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.CheckBox {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding,\n                             implicitIndicatorHeight + topPadding + bottomPadding)\n\n    spacing: 8\n    padding: 8\n    verticalPadding: padding + 7\n\n    indicator: CheckIndicator {\n        x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2\n        y: control.topPadding + (control.availableHeight - height) / 2\n        control: control\n    }\n\n    contentItem: Text {\n        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0\n        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0\n\n        text: control.text\n        font: control.font\n        color: control.enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n        elide: Text.ElideRight\n        verticalAlignment: Text.AlignVCenter\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/CheckDelegate.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.CheckDelegate {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding,\n                             implicitIndicatorHeight + topPadding + bottomPadding)\n\n    padding: 16\n    verticalPadding: 8\n    spacing: 16\n\n    icon.width: 24\n    icon.height: 24\n    icon.color: enabled ? IOSStyle.foreground : IOSStyle.hintTextColor\n\n    indicator: CheckIndicator {\n        x: text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2\n        y: control.topPadding + (control.availableHeight - height) / 2\n        control: control\n    }\n\n    contentItem: IconLabel {\n        leftPadding: !control.mirrored ? 0 : control.indicator.width + control.spacing\n        rightPadding: control.mirrored ? 0 : control.indicator.width + control.spacing\n\n        spacing: control.spacing\n        mirrored: control.mirrored\n        display: control.display\n        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft\n\n        icon: control.icon\n        text: control.text\n        font: control.font\n        color: control.enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n    }\n\n    background: Rectangle {\n        implicitHeight: control.IOSStyle.delegateHeight\n\n        color: control.highlighted ? control.IOSStyle.listHighlightColor : \"transparent\"\n\n        Ripple {\n            width: parent.width\n            height: parent.height\n\n            clip: visible\n            pressed: control.pressed\n            anchor: control\n            active: control.down || control.visualFocus || control.hovered\n            color: control.IOSStyle.rippleColor\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/CheckIndicator.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nRectangle {\n    id: indicatorItem\n    implicitWidth: 18\n    implicitHeight: 18\n    color: \"transparent\"\n    border.color: !control.enabled ? control.IOSStyle.hintTextColor\n        : checkState !== Qt.Unchecked ? control.IOSStyle.accentColor : control.IOSStyle.secondaryTextColor\n    border.width: checkState !== Qt.Unchecked ? width / 2 : 1\n    radius: width/2\n\n    property Item control\n    property int checkState: control.checkState\n\n    Behavior on border.width {\n        NumberAnimation {\n            duration: 100\n            easing.type: Easing.OutCubic\n        }\n    }\n\n    Behavior on border.color {\n        ColorAnimation {\n            duration: 100\n            easing.type: Easing.OutCubic\n        }\n    }\n\n    // TODO: This needs to be transparent\n    Image {\n        id: checkImage\n        x: (parent.width - width) / 2\n        y: (parent.height - height) / 2\n        width: 10 \n        height: 10\n        source: \"qrc:/qt-project.org/imports/QtQuick/Controls.2/IOSStyle/images/check.png\"\n        fillMode: Image.PreserveAspectFit\n\n        scale: checkState === Qt.Checked ? 1 : 0\n        Behavior on scale { NumberAnimation { duration: 100 } }\n    }\n\n    Rectangle {\n        x: (parent.width - width) / 2\n        y: (parent.height - height) / 2\n        width: 12\n        height: 3\n\n        scale: checkState === Qt.PartiallyChecked ? 1 : 0\n        Behavior on scale { NumberAnimation { duration: 100 } }\n    }\n\n    states: [\n        State {\n            name: \"checked\"\n            when: checkState === Qt.Checked\n        },\n        State {\n            name: \"partiallychecked\"\n            when: checkState === Qt.PartiallyChecked\n        }\n    ]\n}\n"
  },
  {
    "path": "src/styles/iosstyle/ComboBox.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Window 2.12\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.ComboBox {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding,\n                             implicitIndicatorHeight + topPadding + bottomPadding)\n\n    topInset: 6\n    bottomInset: 6\n\n    leftPadding: padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)\n    rightPadding: padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing)\n\n    IOSStyle.elevation: flat ? control.pressed || control.hovered ? 2 : 0\n                             : control.pressed ? 8 : 2\n    IOSStyle.background: flat ? \"transparent\" : undefined\n    IOSStyle.foreground: flat ? undefined : IOSStyle.primaryTextColor\n\n    delegate: MenuItem {\n        width: parent.width\n        text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData\n        IOSStyle.foreground: control.currentIndex === index ? parent.IOSStyle.accent : parent.IOSStyle.foreground\n        highlighted: control.highlightedIndex === index\n        hoverEnabled: control.hoverEnabled\n    }\n\n    indicator: ColorImage {\n        x: control.mirrored ? control.padding : control.width - width - control.padding\n        y: control.topPadding + (control.availableHeight - height) / 2\n        color: control.enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n        source: \"qrc:/qt-project.org/imports/QtQuick/Controls.2/IOSStyle/images/drop-indicator.png\"\n    }\n\n    contentItem: T.TextField {\n        padding: 6\n        leftPadding: control.editable ? 2 : control.mirrored ? 0 : 12\n        rightPadding: control.editable ? 2 : control.mirrored ? 12 : 0\n\n        text: control.editable ? control.editText : control.displayText\n\n        enabled: control.editable\n        autoScroll: control.editable\n        readOnly: control.down\n        inputMethodHints: control.inputMethodHints\n        validator: control.validator\n\n        font: control.font\n        color: control.enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n        selectionColor: control.IOSStyle.accentColor\n        selectedTextColor: control.IOSStyle.primaryHighlightedTextColor\n        verticalAlignment: Text.AlignVCenter\n\n        cursorDelegate: CursorDelegate { }\n    }\n\n    background: Item {\n        implicitWidth: 120\n        implicitHeight: control.IOSStyle.buttonHeight\n\n        Rectangle {\n            anchors.fill: parent\n            radius: 5\n            color: control.IOSStyle.foreground\n            opacity: 0.1\n            visible: control.editable\n        }\n\n        Rectangle {\n            anchors.fill: parent\n            border.width: 1\n            border.color: control.down || control.visualFocus || control.hovered? control.IOSStyle.accent : control.IOSStyle.foreground\n            radius: 5\n            opacity: 0.1\n            visible: !control.editable\n        }\n\n        Rectangle {\n            width: parent.width\n            height: parent.height\n            visible: control.pressed || control.down || control.visualFocus || control.hovered\n            opacity: control.down || control.visualFocus || control.hovered? 0.5 : 1\n            color: control.IOSStyle.rippleColor\n            radius: 5\n        }\n    }\n\n    popup: T.Popup {\n        y: control.editable ? control.height - 5 : 0\n        width: control.width\n        height: Math.min(contentItem.implicitHeight, control.Window.height - topMargin - bottomMargin)\n        transformOrigin: Item.Top\n        topMargin: 12\n        bottomMargin: 12\n        dim: true\n\n        IOSStyle.theme: control.IOSStyle.theme\n        IOSStyle.accent: control.IOSStyle.accent\n        IOSStyle.primary: control.IOSStyle.primary\n\n        enter: Transition {\n            // grow_fade_in\n            NumberAnimation { property: \"scale\"; from: 1.1; to: 1.0; easing.type: Easing.OutQuint; duration: 220 }\n            NumberAnimation { property: \"opacity\"; from: 0.0; to: 1.0; easing.type: Easing.OutCubic; duration: 150 }\n        }\n\n        exit: Transition {\n            // shrink_fade_out\n            NumberAnimation { property: \"opacity\"; from: 1.0; to: 0.0; easing.type: Easing.OutCubic; duration: 150 }\n        }\n\n        contentItem: ListView {\n            clip: true\n            implicitHeight: contentHeight\n            model: control.delegateModel\n            currentIndex: control.highlightedIndex\n            highlightMoveDuration: 0\n\n            T.ScrollIndicator.vertical: ScrollIndicator { }\n        }\n\n        background: Rectangle {\n            radius: 10\n            color: parent.IOSStyle.dialogColor\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/CursorDelegate.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Controls.IOSStyle 2.0\n\nRectangle {\n    id: cursor\n\n    color: parent.IOSStyle.accentColor\n    width: 2\n    visible: parent.activeFocus && !parent.readOnly && parent.selectionStart === parent.selectionEnd\n\n    Connections {\n        target: cursor.parent\n        onCursorPositionChanged: {\n            // keep a moving cursor visible\n            cursor.opacity = 1\n            timer.restart()\n        }\n    }\n\n    Timer {\n        id: timer\n        running: cursor.parent.activeFocus && !cursor.parent.readOnly\n        repeat: true\n        interval: Qt.styleHints.cursorFlashTime / 2\n        onTriggered: cursor.opacity = !cursor.opacity ? 1 : 0\n        // force the cursor visible when gaining focus\n        onRunningChanged: cursor.opacity = 1\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/DelayButton.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.DelayButton {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding)\n\n    topInset: 6\n    bottomInset: 6\n    padding: 12\n    horizontalPadding: padding - 4\n\n    IOSStyle.elevation: control.down ? 8 : 2\n\n    transition: Transition {\n        NumberAnimation {\n            duration: control.delay * (control.pressed ? 1.0 - control.progress : 0.3 * control.progress)\n        }\n    }\n\n    contentItem: Text {\n        text: control.text\n        font: control.font\n        color: !control.enabled ? control.IOSStyle.hintTextColor : control.IOSStyle.foreground\n        horizontalAlignment: Text.AlignHCenter\n        verticalAlignment: Text.AlignVCenter\n        elide: Text.ElideRight\n    }\n\n    // TODO: Add a proper ripple/ink effect for mouse/touch input and focus state\n    background: Rectangle {\n        implicitWidth: 64\n        implicitHeight: control.IOSStyle.buttonHeight\n\n        radius: 2\n        color: !control.enabled ? control.IOSStyle.buttonDisabledColor : control.IOSStyle.buttonColor\n\n        PaddedRectangle {\n            y: parent.height - 4\n            width: parent.width\n            height: 4\n            radius: 2\n            topPadding: -2\n            clip: true\n            color: control.checked && control.enabled ? control.IOSStyle.accentColor : control.IOSStyle.secondaryTextColor\n\n            PaddedRectangle {\n                width: parent.width * control.progress\n                height: 4\n                radius: 2\n                topPadding: -2\n                rightPadding: Math.max(-2, width - parent.width)\n                clip: true\n                color: control.IOSStyle.accentColor\n            }\n        }\n\n        layer.enabled: control.enabled && control.IOSStyle.buttonColor.a > 0\n        layer.effect: ElevationEffect {\n            elevation: control.IOSStyle.elevation\n        }\n\n        Ripple {\n            clipRadius: 2\n            width: parent.width\n            height: parent.height\n            pressed: control.pressed\n            anchor: control\n            active: control.down || control.visualFocus || control.hovered\n            color: control.IOSStyle.rippleColor\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/Dial.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.Dial {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding) || 100 // ### remove 100 in Qt 6\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding) || 100 // ### remove 100 in Qt 6\n\n    background: Rectangle {\n        implicitWidth: 100\n        implicitHeight: 100\n\n        x: control.width / 2 - width / 2\n        y: control.height / 2 - height / 2\n        width: Math.max(64, Math.min(control.width, control.height))\n        height: width\n        color: \"transparent\"\n        radius: width / 2\n\n        border.color: control.enabled ? control.IOSStyle.accentColor : control.IOSStyle.hintTextColor\n    }\n\n    handle: SliderHandle {\n        x: background.x + background.width / 2 - handle.width / 2\n        y: background.y + background.height / 2 - handle.height / 2\n        transform: [\n            Translate {\n                y: -background.height * 0.4 + handle.height / 2\n            },\n            Rotation {\n                angle: control.angle\n                origin.x: handle.width / 2\n                origin.y: handle.height / 2\n            }\n        ]\n        implicitWidth: 10\n        implicitHeight: 10\n\n        value: control.value\n        handleHasFocus: control.visualFocus\n        handlePressed: control.pressed\n        handleHovered: control.hovered\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/Dialog.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.Dialog {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            contentWidth + leftPadding + rightPadding,\n                            implicitHeaderWidth,\n                            implicitFooterWidth)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             contentHeight + topPadding + bottomPadding\n                             + (implicitHeaderHeight > 0 ? implicitHeaderHeight + spacing : 0)\n                             + (implicitFooterHeight > 0 ? implicitFooterHeight + spacing : 0))\n\n    padding: 24\n    topPadding: 20\n\n    IOSStyle.elevation: 3\n    dim: true\n\n    enter: Transition {\n        // grow_fade_in\n        NumberAnimation { property: \"scale\"; from: 1.1; to: 1.0; easing.type: Easing.OutQuint; duration: 220 }\n        NumberAnimation { property: \"opacity\"; from: 0.0; to: 1.0; easing.type: Easing.OutCubic; duration: 150 }\n    }\n\n    exit: Transition {\n        // shrink_fade_out\n        NumberAnimation { property: \"opacity\"; from: 1.0; to: 0.0; easing.type: Easing.OutCubic; duration: 150 }\n    }\n\n    background: Rectangle {\n        radius: 10\n        color: control.IOSStyle.dialogColor\n\n        layer.enabled: control.IOSStyle.elevation > 0 && !control.dim\n        layer.effect: ElevationEffect {\n            elevation: control.IOSStyle.elevation\n        }\n    }\n\n    header: Label {\n        text: control.title\n        visible: control.title\n        elide: Label.ElideRight\n        padding: 24\n        bottomPadding: 0\n        // TODO: QPlatformTheme::TitleBarFont\n        font.bold: true\n        font.pixelSize: 16\n        background: PaddedRectangle {\n            radius: 2\n            color: control.IOSStyle.dialogColor\n            bottomPadding: -2\n            clip: true\n        }\n    }\n\n    footer: DialogButtonBox {\n        visible: count > 0\n    }\n\n    T.Overlay.modal: Rectangle {\n        color: control.IOSStyle.backgroundDimColor\n        Behavior on opacity { NumberAnimation { duration: 150 } }\n    }\n\n    T.Overlay.modeless: Rectangle {\n        color: control.IOSStyle.backgroundDimColor\n        Behavior on opacity { NumberAnimation { duration: 150 } }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/DialogButtonBox.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.DialogButtonBox {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            contentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             contentHeight + topPadding + bottomPadding)\n\n    spacing: 8\n    padding: 8\n    verticalPadding: 2\n    alignment: Qt.AlignRight\n    buttonLayout: T.DialogButtonBox.AndroidLayout\n\n    IOSStyle.foreground: IOSStyle.accent\n\n    delegate: Button { flat: true }\n\n    contentItem: ListView {\n        model: control.contentModel\n        spacing: control.spacing\n        orientation: ListView.Horizontal\n        boundsBehavior: Flickable.StopAtBounds\n        snapMode: ListView.SnapToItem\n    }\n\n    background: PaddedRectangle {\n        implicitHeight: control.IOSStyle.dialogButtonBoxHeight\n        radius: 2\n        color: control.IOSStyle.dialogColor\n        // Rounded corners should be only at the top or at the bottom\n        topPadding: control.position === T.DialogButtonBox.Footer ? -2 : 0\n        bottomPadding: control.position === T.DialogButtonBox.Header ? -2 : 0\n        clip: true\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/Drawer.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.Drawer {\n    id: control\n\n    parent: T.Overlay.overlay\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            contentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             contentHeight + topPadding + bottomPadding)\n\n    topPadding: !dim && edge === Qt.BottomEdge && IOSStyle.elevation === 0\n    leftPadding: !dim && edge === Qt.RightEdge && IOSStyle.elevation === 0\n    rightPadding: !dim && edge === Qt.LeftEdge && IOSStyle.elevation === 0\n    bottomPadding: !dim && edge === Qt.TopEdge && IOSStyle.elevation === 0\n\n    enter: Transition { SmoothedAnimation { velocity: 5 } }\n    exit: Transition { SmoothedAnimation { velocity: 5 } }\n\n    IOSStyle.elevation: !interactive && !dim ? 0 : 16\n\n    background: Rectangle {\n        color: control.IOSStyle.dialogColor\n\n        Rectangle {\n            readonly property bool horizontal: control.edge === Qt.LeftEdge || control.edge === Qt.RightEdge\n            width: horizontal ? 1 : parent.width\n            height: horizontal ? parent.height : 1\n            color: control.IOSStyle.dividerColor\n            x: control.edge === Qt.LeftEdge ? parent.width - 1 : 0\n            y: control.edge === Qt.TopEdge ? parent.height - 1 : 0\n            visible: !control.dim && control.IOSStyle.elevation === 0\n        }\n\n        layer.enabled: control.position > 0\n        layer.effect: ElevationEffect {\n            elevation: control.IOSStyle.elevation\n            fullHeight: true\n        }\n    }\n\n    T.Overlay.modal: Rectangle {\n        color: control.IOSStyle.backgroundDimColor\n        Behavior on opacity { NumberAnimation { duration: 150 } }\n    }\n\n    T.Overlay.modeless: Rectangle {\n        color: control.IOSStyle.backgroundDimColor\n        Behavior on opacity { NumberAnimation { duration: 150 } }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/ElevationEffect.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\n/*\n   An effect for standard IOSStyle Design elevation shadows. Useful for using as \\c layer.effect.\n */\nItem {\n    id: effect\n\n    /*\n       The source the effect is applied to.\n     */\n    property var source\n\n    /*\n       The elevation of the \\l source Item.\n     */\n    property int elevation: 0\n\n    /*\n       Set to \\c true if the \\l source Item is the same width as its parent and the shadow\n       should be full width instead of rounding around the corner of the Item.\n\n       \\sa fullHeight\n     */\n    property bool fullWidth: false\n\n    /*\n       Set to \\c true if the \\l source Item is the same height as its parent and the shadow\n       should be full height instead of rounding around the corner of the Item.\n\n       \\sa fullWidth\n     */\n    property bool fullHeight: false\n\n    /*\n       \\internal\n\n       The actual source Item the effect is applied to.\n     */\n    readonly property Item sourceItem: source.sourceItem\n\n    /*\n     * The following shadow values are taken from Angular IOSStyle\n     *\n     * The MIT License (MIT)\n     *\n     * Copyright (c) 2014-2016 Google, Inc. http://angularjs.org\n     *\n     * Permission is hereby granted, free of charge, to any person obtaining a copy\n     * of this software and associated documentation files (the \"Software\"), to deal\n     * in the Software without restriction, including without limitation the rights\n     * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n     * copies of the Software, and to permit persons to whom the Software is\n     * furnished to do so, subject to the following conditions:\n     *\n     * The above copyright notice and this permission notice shall be included in all\n     * copies or substantial portions of the Software.\n     *\n     * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n     * SOFTWARE.\n     */\n    /*\n       \\internal\n\n       The shadows to use for each possible elevation. There are three shadows that when combined\n       make up the elevation.\n     */\n    readonly property var _shadows: [\n        [{offset: 0, blur: 0, spread: 0},\n         {offset: 0, blur: 0, spread: 0},\n         {offset: 0, blur: 0, spread: 0}],\n\n        [{offset: 1, blur: 3, spread: 0},\n         {offset: 1, blur: 1, spread: 0},\n         {offset: 2, blur: 1, spread: -1}],\n\n        [{offset: 1, blur: 5, spread: 0},\n         {offset: 2, blur: 2, spread: 0},\n         {offset: 3, blur: 1, spread: -2}],\n\n        [{offset: 1, blur: 8, spread: 0},\n         {offset: 3, blur: 4, spread: 0},\n         {offset: 3, blur: 3, spread: -2}],\n\n        [{offset: 2, blur: 4, spread: -1},\n         {offset: 4, blur: 5, spread: 0},\n         {offset: 1, blur: 10, spread: 0}],\n\n        [{offset: 3, blur: 5, spread: -1},\n         {offset: 5, blur: 8, spread: 0},\n         {offset: 1, blur: 14, spread: 0}],\n\n        [{offset: 3, blur: 5, spread: -1},\n         {offset: 6, blur: 10, spread: 0},\n         {offset: 1, blur: 18, spread: 0}],\n\n        [{offset: 4, blur: 5, spread: -2},\n         {offset: 7, blur: 10, spread: 1},\n         {offset: 2, blur: 16, spread: 1}],\n\n        [{offset: 5, blur: 5, spread: -3},\n         {offset: 8, blur: 10, spread: 1},\n         {offset: 3, blur: 14, spread: 2}],\n\n        [{offset: 5, blur: 6, spread: -3},\n         {offset: 9, blur: 12, spread: 1},\n         {offset: 3, blur: 16, spread: 2}],\n\n        [{offset: 6, blur: 6, spread: -3},\n         {offset: 10, blur: 14, spread: 1},\n         {offset: 4, blur: 18, spread: 3}],\n\n        [{offset: 6, blur: 7, spread: -4},\n         {offset: 11, blur: 15, spread: 1},\n         {offset: 4, blur: 20, spread: 3}],\n\n        [{offset: 7, blur: 8, spread: -4},\n         {offset: 12, blur: 17, spread: 2},\n         {offset: 5, blur: 22, spread: 4}],\n\n        [{offset: 7, blur: 8, spread: -4},\n         {offset: 13, blur: 19, spread: 2},\n         {offset: 5, blur: 24, spread: 4}],\n\n        [{offset: 7, blur: 9, spread: -4},\n         {offset: 14, blur: 21, spread: 2},\n         {offset: 5, blur: 26, spread: 4}],\n\n        [{offset: 8, blur: 9, spread: -5},\n         {offset: 15, blur: 22, spread: 2},\n         {offset: 6, blur: 28, spread: 5}],\n\n        [{offset: 8, blur: 10, spread: -5},\n         {offset: 16, blur: 24, spread: 2},\n         {offset: 6, blur: 30, spread: 5}],\n\n        [{offset: 8, blur: 11, spread: -5},\n         {offset: 17, blur: 26, spread: 2},\n         {offset: 6, blur: 32, spread: 5}],\n\n        [{offset: 9, blur: 11, spread: -5},\n         {offset: 18, blur: 28, spread: 2},\n         {offset: 7, blur: 34, spread: 6}],\n\n        [{offset: 9, blur: 12, spread: -6},\n         {offset: 19, blur: 29, spread: 2},\n         {offset: 7, blur: 36, spread: 6}],\n\n        [{offset: 10, blur: 13, spread: -6},\n         {offset: 20, blur: 31, spread: 3},\n         {offset: 8, blur: 38, spread: 7}],\n\n        [{offset: 10, blur: 13, spread: -6},\n         {offset: 21, blur: 33, spread: 3},\n         {offset: 8, blur: 40, spread: 7}],\n\n        [{offset: 10, blur: 14, spread: -6},\n         {offset: 22, blur: 35, spread: 3},\n         {offset: 8, blur: 42, spread: 7}],\n\n        [{offset: 11, blur: 14, spread: -7},\n         {offset: 23, blur: 36, spread: 3},\n         {offset: 9, blur: 44, spread: 8}],\n\n        [{offset: 11, blur: 15, spread: -7},\n         {offset: 24, blur: 38, spread: 3},\n         {offset: 9, blur: 46, spread: 8}]\n    ]\n\n    /*\n       \\internal\n\n       The current shadow based on the elevation.\n     */\n    readonly property var _shadow: _shadows[Math.max(0, Math.min(elevation, _shadows.length - 1))]\n\n    // Nest the shadows and source view in two items rendered as a layer\n    // so the shadow is not clipped by the bounds of the source view\n    Item {\n        property int margin: -100\n\n        x: margin\n        y: margin\n        width: parent.width - 2 * margin\n        height: parent.height - 2 * margin\n\n        // By rendering as a layer, the shadow will never show through the source item,\n        // even when the source item's opacity is less than 1\n        layer.enabled: true\n\n        // The box shadows automatically pick up the size of the source Item and not\n        // the size of the parent, so we don't need to worry about the extra padding\n        // in the parent Item\n        BoxShadow {\n            offsetY: _shadow[0].offset\n            blurRadius: _shadow[0].blur\n            spreadRadius: _shadow[0].spread\n            color: Qt.rgba(0,0,0, 0.2)\n\n            fullWidth: effect.fullWidth\n            fullHeight: effect.fullHeight\n            source: effect.sourceItem\n        }\n\n        BoxShadow {\n            offsetY: _shadow[1].offset\n            blurRadius: _shadow[1].blur\n            spreadRadius: _shadow[1].spread\n            color: Qt.rgba(0,0,0, 0.14)\n\n            fullWidth: effect.fullWidth\n            fullHeight: effect.fullHeight\n            source: effect.sourceItem\n        }\n\n        BoxShadow {\n            offsetY: _shadow[2].offset\n            blurRadius: _shadow[2].blur\n            spreadRadius: _shadow[2].spread\n            color: Qt.rgba(0,0,0, 0.12)\n\n            fullWidth: effect.fullWidth\n            fullHeight: effect.fullHeight\n            source: effect.sourceItem\n        }\n\n        ShaderEffect {\n            property alias source: effect.source\n\n            x: (parent.width - width)/2\n            y: (parent.height - height)/2\n            width: sourceItem.width\n            height: sourceItem.height\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/FastDropShadow.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.GraphicalEffects 2.0\n\nItem {\n    id: item\n\n    property alias radius: blur.radius\n    property alias color: shadowMask.color\n    property real horizontalOffset\n    property real verticalOffset\n    property bool cached: true\n    property alias source: shadowArea.maskSource\n\n    FastBlur {\n        id: blur\n        x: parent.width/2 - width/2 + item.horizontalOffset\n        y: parent.height/2 - height/2 + item.verticalOffset\n        width: shadowScene.width\n        height: shadowScene.height\n        source: shadowScene\n        cached: item.cached\n    }\n\n    Item {\n        id: shadowScene\n        anchors.fill: parent\n        anchors.margins: -item.radius*2\n        visible: false\n\n        Item {\n            width: item.width\n            height: item.height\n            anchors.centerIn: parent\n\n            OpacityMask {\n                id: shadowArea\n                anchors.fill: parent\n                source: shadowMask\n                cached: item.cached\n            }\n\n            Rectangle {\n                id: shadowMask\n                color: \"#333\"\n                anchors.fill: parent\n                visible: false\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/Frame.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.Frame {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            contentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             contentHeight + topPadding + bottomPadding)\n\n    padding: 12\n    verticalPadding: IOSStyle.frameVerticalPadding\n\n    background: Rectangle {\n        radius: 2\n        color: control.IOSStyle.elevation > 0 ? control.IOSStyle.backgroundColor : \"transparent\"\n        border.color: control.IOSStyle.frameColor\n\n        layer.enabled: control.enabled && control.IOSStyle.elevation > 0\n        layer.effect: ElevationEffect {\n            elevation: control.IOSStyle.elevation\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/GroupBox.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.GroupBox {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            contentWidth + leftPadding + rightPadding,\n                            implicitLabelWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             contentHeight + topPadding + bottomPadding)\n\n    spacing: 6\n    padding: 12\n    topPadding: IOSStyle.frameVerticalPadding + (implicitLabelWidth > 0 ? implicitLabelHeight + spacing : 0)\n    bottomPadding: IOSStyle.frameVerticalPadding\n\n    label: Text {\n        x: control.leftPadding\n        width: control.availableWidth\n\n        text: control.title\n        font: control.font\n        color: control.enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n        elide: Text.ElideRight\n        verticalAlignment: Text.AlignVCenter\n    }\n\n    background: Rectangle {\n        y: control.topPadding - control.bottomPadding\n        width: parent.width\n        height: parent.height - control.topPadding + control.bottomPadding\n\n        radius: 2\n        color: control.IOSStyle.elevation > 0 ? control.IOSStyle.backgroundColor : \"transparent\"\n        border.color: control.IOSStyle.frameColor\n\n        layer.enabled: control.enabled && control.IOSStyle.elevation > 0\n        layer.effect: ElevationEffect {\n            elevation: control.IOSStyle.elevation\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/ItemDelegate.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.ItemDelegate {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding,\n                             implicitIndicatorHeight + topPadding + bottomPadding)\n\n    padding: 16\n    verticalPadding: 8\n    spacing: 16\n\n    icon.width: 24\n    icon.height: 24\n    icon.color: enabled ? IOSStyle.foreground : IOSStyle.hintTextColor\n\n    contentItem: IconLabel {\n        spacing: control.spacing\n        mirrored: control.mirrored\n        display: control.display\n        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft\n\n        icon: control.icon\n        text: control.text\n        font: control.font\n        color: control.enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n    }\n\n    background: Rectangle {\n        implicitHeight: control.IOSStyle.delegateHeight\n\n        color: control.highlighted ? control.IOSStyle.listHighlightColor : \"transparent\"\n\n        Rectangle {\n            width: parent.width\n            height: parent.height\n            visible: control.pressed || control.down || control.visualFocus || control.hovered\n            opacity: control.down || control.visualFocus || control.hovered? 0.5 : 1\n            color: control.IOSStyle.rippleColor\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/Label.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\n\nT.Label {\n    id: control\n\n    color: enabled ? IOSStyle.foreground : IOSStyle.hintTextColor\n    linkColor: IOSStyle.accentColor\n}\n"
  },
  {
    "path": "src/styles/iosstyle/Menu.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Controls 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\nimport QtQuick.Window 2.12\n\nT.Menu {\n    id: control\n\n    IOSStyle.elevation: 8\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            contentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             contentHeight + topPadding + bottomPadding)\n\n    margins: 0\n    verticalPadding: 8\n\n    transformOrigin: !cascade ? Item.Top : (mirrored ? Item.TopRight : Item.TopLeft)\n\n    delegate: MenuItem { }\n\n    enter: Transition {\n        // grow_fade_in\n        NumberAnimation { property: \"scale\"; from: 0.9; to: 1.0; easing.type: Easing.OutQuint; duration: 220 }\n        NumberAnimation { property: \"opacity\"; from: 0.0; to: 1.0; easing.type: Easing.OutCubic; duration: 150 }\n    }\n\n    exit: Transition {\n        // shrink_fade_out\n        NumberAnimation { property: \"scale\"; from: 1.0; to: 0.9; easing.type: Easing.OutQuint; duration: 220 }\n        NumberAnimation { property: \"opacity\"; from: 1.0; to: 0.0; easing.type: Easing.OutCubic; duration: 150 }\n    }\n\n    contentItem: ListView {\n        implicitHeight: contentHeight\n\n        model: control.contentModel\n        interactive: Window.window ? contentHeight > Window.window.height : false\n        clip: true\n        currentIndex: control.currentIndex\n\n        ScrollIndicator.vertical: ScrollIndicator {}\n    }\n\n    background: Rectangle {\n        implicitWidth: 200\n        implicitHeight: control.IOSStyle.menuItemHeight\n\n        radius: 3\n        color: control.IOSStyle.dialogColor\n\n        layer.enabled: control.IOSStyle.elevation > 0\n        layer.effect: ElevationEffect {\n            elevation: control.IOSStyle.elevation\n        }\n    }\n\n    T.Overlay.modal: Rectangle {\n        color: control.IOSStyle.backgroundDimColor\n        Behavior on opacity { NumberAnimation { duration: 150 } }\n    }\n\n    T.Overlay.modeless: Rectangle {\n        color: control.IOSStyle.backgroundDimColor\n        Behavior on opacity { NumberAnimation { duration: 150 } }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/MenuBar.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.MenuBar {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            contentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             contentHeight + topPadding + bottomPadding)\n\n    delegate: MenuBarItem { }\n\n    contentItem: Row {\n        spacing: control.spacing\n        Repeater {\n            model: control.contentModel\n        }\n    }\n\n    background: Rectangle {\n        implicitHeight: 40\n        color: control.IOSStyle.dialogColor\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/MenuBarItem.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.MenuBarItem {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding,\n                             implicitIndicatorHeight + topPadding + bottomPadding)\n\n    padding: 16\n    verticalPadding: 12\n    spacing: 16\n\n    icon.width: 24\n    icon.height: 24\n    icon.color: enabled ? IOSStyle.foreground : IOSStyle.hintTextColor\n\n    contentItem: IconLabel {\n        spacing: control.spacing\n        mirrored: control.mirrored\n        display: control.display\n        alignment: Qt.AlignLeft\n\n        icon: control.icon\n        text: control.text\n        font: control.font\n        color: control.enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n    }\n\n    background: Rectangle {\n        implicitWidth: 40\n        implicitHeight: 40\n        color: control.highlighted ? control.IOSStyle.listHighlightColor : \"transparent\"\n\n        Ripple {\n            width: parent.width\n            height: parent.height\n\n            clip: visible\n            pressed: control.pressed\n            anchor: control\n            active: control.down || control.highlighted\n            color: control.IOSStyle.rippleColor\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/MenuItem.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.MenuItem {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding,\n                             implicitIndicatorHeight + topPadding + bottomPadding)\n\n    padding: 16\n    verticalPadding: IOSStyle.menuItemVerticalPadding\n    spacing: 16\n\n    icon.width: 24\n    icon.height: 24\n    icon.color: enabled ? IOSStyle.foreground : IOSStyle.hintTextColor\n\n    indicator: CheckIndicator {\n        x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2\n        y: control.topPadding + (control.availableHeight - height) / 2\n        visible: control.checkable\n        control: control\n        checkState: control.checked ? Qt.Checked : Qt.Unchecked\n    }\n\n    arrow: ColorImage {\n        x: control.mirrored ? control.padding : control.width - width - control.padding\n        y: control.topPadding + (control.availableHeight - height) / 2\n\n        visible: control.subMenu\n        mirror: control.mirrored\n        color: control.enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n        source: \"qrc:/qt-project.org/imports/QtQuick/Controls.2/IOSStyle/images/arrow-indicator.png\"\n    }\n\n    contentItem: IconLabel {\n        readonly property real arrowPadding: control.subMenu && control.arrow ? control.arrow.width + control.spacing : 0\n        readonly property real indicatorPadding: control.checkable && control.indicator ? control.indicator.width + control.spacing : 0\n        leftPadding: !control.mirrored ? indicatorPadding : arrowPadding\n        rightPadding: control.mirrored ? indicatorPadding : arrowPadding\n\n        spacing: control.spacing\n        mirrored: control.mirrored\n        display: control.display\n        alignment: Qt.AlignLeft\n\n        icon: control.icon\n        text: control.text\n        font: control.font\n        color: control.enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n    }\n\n    background: Rectangle {\n        implicitWidth: 200\n        implicitHeight: control.IOSStyle.menuItemHeight\n        color: control.highlighted ? control.IOSStyle.listHighlightColor : \"transparent\"\n\n        Rectangle {\n            width: parent.width\n            height: parent.height\n            visible: control.pressed || control.down || control.highlighted\n            opacity: control.down || control.highlighted? 0.5 : 1\n            color: control.IOSStyle.rippleColor\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/MenuSeparator.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\n\nT.MenuSeparator {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding)\n\n    verticalPadding: 8\n\n    contentItem: Rectangle {\n        implicitWidth: 200\n        implicitHeight: 1\n        color: control.IOSStyle.dividerColor\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/Page.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\n\nT.Page {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            contentWidth + leftPadding + rightPadding,\n                            implicitHeaderWidth,\n                            implicitFooterWidth)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             contentHeight + topPadding + bottomPadding\n                             + (implicitHeaderHeight > 0 ? implicitHeaderHeight + spacing : 0)\n                             + (implicitFooterHeight > 0 ? implicitFooterHeight + spacing : 0))\n\n    background: Rectangle {\n        color: control.IOSStyle.backgroundColor\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/PageIndicator.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\n\nT.PageIndicator {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding)\n\n    padding: 6\n    spacing: 6\n\n    delegate: Rectangle {\n        implicitWidth: 8\n        implicitHeight: 8\n\n        radius: width / 2\n        color: control.enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n\n        opacity: index === currentIndex ? 0.95 : pressed ? 0.7 : 0.45\n        Behavior on opacity { OpacityAnimator { duration: 100 } }\n    }\n\n    contentItem: Row {\n        spacing: control.spacing\n\n        Repeater {\n            model: control.count\n            delegate: control.delegate\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/Pane.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.Pane {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            contentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             contentHeight + topPadding + bottomPadding)\n\n    padding: 12\n\n    background: Rectangle {\n        color: control.IOSStyle.backgroundColor\n        radius: control.IOSStyle.elevation > 0 ? 2 : 0\n\n        layer.enabled: control.enabled && control.IOSStyle.elevation > 0\n        layer.effect: ElevationEffect {\n            elevation: control.IOSStyle.elevation\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/Popup.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.Popup {\n    id: control\n    dim: true\n\n    IOSStyle.elevation: 3\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            contentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             contentHeight + topPadding + bottomPadding)\n\n    padding: 12\n\n    enter: Transition {\n        // grow_fade_in\n        NumberAnimation { property: \"scale\"; from: 1.1; to: 1.0; easing.type: Easing.OutQuint; duration: 220 }\n        NumberAnimation { property: \"opacity\"; from: 0.0; to: 1.0; easing.type: Easing.OutCubic; duration: 150 }\n    }\n\n    exit: Transition {\n        // shrink_fade_out\n        NumberAnimation { property: \"opacity\"; from: 1.0; to: 0.0; easing.type: Easing.OutCubic; duration: 150 }\n    }\n\n    background: Rectangle {\n        radius: 10\n        color: control.IOSStyle.dialogColor\n\n        layer.enabled: control.IOSStyle.elevation > 0 && !control.dim\n        layer.effect: ElevationEffect {\n            elevation: control.IOSStyle.elevation\n        }\n    }\n\n    T.Overlay.modal: Rectangle {\n        color: control.IOSStyle.backgroundDimColor\n        Behavior on opacity { NumberAnimation { duration: 150 } }\n    }\n\n    T.Overlay.modeless: Rectangle {\n        color: control.IOSStyle.backgroundDimColor\n        Behavior on opacity { NumberAnimation { duration: 150 } }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/ProgressBar.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.ProgressBar {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding)\n\n    contentItem: Rectangle {\n        implicitHeight: 2\n        width: control.position * parent.width\n        radius: 1\n        scale: control.mirrored ? -1 : 1\n        color: control.IOSStyle.accentColor\n    }\n\n    background: Rectangle {\n        implicitWidth: 200\n        implicitHeight: 2\n        y: (control.height - height) / 2\n        radius: 1\n        color: control.IOSStyle.secondaryTextColor\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/RadioButton.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.RadioButton {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding,\n                             implicitIndicatorHeight + topPadding + bottomPadding)\n\n    spacing: 8\n    padding: 8\n    verticalPadding: padding + 6\n\n    indicator: RadioIndicator {\n        x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2\n        y: control.topPadding + (control.availableHeight - height) / 2\n        control: control\n    }\n\n    contentItem: Text {\n        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0\n        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0\n\n        text: control.text\n        font: control.font\n        color: control.enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n        elide: Text.ElideRight\n        verticalAlignment: Text.AlignVCenter\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/RadioDelegate.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.RadioDelegate {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding,\n                             implicitIndicatorHeight + topPadding + bottomPadding)\n\n    padding: 16\n    verticalPadding: 8\n    spacing: 16\n\n    icon.width: 24\n    icon.height: 24\n    icon.color: enabled ? IOSStyle.foreground : IOSStyle.hintTextColor\n\n    indicator: RadioIndicator {\n        x: text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2\n        y: control.topPadding + (control.availableHeight - height) / 2\n        control: control\n    }\n\n    contentItem: IconLabel {\n        leftPadding: !control.mirrored ? 0 : control.indicator.width + control.spacing\n        rightPadding: control.mirrored ? 0 : control.indicator.width + control.spacing\n\n        spacing: control.spacing\n        mirrored: control.mirrored\n        display: control.display\n        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft\n\n        icon: control.icon\n        text: control.text\n        font: control.font\n        color: control.enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n    }\n\n    background: Rectangle {\n        implicitHeight: control.IOSStyle.delegateHeight\n\n        color: control.highlighted ? control.IOSStyle.listHighlightColor : \"transparent\"\n\n        Ripple {\n            width: parent.width\n            height: parent.height\n\n            clip: visible\n            pressed: control.pressed\n            anchor: control\n            active: control.down || control.visualFocus || control.hovered\n            color: control.IOSStyle.rippleColor\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/RadioIndicator.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nRectangle {\n    implicitWidth: 20\n    implicitHeight: 20\n    radius: width / 2\n    border.width: 2\n    border.color: !control.enabled ? control.IOSStyle.hintTextColor\n        : control.checked || control.down ? control.IOSStyle.accentColor : control.IOSStyle.secondaryTextColor\n    color: \"transparent\"\n\n    property Item control\n\n    Rectangle {\n        x: (parent.width - width) / 2\n        y: (parent.height - height) / 2\n        width: 10\n        height: 10\n        radius: width / 2\n        color: parent.border.color\n        visible: control.checked || control.down\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/RangeSlider.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.RangeSlider {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            first.implicitHandleWidth + leftPadding + rightPadding,\n                            second.implicitHandleWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             first.implicitHandleHeight + topPadding + bottomPadding,\n                             second.implicitHandleHeight + topPadding + bottomPadding)\n\n    padding: 6\n\n    first.handle: SliderHandle {\n        x: control.leftPadding + (control.horizontal ? control.first.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)\n        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.first.visualPosition * (control.availableHeight - height))\n        value: first.value\n        handleHasFocus: activeFocus\n        handlePressed: first.pressed\n        handleHovered: first.hovered\n    }\n\n    second.handle: SliderHandle {\n        x: control.leftPadding + (control.horizontal ? control.second.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)\n        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.second.visualPosition * (control.availableHeight - height))\n        value: second.value\n        handleHasFocus: activeFocus\n        handlePressed: second.pressed\n        handleHovered: second.hovered\n    }\n\n    background: Rectangle {\n        x: control.leftPadding + (control.horizontal ? 0 : (control.availableWidth - width) / 2)\n        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : 0)\n        implicitWidth: control.horizontal ? 200 : 48\n        implicitHeight: control.horizontal ? 48 : 200\n        width: control.horizontal ? control.availableWidth : 1\n        height: control.horizontal ? 1 : control.availableHeight\n        color: control.IOSStyle.foreground\n        scale:control.horizontal && control.mirrored ? -1 : 1\n\n        Rectangle {\n            x: control.horizontal ? control.first.position * parent.width : -1\n            y: control.horizontal ? -1 : control.second.visualPosition * parent.height + 3\n            width: control.horizontal ? control.second.position * parent.width - control.first.position * parent.width - 3 : 3\n            height: control.horizontal ? 3 : control.second.position * parent.height - control.first.position * parent.height - 3\n\n            color: control.IOSStyle.accentColor\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/RectangularGlow.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\n\n/*\n   A cross-graphics API implementation of QtGraphicalEffects' RectangularGlow.\n */\nItem {\n    id: rootItem\n\n    /*\n        This property defines how many pixels outside the item area are reached\n        by the glow.\n\n        The value ranges from 0.0 (no glow) to inf (infinite glow). By default,\n        the property is set to \\c 0.0.\n\n        \\table\n        \\header\n        \\li Output examples with different glowRadius values\n        \\li\n        \\li\n        \\row\n            \\li \\image RectangularGlow_glowRadius1.png\n            \\li \\image RectangularGlow_glowRadius2.png\n            \\li \\image RectangularGlow_glowRadius3.png\n        \\row\n            \\li \\b { glowRadius: 10 }\n            \\li \\b { glowRadius: 20 }\n            \\li \\b { glowRadius: 40 }\n        \\row\n            \\li \\l spread: 0\n            \\li \\l spread: 0\n            \\li \\l spread: 0\n        \\row\n            \\li \\l color: #ffffff\n            \\li \\l color: #ffffff\n            \\li \\l color: #ffffff\n        \\row\n            \\li \\l cornerRadius: 25\n            \\li \\l cornerRadius: 25\n            \\li \\l cornerRadius: 25\n        \\endtable\n\n    */\n    property real glowRadius: 0.0\n\n    /*\n        This property defines how large part of the glow color is strenghtened\n        near the source edges.\n\n        The value ranges from 0.0 (no strenght increase) to 1.0 (maximum\n        strenght increase). By default, the property is set to \\c 0.0.\n\n        \\table\n        \\header\n        \\li Output examples with different spread values\n        \\li\n        \\li\n        \\row\n            \\li \\image RectangularGlow_spread1.png\n            \\li \\image RectangularGlow_spread2.png\n            \\li \\image RectangularGlow_spread3.png\n        \\row\n            \\li \\b { spread: 0.0 }\n            \\li \\b { spread: 0.5 }\n            \\li \\b { spread: 1.0 }\n        \\row\n            \\li \\l glowRadius: 20\n            \\li \\l glowRadius: 20\n            \\li \\l glowRadius: 20\n        \\row\n            \\li \\l color: #ffffff\n            \\li \\l color: #ffffff\n            \\li \\l color: #ffffff\n        \\row\n            \\li \\l cornerRadius: 25\n            \\li \\l cornerRadius: 25\n            \\li \\l cornerRadius: 25\n        \\endtable\n    */\n    property real spread: 0.0\n\n    /*\n        This property defines the RGBA color value which is used for the glow.\n\n        By default, the property is set to \\c \"white\".\n\n        \\table\n        \\header\n        \\li Output examples with different color values\n        \\li\n        \\li\n        \\row\n            \\li \\image RectangularGlow_color1.png\n            \\li \\image RectangularGlow_color2.png\n            \\li \\image RectangularGlow_color3.png\n        \\row\n            \\li \\b { color: #ffffff }\n            \\li \\b { color: #55ff55 }\n            \\li \\b { color: #5555ff }\n        \\row\n            \\li \\l glowRadius: 20\n            \\li \\l glowRadius: 20\n            \\li \\l glowRadius: 20\n        \\row\n            \\li \\l spread: 0\n            \\li \\l spread: 0\n            \\li \\l spread: 0\n        \\row\n            \\li \\l cornerRadius: 25\n            \\li \\l cornerRadius: 25\n            \\li \\l cornerRadius: 25\n        \\endtable\n    */\n    property color color: \"white\"\n\n    /*\n        This property defines the corner radius that is used to draw a glow with\n        rounded corners.\n\n        The value ranges from 0.0 to half of the effective width or height of\n        the glow, whichever is smaller. This can be calculated with: \\c{\n        min(width, height) / 2.0 + glowRadius}\n\n        By default, the property is bound to glowRadius property. The glow\n        behaves as if the rectangle was blurred when adjusting the glowRadius\n        property.\n\n        \\table\n        \\header\n        \\li Output examples with different cornerRadius values\n        \\li\n        \\li\n        \\row\n            \\li \\image RectangularGlow_cornerRadius1.png\n            \\li \\image RectangularGlow_cornerRadius2.png\n            \\li \\image RectangularGlow_cornerRadius3.png\n        \\row\n            \\li \\b { cornerRadius: 0 }\n            \\li \\b { cornerRadius: 25 }\n            \\li \\b { cornerRadius: 50 }\n        \\row\n            \\li \\l glowRadius: 20\n            \\li \\l glowRadius: 20\n            \\li \\l glowRadius: 20\n        \\row\n            \\li \\l spread: 0\n            \\li \\l spread: 0\n            \\li \\l spread: 0\n        \\row\n            \\li \\l color: #ffffff\n            \\li \\l color: #ffffff\n            \\li \\l color: #ffffff\n        \\endtable\n    */\n    property real cornerRadius: glowRadius\n\n    /*\n        This property allows the effect output pixels to be cached in order to\n        improve the rendering performance.\n\n        Every time the source or effect properties are changed, the pixels in\n        the cache must be updated. Memory consumption is increased, because an\n        extra buffer of memory is required for storing the effect output.\n\n        It is recommended to disable the cache when the source or the effect\n        properties are animated.\n\n        By default, the property is set to \\c false.\n    */\n    property bool cached: false\n\n    ShaderEffectSource {\n         id: cacheItem\n         anchors.fill: shaderItem\n         visible: rootItem.cached\n         smooth: true\n         sourceItem: shaderItem\n         live: true\n         hideSource: visible\n     }\n\n    ShaderEffect {\n        id: shaderItem\n\n        x: (parent.width - width) / 2.0\n        y: (parent.height - height) / 2.0\n        width: parent.width + rootItem.glowRadius * 2 + cornerRadius * 2\n        height: parent.height + rootItem.glowRadius * 2 + cornerRadius * 2\n\n        function clampedCornerRadius() {\n            var maxCornerRadius = Math.min(rootItem.width, rootItem.height) / 2 + glowRadius;\n            return Math.max(0, Math.min(rootItem.cornerRadius, maxCornerRadius))\n        }\n\n        property color color: rootItem.color\n        property real inverseSpread: 1.0 - rootItem.spread\n        property real relativeSizeX: ((inverseSpread * inverseSpread) * rootItem.glowRadius + cornerRadius * 2.0) / width\n        property real relativeSizeY: relativeSizeX * (width / height)\n        property real spread: rootItem.spread / 2.0\n        property real cornerRadius: clampedCornerRadius()\n\n        fragmentShader: \"qrc:/qt-project.org/imports/QtQuick/Controls.2/IOSStyle/shaders/RectangularGlow.frag\"\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/RoundButton.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.RoundButton {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding)\n\n    topInset: 6\n    leftInset: 6\n    rightInset: 6\n    bottomInset: 6\n    padding: 12\n    spacing: 6\n\n    icon.width: 24\n    icon.height: 24\n    icon.color: !enabled ? IOSStyle.hintTextColor :\n        flat && highlighted ? IOSStyle.accentColor :\n        highlighted ? IOSStyle.primaryHighlightedTextColor : IOSStyle.foreground\n\n    IOSStyle.background: flat ? \"transparent\" : undefined\n\n    contentItem: IconLabel {\n        spacing: control.spacing\n        mirrored: control.mirrored\n        display: control.display\n\n        icon: control.icon\n        text: control.text\n        font: control.font\n        color: !control.enabled ? control.IOSStyle.hintTextColor :\n            control.flat && control.highlighted ? control.IOSStyle.accentColor :\n            control.highlighted ? control.IOSStyle.primaryHighlightedTextColor : control.IOSStyle.foreground\n    }\n\n    // TODO: Add a proper ripple/ink effect for mouse/touch input and focus state\n    background: Rectangle {\n        implicitWidth: control.IOSStyle.buttonHeight\n        implicitHeight: control.IOSStyle.buttonHeight\n\n        radius: control.radius\n        opacity: control.flat? (control.pressed? 0.2 : 0) : 1\n        border.width: 0\n        color: {\n            if(!control.enabled)\n                return control.IOSStyle.buttonDisabledColor\n\n            if (control.highlighted)\n                return Qt.lighter(control.IOSStyle.highlightedButtonColor, control.pressed? 1.2 : 1)\n            if (control.flat)\n                return control.IOSStyle.foreground\n            else\n                return Qt.darker(control.IOSStyle.backgroundColor, control.pressed? 1.05 : 1)\n        }\n\n        Behavior on border.color {\n            ColorAnimation {\n                duration: 250\n            }\n        }\n\n        Behavior on color {\n            ColorAnimation {\n                duration: 250\n            }\n        }\n\n        Behavior on opacity {\n            NumberAnimation {\n                duration: 250\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/ScrollBar.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\n\nT.ScrollBar {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding)\n\n    padding: control.interactive ? 1 : 2\n    visible: control.policy !== T.ScrollBar.AlwaysOff\n\n    contentItem: Rectangle {\n        implicitWidth: control.interactive ? 13 : 4\n        implicitHeight: control.interactive ? 13 : 4\n\n        color: control.pressed ? control.IOSStyle.scrollBarPressedColor :\n               control.interactive && control.hovered ? control.IOSStyle.scrollBarHoveredColor : control.IOSStyle.scrollBarColor\n        opacity: 0.0\n    }\n\n    background: Rectangle {\n        implicitWidth: control.interactive ? 16 : 4\n        implicitHeight: control.interactive ? 16 : 4\n        color: \"#0e000000\"\n        opacity: 0.0\n        visible: control.interactive\n    }\n\n    states: State {\n        name: \"active\"\n        when: control.policy === T.ScrollBar.AlwaysOn || (control.active && control.size < 1.0)\n    }\n\n    transitions: [\n        Transition {\n            to: \"active\"\n            NumberAnimation { targets: [contentItem, background]; property: \"opacity\"; to: 1.0 }\n        },\n        Transition {\n            from: \"active\"\n            SequentialAnimation {\n                PropertyAction{ targets: [contentItem, background]; property: \"opacity\"; value: 1.0 }\n                PauseAnimation { duration: 2450 }\n                NumberAnimation { targets: [contentItem, background]; property: \"opacity\"; to: 0.0 }\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "src/styles/iosstyle/ScrollIndicator.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\n\nT.ScrollIndicator {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding)\n\n    padding: 2\n\n    contentItem: Rectangle {\n        implicitWidth: 4\n        implicitHeight: 4\n\n        color: control.IOSStyle.scrollBarColor\n        visible: control.size < 1.0\n        opacity: 0.0\n\n        states: State {\n            name: \"active\"\n            when: control.active\n            PropertyChanges { target: control.contentItem; opacity: 0.75 }\n        }\n\n        transitions: [\n            Transition {\n                from: \"active\"\n                SequentialAnimation {\n                    PauseAnimation { duration: 450 }\n                    NumberAnimation { target: control.contentItem; duration: 200; property: \"opacity\"; to: 0.0 }\n                }\n            }\n        ]\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/Slider.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.Slider {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitHandleWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitHandleHeight + topPadding + bottomPadding)\n\n    padding: 6\n\n    handle: SliderHandle {\n        x: control.leftPadding + (control.horizontal ? control.visualPosition * (control.availableWidth - width) : (control.availableWidth - width) / 2)\n        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : control.visualPosition * (control.availableHeight - height))\n        value: control.value\n        handleHasFocus: control.visualFocus\n        handlePressed: control.pressed\n        handleHovered: control.hovered\n    }\n\n    background: Rectangle {\n        x: control.leftPadding + (control.horizontal ? 0 : (control.availableWidth - width) / 2)\n        y: control.topPadding + (control.horizontal ? (control.availableHeight - height) / 2 : 0)\n        implicitWidth: control.horizontal ? 200 : 48\n        implicitHeight: control.horizontal ? 48 : 200\n        width: control.horizontal ? control.availableWidth : 2\n        height: control.horizontal ? 2 : control.availableHeight\n        color: control.IOSStyle.sliderForegroundColor\n        scale: control.horizontal && control.mirrored ? -1 : 1\n        radius: 1\n\n        Rectangle {\n            x: control.horizontal ? 0 : (parent.width - width) / 2\n            y: control.horizontal ? (parent.height - height) / 2 : control.visualPosition * parent.height\n            width: control.horizontal ? control.position * parent.width : 2\n            height: control.horizontal ? 2 : control.position * parent.height\n            radius: 1\n\n            color: control.IOSStyle.sliderBackgroundColor\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/SliderHandle.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nItem {\n    id: root\n    implicitWidth: initialSize\n    implicitHeight: initialSize\n\n    property real value: 0\n    property bool handleHasFocus: false\n    property bool handlePressed: false\n    property bool handleHovered: false\n    readonly property int initialSize: 22\n    readonly property var control: parent\n\n    FastDropShadow {\n        anchors.fill: handleRect\n        source: handleRect\n        horizontalOffset: 0\n        verticalOffset: 1.5\n        radius: 4\n        opacity: 0.5\n        color: \"#333\"\n    }\n\n    Rectangle {\n        id: handleRect\n        width: parent.width\n        height: parent.height\n        radius: width / 2\n        color: root.control.IOSStyle.sliderHandleColor\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/SpinBox.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.SpinBox {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            contentItem.implicitWidth +\n                            up.implicitIndicatorWidth +\n                            down.implicitIndicatorWidth)\n    implicitHeight: Math.max(implicitContentHeight + topPadding + bottomPadding,\n                             implicitBackgroundHeight,\n                             up.implicitIndicatorHeight,\n                             down.implicitIndicatorHeight)\n\n    spacing: 6\n    topPadding: 8\n    bottomPadding: 16\n    leftPadding: (control.mirrored ? (up.indicator ? up.indicator.width : 0) : (down.indicator ? down.indicator.width : 0))\n    rightPadding: (control.mirrored ? (down.indicator ? down.indicator.width : 0) : (up.indicator ? up.indicator.width : 0))\n\n    validator: IntValidator {\n        locale: control.locale.name\n        bottom: Math.min(control.from, control.to)\n        top: Math.max(control.from, control.to)\n    }\n\n    contentItem: TextInput {\n        text: control.displayText\n\n        font: control.font\n        color: enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n        selectionColor: control.IOSStyle.textSelectionColor\n        selectedTextColor: control.IOSStyle.foreground\n        horizontalAlignment: Qt.AlignHCenter\n        verticalAlignment: Qt.AlignVCenter\n\n        cursorDelegate: CursorDelegate { }\n\n        readOnly: !control.editable\n        validator: control.validator\n        inputMethodHints: control.inputMethodHints\n    }\n\n    up.indicator: Item {\n        x: control.mirrored ? 0 : parent.width - width\n        implicitWidth: control.IOSStyle.touchTarget\n        implicitHeight: control.IOSStyle.touchTarget\n        height: parent.height\n        width: height\n\n        Ripple {\n            clipRadius: 2\n            x: control.spacing\n            y: control.spacing\n            width: parent.width - 2 * control.spacing\n            height: parent.height - 2 * control.spacing\n            pressed: control.up.pressed\n            active: control.up.pressed || control.up.hovered || control.visualFocus\n            color: control.IOSStyle.rippleColor\n        }\n\n        Rectangle {\n            x: (parent.width - width) / 2\n            y: (parent.height - height) / 2\n            width: Math.min(parent.width / 3, parent.height / 3)\n            height: 2\n            color: enabled ? control.IOSStyle.foreground : control.IOSStyle.spinBoxDisabledIconColor\n        }\n        Rectangle {\n            x: (parent.width - width) / 2\n            y: (parent.height - height) / 2\n            width: 2\n            height: Math.min(parent.width / 3, parent.height / 3)\n            color: enabled ? control.IOSStyle.foreground : control.IOSStyle.spinBoxDisabledIconColor\n        }\n    }\n\n    down.indicator: Item {\n        x: control.mirrored ? parent.width - width : 0\n        implicitWidth: control.IOSStyle.touchTarget\n        implicitHeight: control.IOSStyle.touchTarget\n        height: parent.height\n        width: height\n\n        Ripple {\n            clipRadius: 2\n            x: control.spacing\n            y: control.spacing\n            width: parent.width - 2 * control.spacing\n            height: parent.height - 2 * control.spacing\n            pressed: control.down.pressed\n            active: control.down.pressed || control.down.hovered || control.visualFocus\n            color: control.IOSStyle.rippleColor\n        }\n\n        Rectangle {\n            x: (parent.width - width) / 2\n            y: (parent.height - height) / 2\n            width: parent.width / 3\n            height: 2\n            color: enabled ? control.IOSStyle.foreground : control.IOSStyle.spinBoxDisabledIconColor\n        }\n    }\n\n    background: Item {\n        implicitWidth: 192\n        implicitHeight: control.IOSStyle.touchTarget\n\n        Rectangle {\n            x: parent.width / 2 - width / 2\n            y: parent.y + parent.height - height - control.bottomPadding / 2\n            width: control.availableWidth\n            height: control.activeFocus ? 2 : 1\n            color: control.activeFocus ? control.IOSStyle.accentColor : control.IOSStyle.hintTextColor\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/StackView.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\n\nT.StackView {\n    id: control\n\n    popEnter: Transition {\n        // slide_in_left\n        NumberAnimation { property: \"x\"; from: (control.mirrored ? -0.5 : 0.5) *  -control.width; to: 0; duration: 200; easing.type: Easing.OutCubic }\n        NumberAnimation { property: \"opacity\"; from: 0.0; to: 1.0; duration: 200; easing.type: Easing.OutCubic }\n    }\n\n    popExit: Transition {\n        // slide_out_right\n        NumberAnimation { property: \"x\"; from: 0; to: (control.mirrored ? -0.5 : 0.5) * control.width; duration: 200; easing.type: Easing.OutCubic }\n        NumberAnimation { property: \"opacity\"; from: 1.0; to: 0.0; duration: 200; easing.type: Easing.OutCubic }\n    }\n\n    pushEnter: Transition {\n        // slide_in_right\n        NumberAnimation { property: \"x\"; from: (control.mirrored ? -0.5 : 0.5) * control.width; to: 0; duration: 200; easing.type: Easing.OutCubic }\n        NumberAnimation { property: \"opacity\"; from: 0.0; to: 1.0; duration: 200; easing.type: Easing.OutCubic }\n    }\n\n    pushExit: Transition {\n        // slide_out_left\n        NumberAnimation { property: \"x\"; from: 0; to: (control.mirrored ? -0.5 : 0.5) * -control.width; duration: 200; easing.type: Easing.OutCubic }\n        NumberAnimation { property: \"opacity\"; from: 1.0; to: 0.0; duration: 200; easing.type: Easing.OutCubic }\n    }\n\n    replaceEnter: Transition {\n        // slide_in_right\n        NumberAnimation { property: \"x\"; from: (control.mirrored ? -0.5 : 0.5) * control.width; to: 0; duration: 200; easing.type: Easing.OutCubic }\n        NumberAnimation { property: \"opacity\"; from: 0.0; to: 1.0; duration: 200; easing.type: Easing.OutCubic }\n    }\n\n    replaceExit: Transition {\n        // slide_out_left\n        NumberAnimation { property: \"x\"; from: 0; to: (control.mirrored ? -0.5 : 0.5) * -control.width; duration: 200; easing.type: Easing.OutCubic }\n        NumberAnimation { property: \"opacity\"; from: 1.0; to: 0.0; duration: 200; easing.type: Easing.OutCubic }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/SwipeDelegate.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.SwipeDelegate {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding,\n                             implicitIndicatorHeight + topPadding + bottomPadding)\n\n    padding: 16\n    verticalPadding: 8\n    spacing: 16\n\n    icon.width: 24\n    icon.height: 24\n    icon.color: enabled ? IOSStyle.foreground : IOSStyle.hintTextColor\n\n    swipe.transition: Transition { SmoothedAnimation { velocity: 3; easing.type: Easing.InOutCubic } }\n\n    contentItem: IconLabel {\n        spacing: control.spacing\n        mirrored: control.mirrored\n        display: control.display\n        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft\n\n        icon: control.icon\n        text: control.text\n        font: control.font\n        color: control.enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n    }\n\n    background: Rectangle {\n        implicitHeight: control.IOSStyle.delegateHeight\n\n        color: control.IOSStyle.backgroundColor\n\n        Rectangle {\n            width: parent.width\n            height: parent.height\n            visible: control.highlighted\n            color: control.IOSStyle.listHighlightColor\n        }\n\n        Ripple {\n            width: parent.width\n            height: parent.height\n\n            clip: visible\n            pressed: control.pressed\n            anchor: control\n            active: control.down || control.visualFocus || control.hovered\n            color: control.IOSStyle.rippleColor\n            enabled: control.swipe.position === 0\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/SwipeView.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\n\nT.SwipeView {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            contentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             contentHeight + topPadding + bottomPadding)\n\n    contentItem: ListView {\n        model: control.contentModel\n        interactive: control.interactive\n        currentIndex: control.currentIndex\n\n        spacing: control.spacing\n        orientation: control.orientation\n        snapMode: ListView.SnapOneItem\n        boundsBehavior: Flickable.StopAtBounds\n\n        highlightRangeMode: ListView.StrictlyEnforceRange\n        preferredHighlightBegin: 0\n        preferredHighlightEnd: 0\n        highlightMoveDuration: 250\n        maximumFlickVelocity: 4 * (control.orientation === Qt.Horizontal ? width : height)\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/Switch.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\nimport QtQuick.Templates 2.12 as T\n\nT.Switch {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding,\n                             implicitIndicatorHeight + topPadding + bottomPadding)\n\n    padding: 8\n    spacing: 8\n\n    indicator: SwitchIndicator {\n        x: text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2\n        y: control.topPadding + (control.availableHeight - height) / 2\n        control: control\n\n\n    }\n\n    contentItem: Text {\n        leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0\n        rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0\n\n        text: control.text\n        font: control.font\n        color: control.enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n        elide: Text.ElideRight\n        verticalAlignment: Text.AlignVCenter\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/SwitchDelegate.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.SwitchDelegate {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding,\n                             implicitIndicatorHeight + topPadding + bottomPadding)\n\n    padding: 16\n    verticalPadding: IOSStyle.switchDelegateVerticalPadding\n    spacing: 16\n\n    icon.width: 24\n    icon.height: 24\n    icon.color: enabled ? IOSStyle.foreground : IOSStyle.hintTextColor\n\n    indicator: SwitchIndicator {\n        x: text ? (control.mirrored ? control.leftPadding : control.width - width - control.rightPadding) : control.leftPadding + (control.availableWidth - width) / 2\n        y: control.topPadding + (control.availableHeight - height) / 2\n        control: control\n    }\n\n    contentItem: IconLabel {\n        leftPadding: !control.mirrored ? 0 : control.indicator.width + control.spacing\n        rightPadding: control.mirrored ? 0 : control.indicator.width + control.spacing\n\n        spacing: control.spacing\n        mirrored: control.mirrored\n        display: control.display\n        alignment: control.display === IconLabel.IconOnly || control.display === IconLabel.TextUnderIcon ? Qt.AlignCenter : Qt.AlignLeft\n\n        icon: control.icon\n        text: control.text\n        font: control.font\n        color: control.enabled ? control.IOSStyle.foreground : control.IOSStyle.hintTextColor\n    }\n\n    background: Rectangle {\n        implicitHeight: control.IOSStyle.delegateHeight\n\n        color: control.highlighted ? control.IOSStyle.listHighlightColor : \"transparent\"\n\n        Rectangle {\n            width: parent.width\n            height: parent.height\n            visible: control.pressed || control.down || control.visualFocus || control.hovered\n            opacity: control.down || control.visualFocus || control.hovered? 0.5 : 1\n            color: control.IOSStyle.rippleColor\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/SwitchIndicator.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nItem {\n    id: indicator\n    implicitWidth: 46\n    implicitHeight: 39\n\n    property Item control\n    property alias handle: handle\n\n//    IOSStyle.elevation: 1\n\n    Rectangle {\n        width: parent.width\n        height: 28\n        radius: height / 2\n        y: parent.height / 2 - height / 2\n\n        color: {\n            if(!control.enabled)\n                return control.IOSStyle.switchDisabledTrackColor\n\n            var s0 = control.IOSStyle.switchCheckedTrackColor\n            var s1 = Qt.darker(control.IOSStyle.switchUncheckedTrackColor, 1.1)\n            var pos = LayoutMirroring.enabled? control.visualPosition : 1 - control.visualPosition\n            return Qt.rgba( s0.r*(1-pos) + s1.r*pos, s0.g*(1-pos) + s1.g*pos, s0.b*(1-pos) + s1.b*pos )\n        }\n\n        Behavior on color {\n            ColorAnimation { easing.type: Easing.OutCubic; duration: 150 }\n        }\n    }\n\n    FastDropShadow {\n        anchors.fill: handle\n        source: handle\n        horizontalOffset: 0\n        verticalOffset: 1.5\n        radius: 4\n        opacity: 0.5\n        color: \"#333\"\n    }\n\n    Rectangle {\n        id: handle\n        x: Math.max(1.5, Math.min(parent.width - width, control.visualPosition * parent.width - (width / 2)) - 1.5)\n        y: (parent.height - height) / 2\n        width: 24\n        height: 24\n        radius: width / 2\n        color: control.enabled ? control.IOSStyle.switchHandleColor\n                               : control.IOSStyle.switchDisabledHandleColor\n\n        Behavior on x {\n            enabled: !control.pressed\n            SmoothedAnimation {\n                duration: 300\n            }\n        }\n        layer.enabled: indicator.IOSStyle.elevation > 0\n        layer.effect: ElevationEffect {\n            elevation: indicator.IOSStyle.elevation\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/TabBar.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.TabBar {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            contentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             contentHeight + topPadding + bottomPadding)\n\n    spacing: 1\n\n    contentItem: ListView {\n        model: control.contentModel\n        currentIndex: control.currentIndex\n\n        spacing: control.spacing\n        orientation: ListView.Horizontal\n        boundsBehavior: Flickable.StopAtBounds\n        flickableDirection: Flickable.AutoFlickIfNeeded\n        snapMode: ListView.SnapToItem\n\n        highlightMoveDuration: 250\n        highlightResizeDuration: 0\n        highlightFollowsCurrentItem: true\n        highlightRangeMode: ListView.ApplyRange\n        preferredHighlightBegin: 48\n        preferredHighlightEnd: width - 48\n\n        highlight: Item {\n            FastDropShadow {\n                anchors.fill: back\n                source: back\n                horizontalOffset: 0\n                verticalOffset: 1\n                radius: 5\n                opacity: 0.2\n                color: control.IOSStyle.foreground\n            }\n\n            Rectangle {\n                id: back\n                anchors.fill: parent\n                anchors.margins: 7\n                color: control.IOSStyle.backgroundColor\n                radius: 8\n\n                Rectangle {\n                    anchors.fill: parent\n                    color: \"#fff\"\n                    radius: 8\n                    opacity: 0.3\n                }\n            }\n        }\n    }\n\n    background: Item {\n\n        Rectangle {\n            anchors.fill: parent\n            anchors.margins: 4\n            radius: 10\n            color: control.IOSStyle.backgroundColor\n        }\n\n        Rectangle {\n            anchors.fill: parent\n            anchors.margins: 4\n            color: control.IOSStyle.foreground\n            opacity: 0.1\n            radius: 10\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/TabButton.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.TabButton {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding)\n\n    spacing: 6\n\n    icon.width: 24\n    icon.height: 24\n    icon.color: !enabled ? IOSStyle.hintTextColor : IOSStyle.foreground\n\n    contentItem: IconLabel {\n        spacing: control.spacing\n        mirrored: control.mirrored\n        display: control.display\n\n        icon: control.icon\n        text: control.text\n        font: control.font\n        color: !control.enabled ? control.IOSStyle.hintTextColor : control.IOSStyle.foreground\n    }\n\n    background: Item {\n        implicitHeight: control.IOSStyle.touchTarget\n\n        Rectangle {\n            anchors.fill: parent\n            anchors.margins: 7\n            radius: 8\n            visible: control.pressed || control.down || control.visualFocus || control.hovered\n            opacity: control.down || control.visualFocus || control.hovered? 0.5 : 1\n            color: control.IOSStyle.backgroundColor\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/TextArea.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.TextArea {\n    id: control\n\n    implicitWidth: Math.max(contentWidth + leftPadding + rightPadding,\n                            implicitBackgroundWidth + leftInset + rightInset,\n                            placeholder.implicitWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(contentHeight + topPadding + bottomPadding,\n                             implicitBackgroundHeight + topInset + bottomInset,\n                             placeholder.implicitHeight + 1 + topPadding + bottomPadding)\n\n    topPadding: 14\n    bottomPadding: 6\n    leftPadding: 10\n    rightPadding: 10\n\n    topInset: 8\n\n    color: enabled ? IOSStyle.foreground : IOSStyle.hintTextColor\n    selectionColor: IOSStyle.accentColor\n    selectedTextColor: IOSStyle.primaryHighlightedTextColor\n    placeholderTextColor: IOSStyle.hintTextColor\n    cursorDelegate: CursorDelegate { }\n\n    PlaceholderText {\n        id: placeholder\n        x: control.leftPadding\n        y: control.topPadding\n        width: control.width - (control.leftPadding + control.rightPadding)\n        height: control.height - (control.topPadding + control.bottomPadding)\n        text: control.placeholderText\n        font: control.font\n        color: control.placeholderTextColor\n        verticalAlignment: control.verticalAlignment\n        elide: Text.ElideRight\n        renderType: control.renderType\n        visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)\n    }\n\n    background: Item {\n        implicitWidth: 120\n\n        Rectangle {\n            anchors.fill: parent\n            radius: 10\n            color: control.IOSStyle.foreground\n            opacity: 0.1\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/TextField.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.TextField {\n    id: control\n\n    implicitWidth: implicitBackgroundWidth + leftInset + rightInset\n                   || Math.max(contentWidth, placeholder.implicitWidth) + leftPadding + rightPadding\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             contentHeight + topPadding + bottomPadding,\n                             placeholder.implicitHeight + topPadding + bottomPadding)\n\n    topPadding: 14\n    bottomPadding: 6\n    leftPadding: 10\n    rightPadding: 10\n    topInset: 8\n\n    color: enabled ? IOSStyle.foreground : IOSStyle.hintTextColor\n    selectionColor: IOSStyle.accentColor\n    selectedTextColor: IOSStyle.primaryHighlightedTextColor\n    placeholderTextColor: IOSStyle.hintTextColor\n    verticalAlignment: TextInput.AlignVCenter\n\n    cursorDelegate: CursorDelegate { }\n\n    PlaceholderText {\n        id: placeholder\n        x: control.leftPadding\n        y: control.topPadding\n        width: control.width - (control.leftPadding + control.rightPadding)\n        height: control.height - (control.topPadding + control.bottomPadding)\n        text: control.placeholderText\n        font: control.font\n        color: control.placeholderTextColor\n        verticalAlignment: control.verticalAlignment\n        elide: Text.ElideRight\n        renderType: control.renderType\n        visible: !control.length && !control.preeditText && (!control.activeFocus || control.horizontalAlignment !== Qt.AlignHCenter)\n    }\n\n    background: Item {\n        implicitWidth: 120\n\n        Rectangle {\n            anchors.fill: parent\n            radius: 10\n            color: control.IOSStyle.foreground\n            opacity: 0.1\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/ToolBar.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.ToolBar {\n    id: control\n\n    IOSStyle.elevation: 4\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            contentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             contentHeight + topPadding + bottomPadding)\n\n    IOSStyle.foreground: IOSStyle.toolTextColor\n\n    spacing: 16\n\n    background: Rectangle {\n        implicitHeight: 48\n        color: control.IOSStyle.toolBarColor\n\n        layer.enabled: control.IOSStyle.elevation > 0\n        layer.effect: ElevationEffect {\n            elevation: control.IOSStyle.elevation\n            fullWidth: true\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/ToolButton.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Controls.IOSStyle 2.0\nimport QtQuick.Controls.IOSStyle.impl 2.0\n\nT.ToolButton {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding)\n\n    padding: 6\n    spacing: 6\n\n    icon.width: 24\n    icon.height: 24\n    icon.color: !enabled ? IOSStyle.hintTextColor : checked || highlighted ? IOSStyle.accent : IOSStyle.foreground\n\n    contentItem: IconLabel {\n        spacing: control.spacing\n        mirrored: control.mirrored\n        display: control.display\n\n        icon: control.icon\n        text: control.text\n        font: control.font\n        color: !control.enabled ? control.IOSStyle.hintTextColor :\n                control.checked || control.highlighted ? control.IOSStyle.accent : control.IOSStyle.foreground\n    }\n\n    background: Ripple {\n        implicitWidth: control.IOSStyle.touchTarget\n        implicitHeight: control.IOSStyle.touchTarget\n\n        readonly property bool square: control.contentItem.width <= control.contentItem.height\n\n        x: (parent.width - width) / 2\n        y: (parent.height - height) / 2\n        clip: !square\n        width: square ? parent.height / 2 : parent.width\n        height: square ? parent.height / 2 : parent.height\n        pressed: control.pressed\n        anchor: control\n        active: control.enabled && (control.down || control.visualFocus || control.hovered)\n        color: control.IOSStyle.rippleColor\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/ToolSeparator.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\n\nT.ToolSeparator {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding)\n\n    horizontalPadding: vertical ? 12 : 5\n    verticalPadding: vertical ? 5 : 12\n\n    contentItem: Rectangle {\n        implicitWidth: vertical ? 1 : 38\n        implicitHeight: vertical ? 38 : 1\n        color: control.IOSStyle.hintTextColor\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/ToolTip.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\n\nT.ToolTip {\n    id: control\n\n    x: parent ? (parent.width - implicitWidth) / 2 : 0\n    y: -implicitHeight - 24\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            contentWidth + leftPadding + rightPadding)\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             contentHeight + topPadding + bottomPadding)\n\n    margins: 12\n    padding: 8\n    horizontalPadding: padding + 8\n\n    closePolicy: T.Popup.CloseOnEscape | T.Popup.CloseOnPressOutsideParent | T.Popup.CloseOnReleaseOutsideParent\n\n    IOSStyle.theme: IOSStyle.Dark\n\n    enter: Transition {\n        // toast_enter\n        NumberAnimation { property: \"opacity\"; from: 0.0; to: 1.0; easing.type: Easing.OutQuad; duration: 500 }\n    }\n\n    exit: Transition {\n        // toast_exit\n        NumberAnimation { property: \"opacity\"; from: 1.0; to: 0.0; easing.type: Easing.InQuad; duration: 500 }\n    }\n\n    contentItem: Text {\n        text: control.text\n        font: control.font\n        // TODO: wrapMode: Label.Wrap\n        color: control.IOSStyle.foreground\n    }\n\n    background: Rectangle {\n        implicitHeight: control.IOSStyle.tooltipHeight\n        color: control.IOSStyle.tooltipColor\n        opacity: 0.9\n        radius: 2\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/Tumbler.qml",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\nimport QtQuick 2.12\nimport QtQuick.Controls 2.12\nimport QtQuick.Controls.impl 2.12\nimport QtQuick.Templates 2.12 as T\nimport QtQuick.Controls.IOSStyle 2.0\n\nT.Tumbler {\n    id: control\n\n    implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,\n                            implicitContentWidth + leftPadding + rightPadding) || 60 // ### remove 60 in Qt 6\n    implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,\n                             implicitContentHeight + topPadding + bottomPadding) || 200 // ### remove 200 in Qt 6\n\n    delegate: Text {\n        text: modelData\n        color: control.IOSStyle.foreground\n        font: control.font\n        opacity: (1.0 - Math.abs(Tumbler.displacement) / (control.visibleItemCount / 2)) * (control.enabled ? 1 : 0.6)\n        horizontalAlignment: Text.AlignHCenter\n        verticalAlignment: Text.AlignVCenter\n    }\n\n    contentItem: TumblerView {\n        implicitWidth: 60\n        implicitHeight: 200\n        model: control.model\n        delegate: control.delegate\n        path: Path {\n            startX: contentItem.width / 2\n            startY: -contentItem.delegateHeight / 2\n            PathLine {\n                x: contentItem.width / 2\n                y: (control.visibleItemCount + 1) * contentItem.delegateHeight - contentItem.delegateHeight / 2\n            }\n        }\n\n        property real delegateHeight: control.availableHeight / control.visibleItemCount\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/iosstyle.pri",
    "content": "HEADERS += \\\n    $$PWD/qquickiosstyleripple_p.h \\\n    $$PWD/qquickiosstylestyle_p.h \\\n    $$PWD/qquickiosstyletheme_p.h \\\n    $$PWD/qquickiosstylestyle_ios.h\n\nSOURCES += \\\n    $$PWD/qquickiosstyleripple.cpp \\\n    $$PWD/qquickiosstylestyle.cpp \\\n    $$PWD/qquickiosstyletheme.cpp\n\nios {\n    SOURCES += \\\n        $$PWD/qquickiosstylestyle_ios.mm\n}\n\nQML_FILES += \\\n    $$PWD/ApplicationWindow.qml \\\n    $$PWD/BoxShadow.qml \\\n    $$PWD/BusyIndicator.qml \\\n    $$PWD/Button.qml \\\n    $$PWD/CheckBox.qml \\\n    $$PWD/CheckDelegate.qml \\\n    $$PWD/CheckIndicator.qml \\\n    $$PWD/ComboBox.qml \\\n    $$PWD/CursorDelegate.qml \\\n    $$PWD/DelayButton.qml \\\n    $$PWD/Dial.qml \\\n    $$PWD/Dialog.qml \\\n    $$PWD/DialogButtonBox.qml \\\n    $$PWD/Drawer.qml \\\n    $$PWD/ElevationEffect.qml \\\n    $$PWD/FastDropShadow.qml \\\n    $$PWD/Frame.qml \\\n    $$PWD/GroupBox.qml \\\n    $$PWD/ItemDelegate.qml \\\n    $$PWD/Label.qml \\\n    $$PWD/Menu.qml \\\n    $$PWD/MenuBar.qml \\\n    $$PWD/MenuBarItem.qml \\\n    $$PWD/MenuItem.qml \\\n    $$PWD/MenuSeparator.qml \\\n    $$PWD/Page.qml \\\n    $$PWD/PageIndicator.qml \\\n    $$PWD/Pane.qml \\\n    $$PWD/Popup.qml \\\n    $$PWD/ProgressBar.qml \\\n    $$PWD/RadioButton.qml \\\n    $$PWD/RadioDelegate.qml \\\n    $$PWD/RadioIndicator.qml \\\n    $$PWD/RangeSlider.qml \\\n    $$PWD/RoundButton.qml \\\n    $$PWD/RectangularGlow.qml \\\n    $$PWD/ScrollBar.qml \\\n    $$PWD/ScrollIndicator.qml \\\n    $$PWD/Slider.qml \\\n    $$PWD/SliderHandle.qml \\\n    $$PWD/SpinBox.qml \\\n    $$PWD/StackView.qml \\\n    $$PWD/SwipeDelegate.qml \\\n    $$PWD/SwipeView.qml \\\n    $$PWD/Switch.qml \\\n    $$PWD/SwitchDelegate.qml \\\n    $$PWD/SwitchIndicator.qml \\\n    $$PWD/TabBar.qml \\\n    $$PWD/TabButton.qml \\\n    $$PWD/TextArea.qml \\\n    $$PWD/TextField.qml \\\n    $$PWD/ToolBar.qml \\\n    $$PWD/ToolButton.qml \\\n    $$PWD/ToolSeparator.qml \\\n    $$PWD/ToolTip.qml \\\n    $$PWD/Tumbler.qml\n"
  },
  {
    "path": "src/styles/iosstyle/iosstyle.pro",
    "content": "TARGET = qtquickcontrols2iosstylestyleplugin\nIMPORT_VERSION = 2.5\n\ngreaterThan(QT_MAJOR_VERSION, 5) {\n    TARGETPATH = QtQuick/Controls/IOSStyle\n} else {\n    TARGETPATH = QtQuick/Controls.2/IOSStyle\n}\n\nQT += qml quick\nQT_PRIVATE += core-private gui-private qml-private quick-private quicktemplates2-private quickcontrols2-private\n\ngreaterThan(QT_MAJOR_VERSION, 5): QT_PRIVATE += quickcontrols2impl-private\n\nDEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII\n\ninclude(iosstyle.pri)\n\nOTHER_FILES += \\\n    qmldir \\\n    $$QML_FILES\n\nSOURCES += \\\n    $$PWD/qtquickcontrols2iosstylestyleplugin.cpp\n\nRESOURCES += \\\n    $$PWD/qtquickcontrols2iosstylestyleplugin.qrc\n\nCONFIG += no_cxx_module install_qml_files builtin_resources qtquickcompiler\nload(qml_plugin)\n\n#requires(qtConfig(quickcontrols2-iosstyle))\n"
  },
  {
    "path": "src/styles/iosstyle/plugins.qmltypes",
    "content": "import QtQuick.tooling 1.2\n\n// This file describes the plugin-supplied types contained in the library.\n// It is used for QML tooling purposes only.\n//\n// This file was auto-generated by:\n// 'qmlplugindump -nonrelocatable QtQuick.Controls.IOSStyle 2.3'\n\nModule {\n    dependencies: []\n    Component { name: \"QQuickAttachedObject\"; prototype: \"QObject\" }\n    Component {\n        name: \"QQuickIOSStyleStyle\"\n        prototype: \"QQuickAttachedObject\"\n        exports: [\"QtQuick.Controls.IOSStyle/IOSStyle 2.0\"]\n        isCreatable: false\n        exportMetaObjectRevisions: [0]\n        Enum {\n            name: \"Theme\"\n            values: {\n                \"Light\": 0,\n                \"Dark\": 1,\n                \"System\": 2\n            }\n        }\n        Enum {\n            name: \"Color\"\n            values: {\n                \"Red\": 0,\n                \"Pink\": 1,\n                \"Purple\": 2,\n                \"DeepPurple\": 3,\n                \"Indigo\": 4,\n                \"Blue\": 5,\n                \"LightBlue\": 6,\n                \"Cyan\": 7,\n                \"Teal\": 8,\n                \"Green\": 9,\n                \"LightGreen\": 10,\n                \"Lime\": 11,\n                \"Yellow\": 12,\n                \"Amber\": 13,\n                \"Orange\": 14,\n                \"DeepOrange\": 15,\n                \"Brown\": 16,\n                \"Grey\": 17,\n                \"BlueGrey\": 18\n            }\n        }\n        Enum {\n            name: \"Shade\"\n            values: {\n                \"Shade50\": 0,\n                \"Shade100\": 1,\n                \"Shade200\": 2,\n                \"Shade300\": 3,\n                \"Shade400\": 4,\n                \"Shade500\": 5,\n                \"Shade600\": 6,\n                \"Shade700\": 7,\n                \"Shade800\": 8,\n                \"Shade900\": 9,\n                \"ShadeA100\": 10,\n                \"ShadeA200\": 11,\n                \"ShadeA400\": 12,\n                \"ShadeA700\": 13\n            }\n        }\n        Property { name: \"theme\"; type: \"Theme\" }\n        Property { name: \"primary\"; type: \"QVariant\" }\n        Property { name: \"accent\"; type: \"QVariant\" }\n        Property { name: \"foreground\"; type: \"QVariant\" }\n        Property { name: \"background\"; type: \"QVariant\" }\n        Property { name: \"elevation\"; type: \"int\" }\n        Signal { name: \"paletteChanged\" }\n        Method {\n            name: \"color\"\n            type: \"QColor\"\n            Parameter { name: \"color\"; type: \"Color\" }\n            Parameter { name: \"shade\"; type: \"Shade\" }\n        }\n        Method {\n            name: \"color\"\n            type: \"QColor\"\n            Parameter { name: \"color\"; type: \"Color\" }\n        }\n        Method {\n            name: \"shade\"\n            type: \"QColor\"\n            Parameter { name: \"color\"; type: \"QColor\" }\n            Parameter { name: \"shade\"; type: \"Shade\" }\n        }\n    }\n}\n"
  },
  {
    "path": "src/styles/iosstyle/qmldir",
    "content": "module QtQuick.Controls.IOSStyle\nplugin qtquickcontrols2iosstylestyleplugin\nclassname QtQuickControls2IOSStyleStylePlugin\ndepends QtQuick.Controls 2.5\n"
  },
  {
    "path": "src/styles/iosstyle/qquickiosstyleripple.cpp",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\n#include \"qquickiosstyleripple_p.h\"\n\n#include <QtCore/qmath.h>\n#include <QtQuick/private/qquickitem_p.h>\n#include <QtQuick/private/qsgadaptationlayer_p.h>\n#include <QtQuickTemplates2/private/qquickabstractbutton_p.h>\n#include <QtQuickTemplates2/private/qquickabstractbutton_p_p.h>\n\n#ifdef QT_QUICKCONTROLS2IMPL_LIB\n#include <QtQuickControls2Impl/private/qquickanimatednode_p.h>\n#else\n#include <QtQuickControls2/private/qquickanimatednode_p.h>\n#endif\n\nQT_BEGIN_NAMESPACE\n\nnamespace {\n    enum WavePhase { WaveEnter, WaveExit };\n}\n\nstatic const int RIPPLE_ENTER_DELAY = 80;\nstatic const int OPACITY_ENTER_DURATION_FAST = 120;\nstatic const int WAVE_OPACITY_DECAY_DURATION = 333;\nstatic const qreal WAVE_TOUCH_DOWN_ACCELERATION = 1024.0;\n\nclass QQuickIOSStyleRippleWaveNode : public QQuickAnimatedNode\n{\npublic:\n    QQuickIOSStyleRippleWaveNode(QQuickIOSStyleRipple *ripple);\n\n    void exit();\n    void updateCurrentTime(int time) override;\n    void sync(QQuickItem *item) override;\n\nprivate:\n    qreal m_from = 0;\n    qreal m_to = 0;\n    qreal m_value = 0;\n    WavePhase m_phase = WaveEnter;\n    QPointF m_anchor;\n    QRectF m_bounds;\n};\n\nQQuickIOSStyleRippleWaveNode::QQuickIOSStyleRippleWaveNode(QQuickIOSStyleRipple *ripple)\n    : QQuickAnimatedNode(ripple)\n{\n    start(qRound(1000.0 * qSqrt(ripple->diameter() / 2.0 / WAVE_TOUCH_DOWN_ACCELERATION)));\n\n    QSGOpacityNode *opacityNode = new QSGOpacityNode;\n    appendChildNode(opacityNode);\n\n    QQuickItemPrivate *d = QQuickItemPrivate::get(ripple);\n    QSGInternalRectangleNode *rectNode = d->sceneGraphContext()->createInternalRectangleNode();\n    rectNode->setAntialiasing(true);\n    opacityNode->appendChildNode(rectNode);\n}\n\nvoid QQuickIOSStyleRippleWaveNode::exit()\n{\n    m_phase = WaveExit;\n    m_from = m_value;\n    setDuration(WAVE_OPACITY_DECAY_DURATION);\n    restart();\n    connect(this, &QQuickAnimatedNode::stopped, this, &QObject::deleteLater);\n}\n\nvoid QQuickIOSStyleRippleWaveNode::updateCurrentTime(int time)\n{\n    qreal p = 1.0;\n    if (duration() > 0)\n        p = time / static_cast<qreal>(duration());\n\n    m_value = m_from + (m_to - m_from) * p;\n    p = m_value / m_to;\n\n    const qreal dx = (1.0 - p) * (m_anchor.x() - m_bounds.width() / 2);\n    const qreal dy = (1.0 - p) * (m_anchor.y() - m_bounds.height() / 2);\n\n    QMatrix4x4 m;\n    m.translate(qRound((m_bounds.width() - m_value) / 2 + dx),\n                qRound((m_bounds.height() - m_value) / 2 + dy));\n    setMatrix(m);\n\n    QSGOpacityNode *opacityNode = static_cast<QSGOpacityNode *>(firstChild());\n    Q_ASSERT(opacityNode->type() == QSGNode::OpacityNodeType);\n    qreal opacity = 1.0;\n    if (m_phase == WaveExit)\n        opacity -= static_cast<qreal>(time) / WAVE_OPACITY_DECAY_DURATION;\n    opacityNode->setOpacity(opacity);\n\n    QSGInternalRectangleNode *rectNode = static_cast<QSGInternalRectangleNode *>(opacityNode->firstChild());\n    Q_ASSERT(rectNode->type() == QSGNode::GeometryNodeType);\n    rectNode->setRect(QRectF(0, 0, m_value, m_value));\n    rectNode->setRadius(m_value / 2);\n    rectNode->update();\n}\n\nvoid QQuickIOSStyleRippleWaveNode::sync(QQuickItem *item)\n{\n    QQuickIOSStyleRipple *ripple = static_cast<QQuickIOSStyleRipple *>(item);\n    m_to = ripple->diameter();\n    m_anchor = ripple->anchorPoint();\n    m_bounds = ripple->boundingRect();\n\n    QSGOpacityNode *opacityNode = static_cast<QSGOpacityNode *>(firstChild());\n    Q_ASSERT(opacityNode->type() == QSGNode::OpacityNodeType);\n\n    QSGInternalRectangleNode *rectNode = static_cast<QSGInternalRectangleNode *>(opacityNode->firstChild());\n    Q_ASSERT(rectNode->type() == QSGNode::GeometryNodeType);\n    rectNode->setColor(ripple->color());\n}\n\nclass QQuickIOSStyleRippleBackgroundNode : public QQuickAnimatedNode\n{\n    Q_OBJECT\n\npublic:\n    QQuickIOSStyleRippleBackgroundNode(QQuickIOSStyleRipple *ripple);\n\n    void updateCurrentTime(int time) override;\n    void sync(QQuickItem *item) override;\n\nprivate:\n    bool m_active = false;\n};\n\nQQuickIOSStyleRippleBackgroundNode::QQuickIOSStyleRippleBackgroundNode(QQuickIOSStyleRipple *ripple)\n    : QQuickAnimatedNode(ripple)\n{\n    setDuration(OPACITY_ENTER_DURATION_FAST);\n\n    QSGOpacityNode *opacityNode = new QSGOpacityNode;\n    opacityNode->setOpacity(0.0);\n    appendChildNode(opacityNode);\n\n    QQuickItemPrivate *d = QQuickItemPrivate::get(ripple);\n    QSGInternalRectangleNode *rectNode = d->sceneGraphContext()->createInternalRectangleNode();\n    rectNode->setAntialiasing(true);\n    opacityNode->appendChildNode(rectNode);\n}\n\nvoid QQuickIOSStyleRippleBackgroundNode::updateCurrentTime(int time)\n{\n    qreal opacity = time / static_cast<qreal>(duration());\n    if (!m_active)\n        opacity = 1.0 - opacity;\n\n    QSGOpacityNode *opacityNode = static_cast<QSGOpacityNode *>(firstChild());\n    Q_ASSERT(opacityNode->type() == QSGNode::OpacityNodeType);\n    opacityNode->setOpacity(opacity);\n}\n\nvoid QQuickIOSStyleRippleBackgroundNode::sync(QQuickItem *item)\n{\n    QQuickIOSStyleRipple *ripple = static_cast<QQuickIOSStyleRipple *>(item);\n    if (m_active != ripple->isActive()) {\n        m_active = ripple->isActive();\n        setDuration(m_active ? OPACITY_ENTER_DURATION_FAST : WAVE_OPACITY_DECAY_DURATION);\n        restart();\n    }\n\n    QSGOpacityNode *opacityNode = static_cast<QSGOpacityNode *>(firstChild());\n    Q_ASSERT(opacityNode->type() == QSGNode::OpacityNodeType);\n\n    QSGInternalRectangleNode *rectNode = static_cast<QSGInternalRectangleNode *>(opacityNode->firstChild());\n    Q_ASSERT(rectNode->type() == QSGNode::GeometryNodeType);\n\n    const qreal w = ripple->width();\n    const qreal h = ripple->height();\n    const qreal sz = qSqrt(w * w + h * h);\n\n    QMatrix4x4 matrix;\n    if (qFuzzyIsNull(ripple->clipRadius())) {\n        matrix.translate(qRound((w - sz) / 2), qRound((h - sz) / 2));\n        rectNode->setRect(QRectF(0, 0, sz, sz));\n        rectNode->setRadius(sz / 2);\n    } else {\n        rectNode->setRect(QRectF(0, 0, w, h));\n        rectNode->setRadius(ripple->clipRadius());\n    }\n\n    setMatrix(matrix);\n    rectNode->setColor(ripple->color());\n    rectNode->update();\n}\n\nQQuickIOSStyleRipple::QQuickIOSStyleRipple(QQuickItem *parent)\n    : QQuickItem(parent)\n{\n    setFlag(ItemHasContents);\n}\n\nbool QQuickIOSStyleRipple::isActive() const\n{\n    return m_active;\n}\n\nvoid QQuickIOSStyleRipple::setActive(bool active)\n{\n    if (active == m_active)\n        return;\n\n    m_active = active;\n    update();\n}\n\nQColor QQuickIOSStyleRipple::color() const\n{\n    return m_color;\n}\n\nvoid QQuickIOSStyleRipple::setColor(const QColor &color)\n{\n    if (m_color == color)\n        return;\n\n    m_color = color;\n    update();\n}\n\nqreal QQuickIOSStyleRipple::clipRadius() const\n{\n    return m_clipRadius;\n}\n\nvoid QQuickIOSStyleRipple::setClipRadius(qreal radius)\n{\n    if (qFuzzyCompare(m_clipRadius, radius))\n        return;\n\n    m_clipRadius = radius;\n    setClip(!qFuzzyIsNull(radius));\n    update();\n}\n\nbool QQuickIOSStyleRipple::isPressed() const\n{\n    return m_pressed;\n}\n\nvoid QQuickIOSStyleRipple::setPressed(bool pressed)\n{\n    if (pressed == m_pressed)\n        return;\n\n    m_pressed = pressed;\n\n    if (!isEnabled()) {\n        exitWave();\n        return;\n    }\n\n    if (pressed) {\n        if (m_trigger == Press)\n            prepareWave();\n        else\n            exitWave();\n    } else {\n        if (m_trigger == Release)\n            enterWave();\n        else\n            exitWave();\n    }\n}\n\nQQuickIOSStyleRipple::Trigger QQuickIOSStyleRipple::trigger() const\n{\n    return m_trigger;\n}\n\nvoid QQuickIOSStyleRipple::setTrigger(Trigger trigger)\n{\n    m_trigger = trigger;\n}\n\nQPointF QQuickIOSStyleRipple::anchorPoint() const\n{\n    const QRectF bounds = boundingRect();\n    const QPointF center = bounds.center();\n    if (!m_anchor)\n        return center;\n\n    QPointF anchorPoint = bounds.center();\n    if (QQuickAbstractButton *button = qobject_cast<QQuickAbstractButton *>(m_anchor))\n        anchorPoint = QQuickAbstractButtonPrivate::get(button)->pressPoint;\n    anchorPoint = mapFromItem(m_anchor, anchorPoint);\n\n    // calculate whether the anchor point is within the ripple circle bounds,\n    // that is, whether waves should start expanding from the anchor point\n    const qreal r = qSqrt(bounds.width() * bounds.width() + bounds.height() * bounds.height()) / 2;\n    if (QLineF(center, anchorPoint).length() < r)\n        return anchorPoint;\n\n    // if the anchor point is outside the ripple circle bounds, start expanding\n    // from the intersection point of the ripple circle and a line from its center\n    // to the the anchor point\n    const qreal p = qAtan2(anchorPoint.y() - center.y(), anchorPoint.x() - center.x());\n    return QPointF(center.x() + r * qCos(p), center.y() + r * qSin(p));\n}\n\nQQuickItem *QQuickIOSStyleRipple::anchor() const\n{\n    return m_anchor;\n}\n\nvoid QQuickIOSStyleRipple::setAnchor(QQuickItem *item)\n{\n    m_anchor = item;\n}\n\nqreal QQuickIOSStyleRipple::diameter() const\n{\n    const qreal w = width();\n    const qreal h = height();\n    return qSqrt(w * w + h * h);\n}\n\nvoid QQuickIOSStyleRipple::itemChange(ItemChange change, const ItemChangeData &data)\n{\n    QQuickItem::itemChange(change, data);\n}\n\nQSGNode *QQuickIOSStyleRipple::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)\n{\n    QQuickItemPrivate *d = QQuickItemPrivate::get(this);\n    QQuickDefaultClipNode *clipNode = d->clipNode();\n    if (clipNode) {\n        // TODO: QTBUG-51894\n        // clipNode->setRadius(m_clipRadius);\n        clipNode->setRect(boundingRect());\n        clipNode->update();\n    }\n\n    QSGNode *container = oldNode;\n    if (!container)\n        container = new QSGNode;\n\n    QQuickIOSStyleRippleBackgroundNode *backgroundNode = static_cast<QQuickIOSStyleRippleBackgroundNode *>(container->firstChild());\n    if (!backgroundNode) {\n        backgroundNode = new QQuickIOSStyleRippleBackgroundNode(this);\n        backgroundNode->setObjectName(objectName());\n        container->appendChildNode(backgroundNode);\n    }\n    backgroundNode->sync(this);\n\n    // enter new waves\n    int i = m_waves;\n    QQuickIOSStyleRippleWaveNode *enterNode = static_cast<QQuickIOSStyleRippleWaveNode *>(backgroundNode->nextSibling());\n    while (i-- > 0) {\n        if (!enterNode) {\n            enterNode = new QQuickIOSStyleRippleWaveNode(this);\n            container->appendChildNode(enterNode);\n        }\n        enterNode->sync(this);\n        enterNode = static_cast<QQuickIOSStyleRippleWaveNode *>(enterNode->nextSibling());\n    }\n\n    // exit old waves\n    int j = container->childCount() - 1 - m_waves;\n    while (j-- > 0) {\n        QQuickIOSStyleRippleWaveNode *exitNode = static_cast<QQuickIOSStyleRippleWaveNode *>(backgroundNode->nextSibling());\n        if (exitNode) {\n            exitNode->exit();\n            exitNode->sync(this);\n        }\n    }\n\n    return container;\n}\n\nvoid QQuickIOSStyleRipple::timerEvent(QTimerEvent *event)\n{\n    QQuickItem::timerEvent(event);\n\n    if (event->timerId() == m_enterDelay)\n        enterWave();\n}\n\nvoid QQuickIOSStyleRipple::prepareWave()\n{\n    if (m_enterDelay <= 0)\n        m_enterDelay = startTimer(RIPPLE_ENTER_DELAY);\n}\n\nvoid QQuickIOSStyleRipple::enterWave()\n{\n    if (m_enterDelay > 0) {\n        killTimer(m_enterDelay);\n        m_enterDelay = 0;\n    }\n\n    ++m_waves;\n    update();\n}\n\nvoid QQuickIOSStyleRipple::exitWave()\n{\n    if (m_enterDelay > 0) {\n        killTimer(m_enterDelay);\n        m_enterDelay = 0;\n    }\n\n    if (m_waves > 0) {\n        --m_waves;\n        update();\n    }\n}\n\nQT_END_NAMESPACE\n\n#include \"qquickiosstyleripple.moc\"\n"
  },
  {
    "path": "src/styles/iosstyle/qquickiosstyleripple_p.h",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\n#ifndef QQUICKIOSSTYLERIPPLE_P_H\n#define QQUICKIOSSTYLERIPPLE_P_H\n\n//\n//  W A R N I N G\n//  -------------\n//\n// This file is not part of the Qt API.  It exists purely as an\n// implementation detail.  This header file may change from version to\n// version without notice, or even be removed.\n//\n// We mean it.\n//\n\n#include <QtQuick/qquickitem.h>\n#include <QtGui/qcolor.h>\n\nQT_BEGIN_NAMESPACE\n\nclass QQuickIOSStyleRipple : public QQuickItem\n{\n    Q_OBJECT\n    Q_PROPERTY(QColor color READ color WRITE setColor FINAL)\n    Q_PROPERTY(qreal clipRadius READ clipRadius WRITE setClipRadius FINAL)\n    Q_PROPERTY(bool pressed READ isPressed WRITE setPressed FINAL)\n    Q_PROPERTY(bool active READ isActive WRITE setActive FINAL)\n    Q_PROPERTY(QQuickItem *anchor READ anchor WRITE setAnchor FINAL)\n    Q_PROPERTY(Trigger trigger READ trigger WRITE setTrigger FINAL)\n\npublic:\n    QQuickIOSStyleRipple(QQuickItem *parent = nullptr);\n\n    QColor color() const;\n    void setColor(const QColor &color);\n\n    qreal clipRadius() const;\n    void setClipRadius(qreal radius);\n\n    bool isActive() const;\n    void setActive(bool active);\n\n    bool isPressed() const;\n    void setPressed(bool pressed);\n\n    enum Trigger { Press, Release };\n    Q_ENUM (Trigger)\n\n    Trigger trigger() const;\n    void setTrigger(Trigger trigger);\n\n    QPointF anchorPoint() const;\n\n    QQuickItem *anchor() const;\n    void setAnchor(QQuickItem *anchor);\n\n    qreal diameter() const;\n\nprotected:\n    void itemChange(ItemChange change, const ItemChangeData &data) override;\n    QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) override;\n    void timerEvent(QTimerEvent *event) override;\n\n    void prepareWave();\n    void enterWave();\n    void exitWave();\n\nprivate:\n    bool m_active = false;\n    bool m_pressed = false;\n    int m_waves = 0;\n    int m_enterDelay = 0;\n    Trigger m_trigger = Press;\n    qreal m_clipRadius = 0.0;\n    QColor m_color;\n    QQuickItem *m_anchor = nullptr;\n};\n\nQT_END_NAMESPACE\n\nQML_DECLARE_TYPE(QQuickIOSStyleRipple)\n\n#endif // QQUICKIOSSTYLERIPPLE_P_H\n"
  },
  {
    "path": "src/styles/iosstyle/qquickiosstylestyle.cpp",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\n#include \"qquickiosstylestyle_p.h\"\n#include \"qquickiosstylestyle_ios.h\"\n\n#include <QtCore/qdebug.h>\n#include <QtCore/qsettings.h>\n#include <QtQml/qqmlinfo.h>\n#include <QtQuickControls2/private/qquickstyle_p.h>\n\nQT_BEGIN_NAMESPACE\n\nstatic const QRgb colors[] = {\n    0xFFFF3B30, // Red\n    0xFFFF9500, // Orange\n    0xFFFFCC00, // Yellow\n    0xFF4CD964, // Green\n    0xFF5AC8FA, // TealBlue\n    0xFF007AFF, // Blue\n    0xFF5856D6, // Purple\n    0xFFFF2D55  // pink\n};\n\n// If no value was inherited from a parent or explicitly set, the \"global\" values are used.\n// The initial, default values of the globals are hard-coded here, but the environment\n// variables and .conf file override them if specified.\nstatic QQuickIOSStyleStyle::Theme globalTheme = QQuickIOSStyleStyle::Light;\nstatic uint globalPrimary = QQuickIOSStyleStyle::Blue;\nstatic uint globalAccent = QQuickIOSStyleStyle::Blue;\nstatic uint globalForeground = 0xDD000000; // primaryTextColorLight\nstatic uint globalBackground = 0xFFFAFAFA; // backgroundColorLight\n// These represent whether a global foreground/background was set.\n// Each style's m_hasForeground/m_hasBackground are initialized to these values.\nstatic bool hasGlobalForeground = false;\nstatic bool hasGlobalBackground = false;\n// These represent whether or not the global color value was specified as one of the\n// values that QColor accepts, as opposed to one of the pre-defined colors like Red.\nstatic bool globalPrimaryCustom = false;\nstatic bool globalAccentCustom = false;\nstatic bool globalForegroundCustom = true;\nstatic bool globalBackgroundCustom = true;\n// This is global because:\n// 1) The theme needs access to it to determine font sizes.\n// 2) There can only be one variant used for the whole application.\nstatic QQuickIOSStyleStyle::Variant globalVariant = QQuickIOSStyleStyle::Normal;\n\nstatic const QRgb backgroundColorLight = 0xFFF8F7F8;\nstatic const QRgb backgroundColorDark = 0xFF2B2B2B;\nstatic const QRgb dialogColorLight = 0xFFFFFFFF;\nstatic const QRgb dialogColorDark = 0xFF424242;\nstatic const QRgb primaryTextColorLight = 0xFF333333;\nstatic const QRgb primaryTextColorDark = 0xFFFFFFFF;\nstatic const QRgb secondaryTextColorLight = 0xFFB7B7B7;\nstatic const QRgb secondaryTextColorDark = 0xB2FFFFFF;\nstatic const QRgb hintTextColorLight = 0xFF8c8c93;\nstatic const QRgb hintTextColorDark = 0x4CFFFFFF;\nstatic const QRgb dividerColorLight = 0x1E000000;\nstatic const QRgb dividerColorDark = 0x1EFFFFFF;\nstatic const QRgb iconColorLight = 0x89000000;\nstatic const QRgb iconColorDark = 0xFFFFFFFF;\nstatic const QRgb iconDisabledColorLight = 0x42000000;\nstatic const QRgb iconDisabledColorDark = 0x4CFFFFFF;\nstatic const QRgb raisedButtonBorderColorLight = 0xFF007AFF;\nstatic const QRgb raisedButtonColorLight = 0xFF007AFF;\nstatic const QRgb raisedButtonColorDark = 0x3FCCCCCC;\nstatic const QRgb raisedButtonDisabledColorLight = 0xFFe7e7ed;\nstatic const QRgb raisedButtonDisabledColorDark = dividerColorDark;\nstatic const QRgb frameColorLight = hintTextColorLight;\nstatic const QRgb frameColorDark = hintTextColorDark;\nstatic const QRgb sliderForegroundColorLight = 0xFFB7B7B7;\nstatic const QRgb switchUncheckedTrackColorLight = 0xFFFFFFFF;\nstatic const QRgb switchUncheckedTrackColorDark = 0xFF111111;\nstatic const QRgb switchDisabledTrackColorLight = 0x1E000000;\nstatic const QRgb switchDisabledTrackColorDark = 0x19FFFFFF;\nstatic const QRgb switchBorderColorLight = 0xFFE5E5E5;\nstatic const QRgb rippleColorLight = 0x20000000;\nstatic const QRgb rippleColorDark = 0x30FFFFFF;\nstatic const QRgb spinBoxDisabledIconColorLight = 0xFFCCCCCC;\nstatic const QRgb spinBoxDisabledIconColorDark = 0xFF666666;\n\n#ifndef Q_OS_IOS\nbool appearanceIsDark () { return QQuickStylePrivate::isDarkSystemTheme(); }\n#endif\n\nstatic QQuickIOSStyleStyle::Theme effectiveTheme(QQuickIOSStyleStyle::Theme theme)\n{\n    if (theme == QQuickIOSStyleStyle::System)\n        theme = appearanceIsDark() ? QQuickIOSStyleStyle::Dark : QQuickIOSStyleStyle::Light;\n    return theme;\n}\n\nQQuickIOSStyleStyle::QQuickIOSStyleStyle(QObject *parent) : QQuickAttachedObject(parent),\n    m_customPrimary(globalPrimaryCustom),\n    m_customAccent(globalAccentCustom),\n    m_customForeground(globalForegroundCustom),\n    m_customBackground(globalBackgroundCustom),\n    m_hasForeground(hasGlobalForeground),\n    m_hasBackground(hasGlobalBackground),\n    m_theme(globalTheme),\n    m_primary(globalPrimary),\n    m_accent(globalAccent),\n    m_foreground(globalForeground),\n    m_background(globalBackground)\n{\n    QQuickAttachedObject::init();\n}\n\nQQuickIOSStyleStyle *QQuickIOSStyleStyle::qmlAttachedProperties(QObject *object)\n{\n    return new QQuickIOSStyleStyle(object);\n}\n\nQQuickIOSStyleStyle::Theme QQuickIOSStyleStyle::theme() const\n{\n    return m_theme;\n}\n\nvoid QQuickIOSStyleStyle::setTheme(Theme theme)\n{\n    if (theme == System)\n        theme = appearanceIsDark() ? Dark : Light;\n\n    m_explicitTheme = true;\n    if (m_theme == theme)\n        return;\n\n    m_theme = theme;\n    propagateTheme();\n    emit themeChanged();\n    emit paletteChanged();\n    if (!m_customAccent)\n        emit accentChanged();\n    if (!m_hasBackground)\n        emit backgroundChanged();\n    if (!m_hasForeground)\n        emit foregroundChanged();\n}\n\nvoid QQuickIOSStyleStyle::inheritTheme(Theme theme)\n{\n    if (m_explicitTheme || m_theme == theme)\n        return;\n\n    m_theme = theme;\n    propagateTheme();\n    emit themeChanged();\n    emit paletteChanged();\n    if (!m_customAccent)\n        emit accentChanged();\n    if (!m_hasBackground)\n        emit backgroundChanged();\n    if (!m_hasForeground)\n        emit foregroundChanged();\n}\n\nvoid QQuickIOSStyleStyle::propagateTheme()\n{\n    const auto styles = attachedChildren();\n    for (QQuickAttachedObject *child : styles) {\n        QQuickIOSStyleStyle *iosstyle = qobject_cast<QQuickIOSStyleStyle *>(child);\n        if (iosstyle)\n            iosstyle->inheritTheme(m_theme);\n    }\n}\n\nvoid QQuickIOSStyleStyle::resetTheme()\n{\n    if (!m_explicitTheme)\n        return;\n\n    m_explicitTheme = false;\n    QQuickIOSStyleStyle *iosstyle = qobject_cast<QQuickIOSStyleStyle *>(attachedParent());\n    inheritTheme(iosstyle ? iosstyle->theme() : globalTheme);\n}\n\nQVariant QQuickIOSStyleStyle::primary() const\n{\n    return primaryColor();\n}\n\nvoid QQuickIOSStyleStyle::setPrimary(const QVariant &var)\n{\n    QRgb primary = 0;\n    bool custom = false;\n    if (!variantToRgba(var, \"primary\", &primary, &custom))\n        return;\n\n    m_explicitPrimary = true;\n    if (m_primary == primary)\n        return;\n\n    m_customPrimary = custom;\n    m_primary = primary;\n    propagatePrimary();\n    emit primaryChanged();\n    emit paletteChanged();\n}\n\nvoid QQuickIOSStyleStyle::inheritPrimary(uint primary, bool custom)\n{\n    if (m_explicitPrimary || m_primary == primary)\n        return;\n\n    m_customPrimary = custom;\n    m_primary = primary;\n    propagatePrimary();\n    emit primaryChanged();\n    emit paletteChanged();\n}\n\nvoid QQuickIOSStyleStyle::propagatePrimary()\n{\n    const auto styles = attachedChildren();\n    for (QQuickAttachedObject *child : styles) {\n        QQuickIOSStyleStyle *iosstyle = qobject_cast<QQuickIOSStyleStyle *>(child);\n        if (iosstyle)\n            iosstyle->inheritPrimary(m_primary, m_customPrimary);\n    }\n}\n\nvoid QQuickIOSStyleStyle::resetPrimary()\n{\n    if (!m_explicitPrimary)\n        return;\n\n    m_customPrimary = false;\n    m_explicitPrimary = false;\n    QQuickIOSStyleStyle *iosstyle = qobject_cast<QQuickIOSStyleStyle *>(attachedParent());\n    if (iosstyle)\n        inheritPrimary(iosstyle->m_primary, iosstyle->m_customPrimary);\n    else\n        inheritPrimary(globalPrimary, false);\n}\n\nQVariant QQuickIOSStyleStyle::accent() const\n{\n    return accentColor();\n}\n\nvoid QQuickIOSStyleStyle::setAccent(const QVariant &var)\n{\n    QRgb accent = 0;\n    bool custom = false;\n    if (!variantToRgba(var, \"accent\", &accent, &custom))\n        return;\n\n    m_explicitAccent = true;\n    if (m_accent == accent)\n        return;\n\n    m_customAccent = custom;\n    m_accent = accent;\n    propagateAccent();\n    emit accentChanged();\n    emit paletteChanged();\n}\n\nvoid QQuickIOSStyleStyle::inheritAccent(uint accent, bool custom)\n{\n    if (m_explicitAccent || m_accent == accent)\n        return;\n\n    m_customAccent = custom;\n    m_accent = accent;\n    propagateAccent();\n    emit accentChanged();\n    emit paletteChanged();\n}\n\nvoid QQuickIOSStyleStyle::propagateAccent()\n{\n    const auto styles = attachedChildren();\n    for (QQuickAttachedObject *child : styles) {\n        QQuickIOSStyleStyle *iosstyle = qobject_cast<QQuickIOSStyleStyle *>(child);\n        if (iosstyle)\n            iosstyle->inheritAccent(m_accent, m_customAccent);\n    }\n}\n\nvoid QQuickIOSStyleStyle::resetAccent()\n{\n    if (!m_explicitAccent)\n        return;\n\n    m_customAccent = false;\n    m_explicitAccent = false;\n    QQuickIOSStyleStyle *iosstyle = qobject_cast<QQuickIOSStyleStyle *>(attachedParent());\n    if (iosstyle)\n        inheritAccent(iosstyle->m_accent, iosstyle->m_customAccent);\n    else\n        inheritAccent(globalAccent, false);\n}\n\nQVariant QQuickIOSStyleStyle::foreground() const\n{\n    if (!m_hasForeground)\n        return QColor::fromRgba(m_theme == Light ? primaryTextColorLight : primaryTextColorDark);\n    if (m_customForeground)\n        return QColor::fromRgba(m_foreground);\n//    if (m_foreground > BlueGrey)\n//        return QColor();\n    return QColor::fromRgba(colors[m_foreground]);\n}\n\nvoid QQuickIOSStyleStyle::setForeground(const QVariant &var)\n{\n    QRgb foreground = 0;\n    bool custom = false;\n    if (!variantToRgba(var, \"foreground\", &foreground, &custom))\n        return;\n\n    m_hasForeground = true;\n    m_explicitForeground = true;\n    if (m_foreground == foreground)\n        return;\n\n    m_customForeground = custom;\n    m_foreground = foreground;\n    propagateForeground();\n    emit foregroundChanged();\n}\n\nvoid QQuickIOSStyleStyle::inheritForeground(uint foreground, bool custom, bool has)\n{\n    if (m_explicitForeground || m_foreground == foreground)\n        return;\n\n    m_hasForeground = has;\n    m_customForeground = custom;\n    m_foreground = foreground;\n    propagateForeground();\n    emit foregroundChanged();\n}\n\nvoid QQuickIOSStyleStyle::propagateForeground()\n{\n    const auto styles = attachedChildren();\n    for (QQuickAttachedObject *child : styles) {\n        QQuickIOSStyleStyle *iosstyle = qobject_cast<QQuickIOSStyleStyle *>(child);\n        if (iosstyle)\n            iosstyle->inheritForeground(m_foreground, m_customForeground, m_hasForeground);\n    }\n}\n\nvoid QQuickIOSStyleStyle::resetForeground()\n{\n    if (!m_explicitForeground)\n        return;\n\n    m_hasForeground = false;\n    m_customForeground = false;\n    m_explicitForeground = false;\n    QQuickIOSStyleStyle *iosstyle = qobject_cast<QQuickIOSStyleStyle *>(attachedParent());\n    inheritForeground(iosstyle ? iosstyle->m_foreground : globalForeground, true, iosstyle ? iosstyle->m_hasForeground : false);\n}\n\nQVariant QQuickIOSStyleStyle::background() const\n{\n    return backgroundColor();\n}\n\nvoid QQuickIOSStyleStyle::setBackground(const QVariant &var)\n{\n    QRgb background = 0;\n    bool custom = false;\n    if (!variantToRgba(var, \"background\", &background, &custom))\n        return;\n\n    m_hasBackground = true;\n    m_explicitBackground = true;\n    if (m_background == background)\n        return;\n\n    m_customBackground = custom;\n    m_background = background;\n    propagateBackground();\n    emit backgroundChanged();\n    emit paletteChanged();\n}\n\nvoid QQuickIOSStyleStyle::inheritBackground(uint background, bool custom, bool has)\n{\n    if (m_explicitBackground || m_background == background)\n        return;\n\n    m_hasBackground = has;\n    m_customBackground = custom;\n    m_background = background;\n    propagateBackground();\n    emit backgroundChanged();\n    emit paletteChanged();\n}\n\nvoid QQuickIOSStyleStyle::propagateBackground()\n{\n    const auto styles = attachedChildren();\n    for (QQuickAttachedObject *child : styles) {\n        QQuickIOSStyleStyle *iosstyle = qobject_cast<QQuickIOSStyleStyle *>(child);\n        if (iosstyle)\n            iosstyle->inheritBackground(m_background, m_customBackground, m_hasBackground);\n    }\n}\n\nvoid QQuickIOSStyleStyle::resetBackground()\n{\n    if (!m_explicitBackground)\n        return;\n\n    m_hasBackground = false;\n    m_customBackground = false;\n    m_explicitBackground = false;\n    QQuickIOSStyleStyle *iosstyle = qobject_cast<QQuickIOSStyleStyle *>(attachedParent());\n    inheritBackground(iosstyle ? iosstyle->m_background : globalBackground, true, iosstyle ? iosstyle->m_hasBackground : false);\n}\n\nint QQuickIOSStyleStyle::elevation() const\n{\n    return m_elevation;\n}\n\nvoid QQuickIOSStyleStyle::setElevation(int elevation)\n{\n    if (m_elevation == elevation)\n        return;\n\n    m_elevation = elevation;\n    emit elevationChanged();\n}\n\nvoid QQuickIOSStyleStyle::resetElevation()\n{\n    setElevation(0);\n}\n\nQColor QQuickIOSStyleStyle::primaryColor() const\n{\n    if (m_customPrimary)\n        return QColor::fromRgba(m_primary);\n//    if (m_primary > BlueGrey)\n//        return QColor();\n    return colors[m_primary];\n}\n\nQColor QQuickIOSStyleStyle::accentColor() const\n{\n    if (m_customAccent)\n        return QColor::fromRgba(m_accent);\n//    if (m_accent > BlueGrey)\n//        return QColor();\n    return colors[m_accent];\n}\n\nQColor QQuickIOSStyleStyle::backgroundColor() const\n{\n    if (!m_hasBackground)\n        return QColor::fromRgba(m_theme == Light ? backgroundColorLight : backgroundColorDark);\n    if (m_customBackground)\n        return QColor::fromRgba(m_background);\n//    if (m_background > BlueGrey)\n//        return QColor();\n    return colors[m_background];\n}\n\nQColor QQuickIOSStyleStyle::primaryTextColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? primaryTextColorLight : primaryTextColorDark);\n}\n\nQColor QQuickIOSStyleStyle::primaryHighlightedTextColor() const\n{\n    return QColor::fromRgba(primaryTextColorDark);\n}\n\nQColor QQuickIOSStyleStyle::secondaryTextColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? secondaryTextColorLight : secondaryTextColorDark);\n}\n\nQColor QQuickIOSStyleStyle::hintTextColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? hintTextColorLight : hintTextColorDark);\n}\n\nQColor QQuickIOSStyleStyle::textSelectionColor() const\n{\n    QColor color = accentColor();\n    color.setAlphaF(0.4);\n    return color;\n}\n\nQColor QQuickIOSStyleStyle::dropShadowColor() const\n{\n    return QColor::fromRgba(0x40000000);\n}\n\nQColor QQuickIOSStyleStyle::dividerColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? dividerColorLight : dividerColorDark);\n}\n\nQColor QQuickIOSStyleStyle::iconColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? iconColorLight : iconColorDark);\n}\n\nQColor QQuickIOSStyleStyle::iconDisabledColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? iconDisabledColorLight : iconDisabledColorDark);\n}\n\nQColor QQuickIOSStyleStyle::buttonColor(bool highlighted) const\n{\n    QColor color = Qt::transparent;\n\n    if (m_explicitBackground) {\n        color = backgroundColor();\n    } else if (highlighted) {\n        color = accentColor();\n    }\n\n    return color;\n}\n\nQColor QQuickIOSStyleStyle::buttonColor() const\n{\n    return buttonColor(false);\n}\n\nQColor QQuickIOSStyleStyle::buttonBorderColor() const\n{\n    QColor color = Qt::transparent;\n\n    if (m_explicitBackground) {\n        color = backgroundColor();\n    } else {\n        color = QColor::fromRgba(m_theme == Light ? raisedButtonBorderColorLight\n                                                  : raisedButtonColorDark);\n    }\n\n    return color;\n}\n\nQColor QQuickIOSStyleStyle::buttonDisabledColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? raisedButtonDisabledColorLight\n                                                 : raisedButtonDisabledColorDark);\n}\n\nQColor QQuickIOSStyleStyle::highlightedButtonColor() const\n{\n    return buttonColor(true);\n}\n\nQColor QQuickIOSStyleStyle::frameColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? frameColorLight : frameColorDark);\n}\n\nQColor QQuickIOSStyleStyle::rippleColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? rippleColorLight : rippleColorDark);\n}\n\nQColor QQuickIOSStyleStyle::highlightedRippleColor() const\n{\n    QColor pressColor = accentColor();\n    pressColor.setAlpha(m_theme == Light ? 30 : 50);\n    return pressColor;\n}\n\nQColor QQuickIOSStyleStyle::switchUncheckedTrackColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? switchUncheckedTrackColorLight : switchUncheckedTrackColorDark);\n}\n\nQColor QQuickIOSStyleStyle::switchCheckedTrackColor() const\n{\n    QColor color = accentColor();\n\n    if (m_explicitBackground) {\n        color = backgroundColor();\n    }\n\n    return color;\n}\n\nQColor QQuickIOSStyleStyle::switchBorderColor() const\n{\n    return QColor::fromRgba(switchBorderColorLight);\n}\n\nQColor QQuickIOSStyleStyle::switchHandleColor() const\n{\n    return Qt::white;\n}\n\nQColor QQuickIOSStyleStyle::switchDisabledTrackColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? switchDisabledTrackColorLight : switchDisabledTrackColorDark);\n}\n\nQColor QQuickIOSStyleStyle::switchDisabledHandleColor() const\n{\n    return  QColor::fromRgba(m_theme == Light ? switchDisabledTrackColorLight : switchDisabledTrackColorDark);\n}\n\nQColor QQuickIOSStyleStyle::scrollBarColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? 0x40000000 : 0x40FFFFFF);\n}\n\nQColor QQuickIOSStyleStyle::scrollBarHoveredColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? 0x60000000 : 0x60FFFFFF);\n}\n\nQColor QQuickIOSStyleStyle::scrollBarPressedColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? 0x80000000 : 0x80FFFFFF);\n}\n\nQColor QQuickIOSStyleStyle::sliderBackgroundColor() const\n{\n    if (m_hasBackground)\n        return backgroundColor();\n    return accentColor();\n}\n\nQColor QQuickIOSStyleStyle::sliderForegroundColor() const\n{\n    return QColor::fromRgba(sliderForegroundColorLight);\n}\n\nQColor QQuickIOSStyleStyle::sliderHandleColor() const\n{\n    return Qt::white;\n}\n\nQColor QQuickIOSStyleStyle::dialogColor() const\n{\n    if (m_hasBackground)\n        return backgroundColor();\n    return QColor::fromRgba(m_theme == Light ? dialogColorLight : dialogColorDark);\n}\n\nQColor QQuickIOSStyleStyle::backgroundDimColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? 0x99303030 : 0x99fafafa);\n}\n\nQColor QQuickIOSStyleStyle::listHighlightColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? 0x1e000000 : 0x1effffff);\n}\n\nQColor QQuickIOSStyleStyle::tooltipColor() const\n{\n    if (m_explicitBackground)\n        return backgroundColor();\n    return primaryColor();\n}\n\nQColor QQuickIOSStyleStyle::toolBarColor() const\n{\n    if (m_explicitBackground)\n        return backgroundColor();\n    return primaryColor();\n}\n\n// ??\nQColor QQuickIOSStyleStyle::toolTextColor() const\n{\n    if (m_hasForeground || m_customPrimary)\n        return primaryTextColor();\n\n    switch (m_primary) {\n    case Red:\n    case Pink:\n    case Purple:\n    case Blue:\n        return QColor::fromRgba(primaryTextColorDark);\n\n    case Green:\n    case Yellow:\n    case Orange:\n        return QColor::fromRgba(primaryTextColorLight);\n\n    default:\n        break;\n    }\n\n    return primaryTextColor();\n}\n\nQColor QQuickIOSStyleStyle::spinBoxDisabledIconColor() const\n{\n    return QColor::fromRgba(m_theme == Light ? spinBoxDisabledIconColorLight : spinBoxDisabledIconColorDark);\n}\n\nQColor QQuickIOSStyleStyle::color(QQuickIOSStyleStyle::Color color) const\n{\n    int count = sizeof(colors) / sizeof(colors[0]);\n    if (color < 0 || color >= count)\n        return QColor();\n\n//    count = sizeof(colors[0]) / sizeof(colors[0][0]);\n//    if (shade < 0 || shade >= count)\n//        return QColor();\n\n    return colors[color];\n}\n\nstatic QColor lighterShade(const QColor &color, qreal amount)\n{\n    QColor hsl = color.toHsl();\n    hsl.setHslF(hsl.hueF(), hsl.saturationF(), qBound<qreal>(0.0, hsl.lightnessF() + amount, 1.0), color.alphaF());\n    return hsl.convertTo(color.spec());\n}\n\nstatic QColor darkerShade(const QColor &color, qreal amount)\n{\n    QColor hsl = color.toHsl();\n    hsl.setHslF(hsl.hueF(), hsl.saturationF(), qBound<qreal>(0.0, hsl.lightnessF() - amount, 1.0), color.alphaF());\n    return hsl.convertTo(color.spec());\n}\n\n/*\n * The following lightness values originate from the IOSStyle Design Color Generator project.\n *\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 mbitson\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nint QQuickIOSStyleStyle::touchTarget() const\n{\n    // https://iosstyle.io/guidelines/components/buttons.html#buttons-style\n    return globalVariant == Dense ? 44 : 48;\n}\n\nint QQuickIOSStyleStyle::buttonHeight() const\n{\n    // https://iosstyle.io/guidelines/components/buttons.html#buttons-style\n    return globalVariant == Dense ? 32 : 36;\n}\n\nint QQuickIOSStyleStyle::delegateHeight() const\n{\n    // https://iosstyle.io/guidelines/components/lists.html#lists-specs\n    return globalVariant == Dense ? 40 : 48;\n}\n\nint QQuickIOSStyleStyle::dialogButtonBoxHeight() const\n{\n    return globalVariant == Dense ? 48 : 52;\n}\n\nint QQuickIOSStyleStyle::frameVerticalPadding() const\n{\n    return globalVariant == Dense ? 8 : 12;\n}\n\nint QQuickIOSStyleStyle::menuItemHeight() const\n{\n    // https://iosstyle.io/guidelines/components/menus.html#menus-simple-menus\n    return globalVariant == Dense ? 32 : 48;\n}\n\nint QQuickIOSStyleStyle::menuItemVerticalPadding() const\n{\n    return globalVariant == Dense ? 8 : 12;\n}\n\nint QQuickIOSStyleStyle::switchDelegateVerticalPadding() const\n{\n    // SwitchDelegate's indicator is much larger than the others due to the shadow,\n    // so we must reduce its padding to ensure its implicitHeight is 40 when dense.\n    return globalVariant == Dense ? 4 : 8;\n}\n\nint QQuickIOSStyleStyle::tooltipHeight() const\n{\n    // https://iosstyle.io/guidelines/components/tooltips.html\n    return globalVariant == Dense ? 22 : 32;\n}\n\nQQuickIOSStyleStyle::Variant QQuickIOSStyleStyle::variant()\n{\n    return globalVariant;\n}\n\ntemplate <typename Enum>\nstatic Enum toEnumValue(const QByteArray &value, bool *ok)\n{\n    QMetaEnum enumeration = QMetaEnum::fromType<Enum>();\n    return static_cast<Enum>(enumeration.keyToValue(value, ok));\n}\n\nstatic QByteArray resolveSetting(const QByteArray &env, const QSharedPointer<QSettings> &settings, const QString &name)\n{\n    QByteArray value = qgetenv(env);\n#if QT_CONFIG(settings)\n    if (value.isNull() && !settings.isNull())\n        value = settings->value(name).toByteArray();\n#endif\n    return value;\n}\n\nvoid QQuickIOSStyleStyle::initGlobals()\n{\n    QSharedPointer<QSettings> settings = QQuickStylePrivate::settings(QStringLiteral(\"IOSStyle\"));\n\n    bool ok = false;\n    QByteArray themeValue = resolveSetting(\"QT_QUICK_CONTROLS_IOSSTYLE_THEME\", settings, QStringLiteral(\"Theme\"));\n    Theme themeEnum = toEnumValue<Theme>(themeValue, &ok);\n    if (ok)\n        globalTheme = effectiveTheme(themeEnum);\n    else if (!themeValue.isEmpty())\n        qWarning().nospace().noquote() << \"IOSStyle: unknown theme value: \" << themeValue;\n\n    QByteArray variantValue = resolveSetting(\"QT_QUICK_CONTROLS_IOSSTYLE_VARIANT\", settings, QStringLiteral(\"Variant\"));\n    Variant variantEnum = toEnumValue<Variant>(variantValue, &ok);\n    if (ok)\n        globalVariant = variantEnum;\n    else if (!variantValue.isEmpty())\n        qWarning().nospace().noquote() << \"IOSStyle: unknown variant value: \" << variantValue;\n\n    QByteArray primaryValue = resolveSetting(\"QT_QUICK_CONTROLS_IOSSTYLE_PRIMARY\", settings, QStringLiteral(\"Primary\"));\n    Color primaryEnum = toEnumValue<Color>(primaryValue, &ok);\n    if (ok) {\n        globalPrimaryCustom = false;\n        globalPrimary = primaryEnum;\n    } else {\n        QColor color(primaryValue.constData());\n        if (color.isValid()) {\n            globalPrimaryCustom = true;\n            globalPrimary = color.rgba();\n        } else if (!primaryValue.isEmpty()) {\n            qWarning().nospace().noquote() << \"IOSStyle: unknown primary value: \" << primaryValue;\n        }\n    }\n\n    QByteArray accentValue = resolveSetting(\"QT_QUICK_CONTROLS_IOSSTYLE_ACCENT\", settings, QStringLiteral(\"Accent\"));\n    Color accentEnum = toEnumValue<Color>(accentValue, &ok);\n    if (ok) {\n        globalAccentCustom = false;\n        globalAccent = accentEnum;\n    } else if (!accentValue.isEmpty()) {\n        QColor color(accentValue.constData());\n        if (color.isValid()) {\n            globalAccentCustom = true;\n            globalAccent = color.rgba();\n        } else {\n            qWarning().nospace().noquote() << \"IOSStyle: unknown accent value: \" << accentValue;\n        }\n    }\n\n    QByteArray foregroundValue = resolveSetting(\"QT_QUICK_CONTROLS_IOSSTYLE_FOREGROUND\", settings, QStringLiteral(\"Foreground\"));\n    Color foregroundEnum = toEnumValue<Color>(foregroundValue, &ok);\n    if (ok) {\n        globalForegroundCustom = false;\n        globalForeground = foregroundEnum;\n        hasGlobalForeground = true;\n    } else if (!foregroundValue.isEmpty()) {\n        QColor color(foregroundValue.constData());\n        if (color.isValid()) {\n            globalForegroundCustom = true;\n            globalForeground = color.rgba();\n            hasGlobalForeground = true;\n        } else {\n            qWarning().nospace().noquote() << \"IOSStyle: unknown foreground value: \" << foregroundValue;\n        }\n    }\n\n    QByteArray backgroundValue = resolveSetting(\"QT_QUICK_CONTROLS_IOSSTYLE_BACKGROUND\", settings, QStringLiteral(\"Background\"));\n    Color backgroundEnum = toEnumValue<Color>(backgroundValue, &ok);\n    if (ok) {\n        globalBackgroundCustom = false;\n        globalBackground = backgroundEnum;\n        hasGlobalBackground = true;\n    } else if (!backgroundValue.isEmpty()) {\n        QColor color(backgroundValue.constData());\n        if (color.isValid()) {\n            globalBackgroundCustom = true;\n            globalBackground = color.rgba();\n            hasGlobalBackground = true;\n        } else {\n            qWarning().nospace().noquote() << \"IOSStyle: unknown background value: \" << backgroundValue;\n        }\n    }\n}\n\nvoid QQuickIOSStyleStyle::attachedParentChange(QQuickAttachedObject *newParent, QQuickAttachedObject *oldParent)\n{\n    Q_UNUSED(oldParent);\n    QQuickIOSStyleStyle *iosstyle = qobject_cast<QQuickIOSStyleStyle *>(newParent);\n    if (iosstyle) {\n        inheritPrimary(iosstyle->m_primary, iosstyle->m_customPrimary);\n        inheritAccent(iosstyle->m_accent, iosstyle->m_customAccent);\n        inheritForeground(iosstyle->m_foreground, iosstyle->m_customForeground, iosstyle->m_hasForeground);\n        inheritBackground(iosstyle->m_background, iosstyle->m_customBackground, iosstyle->m_hasBackground);\n        inheritTheme(iosstyle->theme());\n    }\n}\n\nbool QQuickIOSStyleStyle::variantToRgba(const QVariant &var, const char *name, QRgb *rgba, bool *custom) const\n{\n    *custom = false;\n    if (var.type() == QVariant::Int) {\n        int val = var.toInt();\n//        if (val > BlueGrey) {\n//            qmlWarning(parent()) << \"unknown IOSStyle.\" << name << \" value: \" << val;\n//            return false;\n//        }\n        *rgba = val;\n    } else {\n        int val = QMetaEnum::fromType<Color>().keyToValue(var.toByteArray());\n        if (val != -1) {\n            *rgba = val;\n        } else {\n            QColor color(var.toString());\n            if (!color.isValid()) {\n                qmlWarning(parent()) << \"unknown IOSStyle.\" << name << \" value: \" << var.toString();\n                return false;\n            }\n            *custom = true;\n            *rgba = color.rgba();\n        }\n    }\n    return true;\n}\n\nQT_END_NAMESPACE\n"
  },
  {
    "path": "src/styles/iosstyle/qquickiosstylestyle_ios.h",
    "content": "#ifndef OSXVIEWCONTROLLER_CPP_H\n#define OSXVIEWCONTROLLER_CPP_H\n\nbool appearanceIsDark();\n\n#endif // OSXVIEWCONTROLLER_CPP_H\n"
  },
  {
    "path": "src/styles/iosstyle/qquickiosstylestyle_ios.mm",
    "content": "#import <UIKit/UIKit.h>\n#import \"qquickiosstylestyle_ios.h\"\n\nbool appearanceIsDark() {\n    if (@available(iOS 13.0, *)) {\n        UITraitCollection *traitCollection = [UITraitCollection currentTraitCollection];\n        bool isDark = (traitCollection.userInterfaceStyle == UIUserInterfaceStyle::UIUserInterfaceStyleDark);\n        return isDark;\n    }\n    return false;\n}\n"
  },
  {
    "path": "src/styles/iosstyle/qquickiosstylestyle_p.h",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\n#ifndef QQUICKIOSSTYLESTYLE_P_H\n#define QQUICKIOSSTYLESTYLE_P_H\n\n//\n//  W A R N I N G\n//  -------------\n//\n// This file is not part of the Qt API.  It exists purely as an\n// implementation detail.  This header file may change from version to\n// version without notice, or even be removed.\n//\n// We mean it.\n//\n\n#include <QtGui/qcolor.h>\n\n#ifdef QT_QUICKCONTROLS2IMPL_LIB\n#include <QtQuickControls2Impl/private/qquickattachedobject_p.h>\n#else\n#include <QtQuickControls2/private/qquickattachedobject_p.h>\n#endif\n\nQT_BEGIN_NAMESPACE\n\nclass QQuickIOSStyleStyle : public QQuickAttachedObject\n{\n    Q_OBJECT\n    Q_PROPERTY(Theme theme READ theme WRITE setTheme RESET resetTheme NOTIFY themeChanged FINAL)\n    Q_PROPERTY(QVariant primary READ primary WRITE setPrimary RESET resetPrimary NOTIFY primaryChanged FINAL)\n    Q_PROPERTY(QVariant accent READ accent WRITE setAccent RESET resetAccent NOTIFY accentChanged FINAL)\n    Q_PROPERTY(QVariant foreground READ foreground WRITE setForeground RESET resetForeground NOTIFY foregroundChanged FINAL)\n    Q_PROPERTY(QVariant background READ background WRITE setBackground RESET resetBackground NOTIFY backgroundChanged FINAL)\n    Q_PROPERTY(int elevation READ elevation WRITE setElevation RESET resetElevation NOTIFY elevationChanged FINAL)\n\n    Q_PROPERTY(QColor primaryColor READ primaryColor NOTIFY primaryChanged FINAL) // TODO: remove?\n    Q_PROPERTY(QColor accentColor READ accentColor NOTIFY accentChanged FINAL) // TODO: remove?\n    Q_PROPERTY(QColor backgroundColor READ backgroundColor NOTIFY backgroundChanged FINAL)\n    Q_PROPERTY(QColor primaryTextColor READ primaryTextColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor primaryHighlightedTextColor READ primaryHighlightedTextColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor secondaryTextColor READ secondaryTextColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor hintTextColor READ hintTextColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor textSelectionColor READ textSelectionColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor dropShadowColor READ dropShadowColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor dividerColor READ dividerColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor iconColor READ iconColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor iconDisabledColor READ iconDisabledColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor buttonColor READ buttonColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor buttonBorderColor READ buttonBorderColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor buttonDisabledColor READ buttonDisabledColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor highlightedButtonColor READ highlightedButtonColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor frameColor READ frameColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor rippleColor READ rippleColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor highlightedRippleColor READ highlightedRippleColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor switchUncheckedTrackColor READ switchUncheckedTrackColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor switchCheckedTrackColor READ switchCheckedTrackColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor switchBorderColor READ switchBorderColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor switchHandleColor READ switchHandleColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor switchDisabledTrackColor READ switchDisabledTrackColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor switchDisabledHandleColor READ switchDisabledHandleColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor scrollBarColor READ scrollBarColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor scrollBarHoveredColor READ scrollBarHoveredColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor scrollBarPressedColor READ scrollBarPressedColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor sliderBackgroundColor READ sliderBackgroundColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor sliderForegroundColor READ sliderForegroundColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor sliderHandleColor READ sliderHandleColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor dialogColor READ dialogColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor backgroundDimColor READ backgroundDimColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor listHighlightColor READ listHighlightColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor tooltipColor READ tooltipColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor toolBarColor READ toolBarColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor toolTextColor READ toolTextColor NOTIFY paletteChanged FINAL)\n    Q_PROPERTY(QColor spinBoxDisabledIconColor READ spinBoxDisabledIconColor NOTIFY paletteChanged FINAL)\n\n    Q_PROPERTY(int touchTarget READ touchTarget CONSTANT FINAL)\n    Q_PROPERTY(int buttonHeight READ buttonHeight CONSTANT FINAL)\n    Q_PROPERTY(int delegateHeight READ delegateHeight CONSTANT FINAL)\n    Q_PROPERTY(int dialogButtonBoxHeight READ dialogButtonBoxHeight CONSTANT FINAL)\n    Q_PROPERTY(int frameVerticalPadding READ frameVerticalPadding CONSTANT FINAL)\n    Q_PROPERTY(int menuItemHeight READ menuItemHeight CONSTANT FINAL)\n    Q_PROPERTY(int menuItemVerticalPadding READ menuItemVerticalPadding CONSTANT FINAL)\n    Q_PROPERTY(int switchDelegateVerticalPadding READ switchDelegateVerticalPadding CONSTANT FINAL)\n    Q_PROPERTY(int tooltipHeight READ tooltipHeight CONSTANT FINAL)\n\n#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))\n    QML_NAMED_ELEMENT(IOSStyle)\n    QML_ATTACHED(QQuickIOSStyleStyle)\n    QML_UNCREATABLE(\"\")\n    QML_ADDED_IN_VERSION(2, 0)\n#endif\n\npublic:\n    enum Theme {\n        Light,\n        Dark,\n        System\n    };\n\n    enum Variant {\n        Normal,\n        Dense\n    };\n\n    enum Color {\n        Red,\n        Orange,\n        Yellow,\n        Green,\n        TealBlue,\n        Blue,\n        Purple,\n        Pink\n    };\n\n    Q_ENUM(Theme)\n    Q_ENUM(Variant)\n    Q_ENUM(Color)\n\n    explicit QQuickIOSStyleStyle(QObject *parent = nullptr);\n\n    static QQuickIOSStyleStyle *qmlAttachedProperties(QObject *object);\n\n    Theme theme() const;\n    void setTheme(Theme theme);\n    void inheritTheme(Theme theme);\n    void propagateTheme();\n    void resetTheme();\n\n    QVariant primary() const;\n    void setPrimary(const QVariant &accent);\n    void inheritPrimary(uint primary, bool custom);\n    void propagatePrimary();\n    void resetPrimary();\n\n    QVariant accent() const;\n    void setAccent(const QVariant &accent);\n    void inheritAccent(uint accent, bool custom);\n    void propagateAccent();\n    void resetAccent();\n\n    QVariant foreground() const;\n    void setForeground(const QVariant &foreground);\n    void inheritForeground(uint foreground, bool custom, bool has);\n    void propagateForeground();\n    void resetForeground();\n\n    QVariant background() const;\n    void setBackground(const QVariant &background);\n    void inheritBackground(uint background, bool custom, bool has);\n    void propagateBackground();\n    void resetBackground();\n\n    int elevation() const;\n    void setElevation(int elevation);\n    void resetElevation();\n\n    QColor primaryColor() const;\n    QColor accentColor() const;\n    QColor backgroundColor() const;\n    QColor primaryTextColor() const;\n    QColor primaryHighlightedTextColor() const;\n    QColor secondaryTextColor() const;\n    QColor hintTextColor() const;\n    QColor textSelectionColor() const;\n    QColor dropShadowColor() const;\n    QColor dividerColor() const;\n    QColor iconColor() const;\n    QColor iconDisabledColor() const;\n    QColor buttonColor() const;\n    QColor buttonBorderColor() const;\n    QColor buttonDisabledColor() const;\n    QColor highlightedButtonColor() const;\n    QColor highlightedButtonDisabledColor() const;\n    QColor frameColor() const;\n    QColor rippleColor() const;\n    QColor highlightedRippleColor() const;\n    QColor switchUncheckedTrackColor() const;\n    QColor switchCheckedTrackColor() const;\n    QColor switchBorderColor() const;\n    QColor switchHandleColor() const;\n    QColor switchDisabledTrackColor() const;\n    QColor switchDisabledHandleColor() const;\n    QColor scrollBarColor() const;\n    QColor scrollBarHoveredColor() const;\n    QColor scrollBarPressedColor() const;\n    QColor sliderBackgroundColor() const;\n    QColor sliderForegroundColor() const;\n    QColor sliderHandleColor() const;\n    QColor dialogColor() const;\n    QColor backgroundDimColor() const;\n    QColor listHighlightColor() const;\n    QColor tooltipColor() const;\n    QColor toolBarColor() const;\n    QColor toolTextColor() const;\n    QColor spinBoxDisabledIconColor() const;\n\n    Q_INVOKABLE QColor color(Color color) const;\n\n    int touchTarget() const;\n    int buttonHeight() const;\n    int delegateHeight() const;\n    int dialogButtonBoxHeight() const;\n    int frameVerticalPadding() const;\n    int menuItemHeight() const;\n    int menuItemVerticalPadding() const;\n    int switchDelegateVerticalPadding() const;\n    int tooltipHeight() const;\n\n    static void initGlobals();\n\n    static Variant variant();\n\nQ_SIGNALS:\n    void themeChanged();\n    void primaryChanged();\n    void accentChanged();\n    void foregroundChanged();\n    void backgroundChanged();\n    void elevationChanged();\n\n    void paletteChanged();\n\nprotected:\n    void attachedParentChange(QQuickAttachedObject *newParent, QQuickAttachedObject *oldParent) override;\n\nprivate:\n    void init();\n    bool variantToRgba(const QVariant &var, const char *name, QRgb *rgba, bool *custom) const;\n\n    QColor buttonColor(bool highlighted) const;\n\n    // These reflect whether a color value was explicitly set on the specific\n    // item that this attached style object represents.\n    bool m_explicitTheme = false;\n    bool m_explicitPrimary = false;\n    bool m_explicitAccent = false;\n    bool m_explicitForeground = false;\n    bool m_explicitBackground = false;\n    // These reflect whether the color value that was either inherited or\n    // explicitly set is in the form that QColor expects, rather than one of\n    // our pre-defined color enum values.\n    bool m_customPrimary = false;\n    bool m_customAccent = false;\n    bool m_customForeground = false;\n    bool m_customBackground = false;\n    // These will be true when this item has an explicit or inherited foreground/background\n    // color, or these colors were declared globally via settings (e.g. conf or env vars).\n    // Some color properties of the style will return different values depending on whether\n    // or not these are set.\n    bool m_hasForeground = false;\n    bool m_hasBackground = false;\n    // The actual values for this item, whether explicit, inherited or globally set.\n    Theme m_theme = Light;\n    uint m_primary = 0;\n    uint m_accent = 0;\n    uint m_foreground = 0;\n    uint m_background = 0;\n    int m_elevation = 0;\n};\n\nQT_END_NAMESPACE\n\nQML_DECLARE_TYPEINFO(QQuickIOSStyleStyle, QML_HAS_ATTACHED_PROPERTIES)\n\n#endif // QQUICKIOSSTYLESTYLE_P_H\n"
  },
  {
    "path": "src/styles/iosstyle/qquickiosstyletheme.cpp",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\n#include \"qquickiosstyletheme_p.h\"\n#include \"qquickiosstylestyle_p.h\"\n\n#include <QtGui/qpa/qplatformdialoghelper.h>\n#include <QtGui/qfont.h>\n#include <QtGui/qfontinfo.h>\n#include <QtQuickTemplates2/private/qquicktheme_p.h>\n\nQT_BEGIN_NAMESPACE\n\nvoid QQuickIOSStyleTheme::initialize(QQuickTheme *theme)\n{\n    QFont systemFont;\n    QFont buttonFont;\n    QFont toolTipFont;\n    QFont itemViewFont;\n    QFont listViewFont;\n    QFont menuItemFont;\n    QFont editorFont;\n\n    QFont font;\n    font.setFamily(QLatin1String(\"Roboto\"));\n    QString family = QFontInfo(font).family();\n\n    if (family != QLatin1String(\"Roboto\")) {\n        font.setFamily(QLatin1String(\"Noto\"));\n        family = QFontInfo(font).family();\n    }\n\n    if (family == QLatin1String(\"Roboto\") || family == QLatin1String(\"Noto\")) {\n        systemFont.setFamily(family);\n        buttonFont.setFamily(family);\n        toolTipFont.setFamily(family);\n        itemViewFont.setFamily(family);\n        listViewFont.setFamily(family);\n        menuItemFont.setFamily(family);\n        editorFont.setFamily(family);\n    }\n\n    const bool dense = QQuickIOSStyleStyle::variant() == QQuickIOSStyleStyle::Dense;\n    systemFont.setPixelSize(dense ? 13 : 14);\n    theme->setFont(QQuickTheme::System, systemFont);\n\n    // https://iosstyle.io/guidelines/components/buttons.html#buttons-style\n    buttonFont.setPixelSize(dense ? 13 : 14);\n    buttonFont.setWeight(QFont::Medium);\n    theme->setFont(QQuickTheme::Button, buttonFont);\n    theme->setFont(QQuickTheme::TabBar, buttonFont);\n    theme->setFont(QQuickTheme::ToolBar, buttonFont);\n\n    // https://iosstyle.io/guidelines/components/tooltips.html\n    toolTipFont.setPixelSize(dense ? 10 : 14);\n    toolTipFont.setWeight(QFont::Medium);\n    theme->setFont(QQuickTheme::ToolTip, toolTipFont);\n\n    itemViewFont.setPixelSize(dense ? 13 : 14);\n    itemViewFont.setWeight(QFont::Medium);\n    theme->setFont(QQuickTheme::ItemView, itemViewFont);\n\n    // https://iosstyle.io/guidelines/components/lists.html#lists-specs\n    listViewFont.setPixelSize(dense ? 13 : 16);\n    theme->setFont(QQuickTheme::ListView, listViewFont);\n\n    menuItemFont.setPixelSize(dense ? 13 : 16);\n    theme->setFont(QQuickTheme::Menu, menuItemFont);\n    theme->setFont(QQuickTheme::MenuBar, menuItemFont);\n    theme->setFont(QQuickTheme::ComboBox, menuItemFont);\n\n    editorFont.setPixelSize(dense ? 13 : 16);\n    theme->setFont(QQuickTheme::TextArea, editorFont);\n    theme->setFont(QQuickTheme::TextField, editorFont);\n    theme->setFont(QQuickTheme::SpinBox, editorFont);\n}\n\nQT_END_NAMESPACE\n"
  },
  {
    "path": "src/styles/iosstyle/qquickiosstyletheme_p.h",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\n#ifndef QQUICKIOSSTYLETHEME_P_H\n#define QQUICKIOSSTYLETHEME_P_H\n\n//\n//  W A R N I N G\n//  -------------\n//\n// This file is not part of the Qt API.  It exists purely as an\n// implementation detail.  This header file may change from version to\n// version without notice, or even be removed.\n//\n// We mean it.\n//\n\n#include <QtCore/qglobal.h>\n\nQT_BEGIN_NAMESPACE\n\nclass QQuickTheme;\n\nclass QQuickIOSStyleTheme\n{\npublic:\n    static void initialize(QQuickTheme *theme);\n};\n\nQT_END_NAMESPACE\n\n#endif // QQUICKIOSSTYLETHEME_P_H\n"
  },
  {
    "path": "src/styles/iosstyle/qt_attribution.json",
    "content": "{\n    \"Id\": \"shadow_angular_iosstyle\",\n    \"Name\": \"Shadow values from Angular IOSStyle\",\n    \"QDocModule\": \"qtquickcontrols\",\n    \"QtUsage\": \"Used in the IOSStyle Style of Qt Quick Controls 2.\",\n    \"Files\": \"ElevationEffect.qml\",\n    \"Description\": \"Shadow values for the elevation effect.\",\n    \"Homepage\": \"https://angularjs.org/\",\n    \"License\": \"MIT License\",\n    \"LicenseId\": \"MIT\",\n    \"LicenseFile\": \"LICENSE_ANGULARJS.txt\",\n    \"Copyright\": \"Copyright (c) 2014-2016 Google, Inc\"\n}\n"
  },
  {
    "path": "src/styles/iosstyle/qtquickcontrols2iosstylestyleplugin.cpp",
    "content": "/****************************************************************************\n**\n** Copyright (C) 2017 The Qt Company Ltd.\n** Contact: http://www.qt.io/licensing/\n**\n** This file is part of the Qt Quick Controls 2 module of the Qt Toolkit.\n**\n** $QT_BEGIN_LICENSE:LGPL3$\n** Commercial License Usage\n** Licensees holding valid commercial Qt licenses may use this file in\n** accordance with the commercial license agreement provided with the\n** Software or, alternatively, in accordance with the terms contained in\n** a written agreement between you and The Qt Company. For licensing terms\n** and conditions see http://www.qt.io/terms-conditions. For further\n** information use the contact form at http://www.qt.io/contact-us.\n**\n** GNU Lesser General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU Lesser\n** General Public License version 3 as published by the Free Software\n** Foundation and appearing in the file LICENSE.LGPLv3 included in the\n** packaging of this file. Please review the following information to\n** ensure the GNU Lesser General Public License version 3 requirements\n** will be met: https://www.gnu.org/licenses/lgpl.html.\n**\n** GNU General Public License Usage\n** Alternatively, this file may be used under the terms of the GNU\n** General Public License version 2.0 or later as published by the Free\n** Software Foundation and appearing in the file LICENSE.GPL included in\n** the packaging of this file. Please review the following information to\n** ensure the GNU General Public License version 2.0 requirements will be\n** met: http://www.gnu.org/licenses/gpl-2.0.html.\n**\n** $QT_END_LICENSE$\n**\n****************************************************************************/\n\n#include <QtQuickControls2/private/qquickstyleplugin_p.h>\n\n#include \"qquickiosstylestyle_p.h\"\n#include \"qquickiosstyletheme_p.h\"\n#include \"qquickiosstyleripple_p.h\"\n\n#include <QDir>\n#include <QQmlContext>\n\n#ifdef QT_QUICKCONTROLS2IMPL_LIB\n#include <QtQuickControls2/private/qquickstyleplugin_p.h>\n#include <QtQuickControls2Impl/private/qquickpaddedrectangle_p.h>\n#include <QtQuickTemplates2/private/qquicktheme_p.h>\n#else\n#include <QtQuickControls2/private/qquickstyleselector_p.h>\n#include <QtQuickControls2/private/qquickpaddedrectangle_p.h>\n#endif\n\nQT_BEGIN_NAMESPACE\n\nclass QtQuickControls2IOSStyleStylePlugin : public QQuickStylePlugin\n{\n    Q_OBJECT\n    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)\n\npublic:\n    QtQuickControls2IOSStyleStylePlugin(QObject *parent = nullptr);\n\n    void registerTypes(const char *uri) override;\n\n    QString name() const override;\n    void initializeTheme(QQuickTheme *theme) override;\n};\n\nQtQuickControls2IOSStyleStylePlugin::QtQuickControls2IOSStyleStylePlugin(QObject *parent) : QQuickStylePlugin(parent)\n{\n    QQuickIOSStyleStyle::initGlobals();\n}\n\nvoid QtQuickControls2IOSStyleStylePlugin::registerTypes(const char *uri)\n{\n    qmlRegisterModule(uri, 2, QT_VERSION_MINOR); // Qt 5.12->2.12, 5.13->2.13...\n    qmlRegisterUncreatableType<QQuickIOSStyleStyle>(uri, 2, 0, \"IOSStyle\", tr(\"IOSStyle is an attached property\"));\n\n    QByteArray import = QByteArray(uri) + \".impl\";\n    qmlRegisterModule(import, 2, QT_VERSION_MINOR); // Qt 5.12->2.12, 5.13->2.13...\n\n#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))\n    auto resolvedUrl = [](const QString &path) -> QUrl {\n        return QUrl(QStringLiteral(\"qrc:/qt-project.org/imports/QtQuick/Controls/IOSStyle/\") + path);\n    };\n\n    auto list = QDir(QStringLiteral(\":/qt-project.org/imports/QtQuick/Controls/IOSStyle/\")).entryList({QStringLiteral(\"*.qml\")});\n    for (const auto &l: list)\n        qmlRegisterType(resolvedUrl(l), uri, 2, 12, QString(l).remove(QStringLiteral(\".qml\")).toUtf8());\n#endif\n\n    qmlRegisterType<QQuickIOSStyleRipple>(import, 2, 0, \"Ripple\");\n    qmlRegisterType(resolvedUrl(QStringLiteral(\"BoxShadow.qml\")), import, 2, 0, \"BoxShadow\");\n    qmlRegisterType(resolvedUrl(QStringLiteral(\"FastDropShadow.qml\")), import, 2, 0, \"FastDropShadow\");\n    qmlRegisterType(resolvedUrl(QStringLiteral(\"CheckIndicator.qml\")), import, 2, 0, \"CheckIndicator\");\n    qmlRegisterType(resolvedUrl(QStringLiteral(\"CursorDelegate.qml\")), import, 2, 0, \"CursorDelegate\");\n    qmlRegisterType(resolvedUrl(QStringLiteral(\"ElevationEffect.qml\")), import, 2, 0, \"ElevationEffect\");\n    qmlRegisterType(resolvedUrl(QStringLiteral(\"RadioIndicator.qml\")), import, 2, 0, \"RadioIndicator\");\n    qmlRegisterType(resolvedUrl(QStringLiteral(\"RectangularGlow.qml\")), import, 2, 0, \"RectangularGlow\");\n    qmlRegisterType(resolvedUrl(QStringLiteral(\"SliderHandle.qml\")), import, 2, 0, \"SliderHandle\");\n    qmlRegisterType(resolvedUrl(QStringLiteral(\"SwitchIndicator.qml\")), import, 2, 0, \"SwitchIndicator\");\n}\n\nQString QtQuickControls2IOSStyleStylePlugin::name() const\n{\n    return QStringLiteral(\"IOSStyle\");\n}\n\nvoid QtQuickControls2IOSStyleStylePlugin::initializeTheme(QQuickTheme *theme)\n{\n    QQuickIOSStyleTheme::initialize(theme);\n}\n\nQT_END_NAMESPACE\n\n#include \"qtquickcontrols2iosstylestyleplugin.moc\"\n"
  },
  {
    "path": "src/styles/iosstyle/qtquickcontrols2iosstylestyleplugin.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/qt-project.org/imports/QtQuick/Controls.2/IOSStyle\">\n        <file>images/arrow-indicator.png</file>\n        <file>images/arrow-indicator@2x.png</file>\n        <file>images/arrow-indicator@3x.png</file>\n        <file>images/arrow-indicator@4x.png</file>\n        <file>images/check.png</file>\n        <file>images/check@2x.png</file>\n        <file>images/check@3x.png</file>\n        <file>images/check@4x.png</file>\n        <file>images/drop-indicator.png</file>\n        <file>images/drop-indicator@2x.png</file>\n        <file>images/drop-indicator@3x.png</file>\n        <file>images/drop-indicator@4x.png</file>\n        <file>shaders/RectangularGlow.frag</file>\n        <file>shaders/+glslcore/RectangularGlow.frag</file>\n        <file>shaders/+hlsl/RectangularGlow.frag</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "src/styles/iosstyle/shaders/+glslcore/RectangularGlow.frag",
    "content": "#version 150\n\nuniform float qt_Opacity;\nuniform float relativeSizeX;\nuniform float relativeSizeY;\nuniform float spread;\nuniform vec4 color;\n\nin vec2 qt_TexCoord0;\nout vec4 fragColor;\n\nfloat linearstep(float e0, float e1, float x)\n{\n    return clamp((x - e0) / (e1 - e0), 0.0, 1.0);\n}\n\nvoid main()\n{\n    float alpha =\n        smoothstep(0.0, relativeSizeX, 0.5 - abs(0.5 - qt_TexCoord0.x)) *\n        smoothstep(0.0, relativeSizeY, 0.5 - abs(0.5 - qt_TexCoord0.y));\n\n    float spreadMultiplier = linearstep(spread, 1.0 - spread, alpha);\n    fragColor = color * qt_Opacity * spreadMultiplier * spreadMultiplier;\n}\n"
  },
  {
    "path": "src/styles/iosstyle/shaders/+hlsl/RectangularGlow.frag",
    "content": "cbuffer ConstantBuffer : register(b0)\n{\n    float4x4 qt_Matrix;\n    float qt_Opacity;\n    float relativeSizeX;\n    float relativeSizeY;\n    float spread;\n    float4 color;\n}\n\nfloat linearstep(float e0, float e1, float x) { return clamp((x - e0) / (e1 - e0), 0.0, 1.0); }\n\nfloat4 main(float4 position : SV_POSITION, float2 coord : TEXCOORD0) : SV_TARGET\n{\n    float alpha =\n        smoothstep(0.0, relativeSizeX, 0.5 - abs(0.5 - coord.x)) *\n        smoothstep(0.0, relativeSizeY, 0.5 - abs(0.5 - coord.y));\n\n    float spreadMultiplier = linearstep(spread, 1.0 - spread, alpha);\n    return color * qt_Opacity * spreadMultiplier * spreadMultiplier;\n}\n"
  },
  {
    "path": "src/styles/iosstyle/shaders/RectangularGlow.frag",
    "content": "uniform highp float qt_Opacity;\nuniform mediump float relativeSizeX;\nuniform mediump float relativeSizeY;\nuniform mediump float spread;\nuniform lowp vec4 color;\nvarying highp vec2 qt_TexCoord0;\n\nhighp float linearstep(highp float e0, highp float e1, highp float x) {\n    return clamp((x - e0) / (e1 - e0), 0.0, 1.0);\n}\n\nvoid main() {\n    lowp float alpha =\n        smoothstep(0.0, relativeSizeX, 0.5 - abs(0.5 - qt_TexCoord0.x)) *\n        smoothstep(0.0, relativeSizeY, 0.5 - abs(0.5 - qt_TexCoord0.y));\n\n    highp float spreadMultiplier = linearstep(spread, 1.0 - spread, alpha);\n    gl_FragColor = color * qt_Opacity * spreadMultiplier * spreadMultiplier;\n}\n"
  },
  {
    "path": "src/styles/styles.pro",
    "content": "TEMPLATE = subdirs\n\nqtHaveModule(quicktemplates2-private): SUBDIRS += iosstyle\n"
  },
  {
    "path": "src/widgets/CMakeLists.txt",
    "content": "set(LOCAL_SOURCE\n    ${LOCAL_SOURCE}\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandesktoptools.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanfonthandler.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemantaskbarbutton.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanwidgets_global.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanabstracttaskbarbuttonengine.h\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemannotification.h\n\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemandesktoptools.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemanfonthandler.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemantaskbarbutton.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanabstracttaskbarbuttonengine.cpp\n    ${CMAKE_CURRENT_SOURCE_DIR}/asemannotification.cpp\n    )\n\nif (ANDROID)\n    SET(ASEMAN_COMPILE_DEFINITION ${ASEMAN_COMPILE_DEFINITION} ANDROID_NATIVE_ASEMAN_NOTIFICATION)\n    set(LOCAL_SOURCE\n        ${LOCAL_SOURCE}\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemanandroidnativenotification.h\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemanandroidnativenotification.cpp\n        )\nelseif (IOS)\nelse ()\n    set(LOCAL_SOURCE\n        ${LOCAL_SOURCE}\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemansystemtray.h\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemansystemtray.cpp\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemannativenotificationitem.h\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemannativenotificationitem.cpp\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemannativenotification.h\n        ${CMAKE_CURRENT_SOURCE_DIR}/asemannativenotification.cpp\n        )\n\n    if (LINUX)\n        SET(ASEMAN_COMPILE_DEFINITION ${ASEMAN_COMPILE_DEFINITION} LINUX_NATIVE_ASEMAN_NOTIFICATION)\n        set(LOCAL_SOURCE\n            ${LOCAL_SOURCE}\n            ${CMAKE_CURRENT_SOURCE_DIR}/asemanlinuxnativenotification.h\n            ${CMAKE_CURRENT_SOURCE_DIR}/asemanlinuxnativenotification.cpp\n            ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanunitytaskbarbuttonengine.h\n            ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanunitytaskbarbuttonengine.cpp\n            ${CMAKE_CURRENT_SOURCE_DIR}/asemankdewallet.h\n            ${CMAKE_CURRENT_SOURCE_DIR}/asemankdewallet.cpp\n            )\n    elseif (WIN32)\n        set(LOCAL_SOURCE\n            ${LOCAL_SOURCE}\n            ${CMAKE_CURRENT_SOURCE_DIR}/asemanwintaskbarbuttonengine.h\n            ${CMAKE_CURRENT_SOURCE_DIR}/asemanwintaskbarbuttonengine.cpp\n            )\n    elseif (MACOSX)\n        SET(ASEMAN_COMPILE_DEFINITION ${ASEMAN_COMPILE_DEFINITION} MAC_NATIVE_ASEMAN_NOTIFICATION)\n        set(LOCAL_SOURCE\n            ${LOCAL_SOURCE}\n            ${CMAKE_CURRENT_SOURCE_DIR}/asemanmacnativenotification.h\n            ${CMAKE_CURRENT_SOURCE_DIR}/asemanmacnativenotification.cpp\n            ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanmactaskbarbuttonengine.h\n            ${CMAKE_CURRENT_SOURCE_DIR}/private/asemanmactaskbarbuttonengine.cpp\n            )\n\n    endif ()\nendif ()\n\nset(SOURCE\n    ${SOURCE}\n    ${LOCAL_SOURCE}\n    PARENT_SCOPE)\n\nset(ASEMAN_INCLUDE_DIRS\n    ${ASEMAN_INCLUDE_DIRS}\n    ${CMAKE_CURRENT_SOURCE_DIR}\n    PARENT_SCOPE)\n\nset(ASEMAN_COMPILE_DEFINITION\n    ${ASEMAN_COMPILE_DEFINITION}\n    PARENT_SCOPE)\n"
  },
  {
    "path": "src/widgets/asemanandroidnativenotification.cpp",
    "content": "#include \"asemanandroidnativenotification.h\"\n\n#include <asemanjavalayer.h>\n\nclass AsemanAndroidNativeNotification::Private\n{\npublic:\n    QColor color;\n    quint32 id;\n};\n\nAsemanAndroidNativeNotification::AsemanAndroidNativeNotification(QObject *parent) :\n    QObject(parent)\n{\n    p = new Private;\n    p->id = 1000;\n}\n\nvoid AsemanAndroidNativeNotification::setColor(const QColor &color)\n{\n    if(p->color == color)\n        return;\n\n    p->color = color;\n    Q_EMIT colorChanged();\n}\n\nQColor AsemanAndroidNativeNotification::color() const\n{\n    return p->color;\n}\n\nquint32 AsemanAndroidNativeNotification::sendNotify(const QString &title, const QString &body, const QString &icon, quint32 replace_id, int timeOut, const QStringList &actions)\n{\n    qint32 iconPathIdx = icon.lastIndexOf(QStringLiteral(\"/\"));\n    if(iconPathIdx == -1)\n        return -1;\n\n    QString iconPath = icon.left(iconPathIdx);\n    QString iconName = icon.mid(iconPathIdx+1);\n\n    qint32 id = replace_id? replace_id : p->id;\n    if(!AsemanJavaLayer::instance()->startNotification(id, title, body, iconPath, iconName, \"default\", true) )\n        return -1;\n\n    if(replace_id == 0) p->id++;\n    return id;\n}\n\nvoid AsemanAndroidNativeNotification::closeNotification(quint32 id)\n{\n    AsemanJavaLayer::instance()->stopNotification(id);\n}\n\nAsemanAndroidNativeNotification::~AsemanAndroidNativeNotification()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/widgets/asemanandroidnativenotification.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANANDROIDNATIVENOTIFICATION_H\n#define ASEMANANDROIDNATIVENOTIFICATION_H\n\n#include <QObject>\n#include <QStringList>\n#include <QColor>\n\n#include \"asemanwidgets_global.h\"\n\nclass LIBQTASEMAN_WIDGETS_EXPORT AsemanAndroidNativeNotification : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)\n\n    class Private;\n\npublic:\n    AsemanAndroidNativeNotification(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanAndroidNativeNotification();\n\n    void setColor(const QColor &color);\n    QColor color() const;\n\npublic Q_SLOTS:\n    quint32 sendNotify(const QString &title, const QString &body, const QString &icon, quint32 replace_id = 0, int timeOut = 3000 , const QStringList &actions = QStringList());\n    void closeNotification(quint32 id );\n\nQ_SIGNALS:\n    void notifyClosed(quint32 id);\n    void notifyTimedOut(quint32 id);\n    void notifyAction(quint32 id, const QString &action);\n    void colorChanged();\n\nprivate:\n    Private *p;\n};\n\ntypedef AsemanAndroidNativeNotification QAsemanAndroidNativeNotification;\n\n#endif // ASEMANANDROIDNATIVENOTIFICATION_H\n"
  },
  {
    "path": "src/widgets/asemandesktoptools.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemandesktoptools.h\"\n\n#include <QProcess>\n#include <QStringList>\n#include <QPalette>\n#include <QEventLoop>\n#include <QFontDatabase>\n#include <QDebug>\n\n#if defined(QT_WIDGETS_LIB)\n#include <QFileDialog>\n#endif\n\n#if defined(DESKTOP_DEVICE) && defined(QT_WIDGETS_LIB)\n#include <QInputDialog>\n#include <QColorDialog>\n#include <QFontDialog>\n#include <QMenu>\n#include <QAction>\n#include <QMessageBox>\n#include <QToolTip>\n#endif\n\nclass AsemanDesktopToolsPrivate\n{\npublic:\n    QFontDatabase *font_db;\n    QString style;\n    QString tooltip;\n#ifdef DESKTOP_DEVICE\n    QList<QMenu*> currentMenuObjects;\n#endif\n};\n\nAsemanDesktopTools::AsemanDesktopTools(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanDesktopToolsPrivate;\n    p->font_db = 0;\n}\n\nint AsemanDesktopTools::desktopSession()\n{\n    static int result = -1;\n    if( result != -1 )\n        return result;\n\n#ifdef Q_OS_MAC\n    result = AsemanDesktopTools::Mac;\n#else\n#ifdef Q_OS_WIN\n    result = AsemanDesktopTools::Windows;\n#else\n    static QString *desktop_session = 0;\n    if( !desktop_session )\n        desktop_session = new QString( QString::fromUtf8(qgetenv(\"DESKTOP_SESSION\")) );\n\n    if( desktop_session->contains(QStringLiteral(\"kde\"),Qt::CaseInsensitive) )\n        result = AsemanDesktopTools::Kde;\n    else\n    if( desktop_session->contains(QStringLiteral(\"plasma\"),Qt::CaseInsensitive) )\n        result = AsemanDesktopTools::Plasma;\n    else\n    if( desktop_session->contains(QStringLiteral(\"ubuntu\"),Qt::CaseInsensitive) )\n        result = AsemanDesktopTools::Unity;\n    else\n    if( desktop_session->contains(QStringLiteral(\"gnome-fallback\"),Qt::CaseInsensitive) )\n        result = AsemanDesktopTools::GnomeFallBack;\n    else\n    if( desktop_session->contains(QStringLiteral(\"gnome\"),Qt::CaseInsensitive) )\n        result = AsemanDesktopTools::Gnome;\n#endif\n#endif\n\n    if( result == -1 )\n        result = AsemanDesktopTools::Unknown;\n\n    return result;\n}\n\nQColor AsemanDesktopTools::titleBarColor() const\n{\n#ifdef DESKTOP_DEVICE\n    const int dsession = desktopSession();\n    switch( dsession )\n    {\n    case AsemanDesktopTools::Mac:\n        return QColor(\"#C8C8C8\");\n        break;\n\n    case AsemanDesktopTools::Windows:\n        return QColor(\"#E5E5E5\");\n        break;\n\n    case AsemanDesktopTools::Kde:\n    case AsemanDesktopTools::Plasma:\n        return QPalette().window().color();\n        break;\n\n    case AsemanDesktopTools::Unity:\n    case AsemanDesktopTools::GnomeFallBack:\n    case AsemanDesktopTools::Gnome:\n    {\n        static QColor *res = 0;\n        if( !res )\n        {\n            QProcess prc;\n            prc.start(QStringLiteral(\"dconf\"), QStringList()<< QStringLiteral(\"read\")<< QStringLiteral(\"/org/gnome/desktop/interface/gtk-theme\"));\n            prc.waitForStarted();\n            prc.waitForFinished();\n            QString sres = QString::fromUtf8(prc.readAll());\n            sres.remove(QStringLiteral(\"\\n\")).remove(QStringLiteral(\"'\"));\n            sres = sres.toLower();\n\n            if( sres == QStringLiteral(\"ambiance\") )\n                res = new QColor(\"#403F3A\");\n            else\n            if( sres == QStringLiteral(\"radiance\") )\n                res = new QColor(\"#DFD7CF\");\n            else\n            if( sres == QStringLiteral(\"adwaita\") )\n                res = new QColor(\"#EDEDED\");\n            else\n            if( dsession == AsemanDesktopTools::Unity )\n                res = new QColor(\"#403F3A\");\n            else\n                res = new QColor(\"#EDEDED\");\n        }\n\n        return *res;\n    }\n        break;\n    }\n\n    return QColor(\"#EDEDED\");\n#else\n    return QColor(\"#111111\");\n#endif\n}\n\nQColor AsemanDesktopTools::titleBarTransparentColor() const\n{\n    QColor color = titleBarColor();\n    color.setAlpha(160);\n    return color;\n}\n\nQColor AsemanDesktopTools::titleBarTextColor() const\n{\n#ifdef DESKTOP_DEVICE\n    const int dsession = desktopSession();\n    switch( dsession )\n    {\n    case AsemanDesktopTools::Mac:\n        return QColor(\"#333333\");\n        break;\n\n    case AsemanDesktopTools::Windows:\n        return QColor(\"#333333\");\n        break;\n\n    case AsemanDesktopTools::Kde:\n    case AsemanDesktopTools::Plasma:\n        return QPalette().windowText().color();\n        break;\n\n    case AsemanDesktopTools::Unity:\n    case AsemanDesktopTools::GnomeFallBack:\n    case AsemanDesktopTools::Gnome:\n    {\n        static QColor *res = 0;\n        if( !res )\n        {\n            QProcess prc;\n            prc.start( QStringLiteral(\"dconf\"), QStringList()<< QStringLiteral(\"read\")<< QStringLiteral(\"/org/gnome/desktop/interface/gtk-theme\") );\n            prc.waitForStarted();\n            prc.waitForFinished();\n            QString sres = QString::fromUtf8(prc.readAll());\n            sres.remove(QStringLiteral(\"\\n\")).remove(QStringLiteral(\"'\"));\n            sres = sres.toLower();\n\n            if( sres == QStringLiteral(\"ambiance\") )\n                res = new QColor(\"#eeeeee\");\n            else\n            if( sres == QStringLiteral(\"radiance\") )\n                res = new QColor(\"#333333\");\n            else\n            if( sres == QStringLiteral(\"adwaita\") )\n                res = new QColor(\"#333333\");\n            else\n            if( dsession == AsemanDesktopTools::Unity )\n                res = new QColor(\"#eeeeee\");\n            else\n                res = new QColor(\"#333333\");\n        }\n\n        return *res;\n    }\n        break;\n    }\n\n    return QColor(\"#333333\");\n#else\n    return QColor(\"#ffffff\");\n#endif\n}\n\nbool AsemanDesktopTools::titleBarIsDark() const\n{\n    const QColor & clr = titleBarColor();\n    qreal middle = (clr.green()+clr.red()+clr.blue())/3.0;\n    if( middle>128 )\n        return false;\n    else\n        return true;\n}\n\nQStringList AsemanDesktopTools::fontFamilies() const\n{\n    if(!p->font_db)\n        p->font_db = new QFontDatabase();\n\n    return p->font_db->families();\n}\n\nvoid AsemanDesktopTools::setMenuStyle(const QString &style)\n{\n    if(p->style == style)\n        return;\n\n    p->style = style;\n    Q_EMIT menuStyleChanged();\n}\n\nQString AsemanDesktopTools::menuStyle() const\n{\n    return p->style;\n}\n\nvoid AsemanDesktopTools::setTooltip(const QString &txt)\n{\n#if defined(DESKTOP_DEVICE) && defined(QT_WIDGETS_LIB)\n    QToolTip::hideText();\n    if(!txt.isEmpty())\n        QToolTip::showText(QCursor::pos(), txt);\n#endif\n\n    if(p->tooltip == txt)\n        return;\n\n    p->tooltip = txt;\n    Q_EMIT tooltipChanged();\n}\n\nQString AsemanDesktopTools::tooltip() const\n{\n    return p->tooltip;\n}\n\nQObject *AsemanDesktopTools::currentMenuObject() const\n{\n#if defined(DESKTOP_DEVICE) && defined(QT_WIDGETS_LIB)\n    if(p->currentMenuObjects.isEmpty())\n        return 0;\n\n    return p->currentMenuObjects.last();\n#else\n    return 0;\n#endif\n}\n\nQString AsemanDesktopTools::getOpenFileName(QWindow *window, const QString & title, const QString &filter, const QString &startPath)\n{\n#if defined(DESKTOP_DEVICE) && defined(QT_WIDGETS_LIB)\n    const int dsession = desktopSession();\n    switch( dsession )\n    {\n    case AsemanDesktopTools::Kde:\n    case AsemanDesktopTools::Plasma:\n        if( QFileInfo::exists(QStringLiteral(\"/usr/bin/kdialog\")) )\n        {\n            QStringList args = QStringList()<< QStringLiteral(\"--title\") << title << QStringLiteral(\"--getopenfilename\")\n                                            << startPath << filter;\n            if( window )\n                args << QStringLiteral(\"--attach\") << QString::number(window->winId());\n\n            QProcess process;\n            QEventLoop loop;\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n            connect(&process, static_cast<void(QProcess::*)(int)>(&QProcess::finished), &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#else\n            connect(&process, &QProcess::finished, &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#endif\n\n            process.start(QStringLiteral(\"/usr/bin/kdialog\"), args );\n            loop.exec(QEventLoop::ExcludeUserInputEvents);\n\n            if( process.exitStatus() == QProcess::NormalExit )\n                return QString::fromUtf8(process.readAll()).remove(QStringLiteral(\"\\n\"));\n            else\n                return QFileDialog::getOpenFileName(0, title, startPath, filter);\n        }\n        else\n            return QFileDialog::getOpenFileName(0, title, startPath, filter);\n        break;\n\n    case AsemanDesktopTools::Unity:\n    case AsemanDesktopTools::GnomeFallBack:\n    case AsemanDesktopTools::Gnome:\n        if( QFileInfo::exists(QStringLiteral(\"/usr/bin/zenity\")) )\n        {\n            QStringList args = QStringList()<< QStringLiteral(\"--title=\") << QStringLiteral(\"--file-selection\") <<\n                                               QStringLiteral(\"--class=Cutegram\") << QStringLiteral(\"--name=Cutegram\");\n            if(!filter.isEmpty())\n                args << QStringLiteral(\"--file-filter=\") + filter;\n\n            QProcess process;\n            QEventLoop loop;\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n            connect(&process, static_cast<void(QProcess::*)(int)>(&QProcess::finished), &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#else\n            connect(&process, &QProcess::finished, &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#endif\n\n            process.start(QStringLiteral(\"/usr/bin/zenity\"), args );\n            loop.exec(QEventLoop::ExcludeUserInputEvents);\n\n            if( process.exitStatus() == QProcess::NormalExit )\n                return QString::fromUtf8(process.readAll()).remove(QStringLiteral(\"\\n\"));\n            else\n                return QFileDialog::getOpenFileName(0, title, startPath, filter);\n        }\n        else\n            return QFileDialog::getOpenFileName(0, title, startPath, filter);\n        break;\n\n    case AsemanDesktopTools::Mac:\n    case AsemanDesktopTools::Windows:\n        return QFileDialog::getOpenFileName(0, title, startPath, filter);\n        break;\n    }\n\n    return QString();\n#else\n#if defined(QT_WIDGETS_LIB)\n    return QFileDialog::getOpenFileName(0, title, startPath, filter);\n#else\n    Q_UNUSED(window)\n    Q_UNUSED(title)\n    Q_UNUSED(filter)\n    Q_UNUSED(startPath)\n    return QString();\n#endif\n#endif\n}\n\nQStringList AsemanDesktopTools::getOpenFileNames(QWindow *window, const QString &title, const QString &filter, const QString &startPath)\n{\n#if defined(DESKTOP_DEVICE) && defined(QT_WIDGETS_LIB)\n    const int dsession = desktopSession();\n    switch( dsession )\n    {\n    case AsemanDesktopTools::Kde:\n    case AsemanDesktopTools::Plasma:\n        if( QFileInfo::exists(QStringLiteral(\"/usr/bin/kdialog\")) )\n        {\n            QStringList args = QStringList()<< QStringLiteral(\"--title\") << title << QStringLiteral(\"--getopenfilename\")\n                                            << startPath << filter;\n            if( window )\n                args << QStringLiteral(\"--attach\") << QString::number(window->winId());\n\n            QProcess process;\n            QEventLoop loop;\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n            connect(&process, static_cast<void(QProcess::*)(int)>(&QProcess::finished), &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#else\n            connect(&process, &QProcess::finished, &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#endif\n\n            process.start(QStringLiteral(\"/usr/bin/kdialog\"), args );\n            loop.exec(QEventLoop::ExcludeUserInputEvents);\n\n            if( process.exitStatus() == QProcess::NormalExit )\n                return QStringList() << QString::fromUtf8(process.readAll()).remove(QStringLiteral(\"\\n\"));\n            else\n                return QFileDialog::getOpenFileNames(0, title, startPath, filter);\n        }\n        else\n            return QFileDialog::getOpenFileNames(0, title, startPath, filter);\n        break;\n\n    case AsemanDesktopTools::Unity:\n    case AsemanDesktopTools::GnomeFallBack:\n    case AsemanDesktopTools::Gnome:\n        if( QFileInfo::exists(QStringLiteral(\"/usr/bin/zenity\")) )\n        {\n            QStringList args = QStringList()<< QStringLiteral(\"--title=\") << QStringLiteral(\"--file-selection\") <<\n                                               QStringLiteral(\"--class=Cutegram\") << QStringLiteral(\"--name=Cutegram\");\n            if(!filter.isEmpty())\n                args << QStringLiteral(\"--file-filter=\") + filter;\n\n            QProcess process;\n            QEventLoop loop;\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n            connect(&process, static_cast<void(QProcess::*)(int)>(&QProcess::finished), &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#else\n            connect(&process, &QProcess::finished, &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#endif\n\n            process.start(QStringLiteral(\"/usr/bin/zenity\"), args );\n            loop.exec(QEventLoop::ExcludeUserInputEvents);\n\n            if( process.exitStatus() == QProcess::NormalExit )\n                return QStringList() << QString::fromUtf8(process.readAll()).remove(QStringLiteral(\"\\n\"));\n            else\n                return QFileDialog::getOpenFileNames(0, title, startPath, filter);\n        }\n        else\n            return QFileDialog::getOpenFileNames(0, title, startPath, filter);\n        break;\n\n    case AsemanDesktopTools::Mac:\n    case AsemanDesktopTools::Windows:\n        return QFileDialog::getOpenFileNames(0, title, startPath, filter);\n        break;\n    }\n\n    return QStringList();\n#else\n#if defined(QT_WIDGETS_LIB)\n    return QFileDialog::getOpenFileNames(0, title, startPath, filter);\n#else\n#endif\n    Q_UNUSED(window)\n    Q_UNUSED(title)\n    Q_UNUSED(filter)\n    Q_UNUSED(startPath)\n    return QStringList();\n#endif\n}\n\nQString AsemanDesktopTools::getSaveFileName(QWindow *window, const QString &title, const QString &filter, const QString &startPath)\n{\n#if defined(DESKTOP_DEVICE) && defined(QT_WIDGETS_LIB)\n    const int dsession = desktopSession();\n    switch( dsession )\n    {\n    case AsemanDesktopTools::Kde:\n    case AsemanDesktopTools::Plasma:\n        if( QFileInfo::exists(QStringLiteral(\"/usr/bin/kdialog\")) )\n        {\n            QStringList args = QStringList()<< QStringLiteral(\"--title\") << title << QStringLiteral(\"--getsavefilename\")\n                                            << startPath << filter;\n            if( window )\n                args << QStringLiteral(\"--attach\") << QString::number(window->winId());\n\n            QProcess process;\n            QEventLoop loop;\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n            connect(&process, static_cast<void(QProcess::*)(int)>(&QProcess::finished), &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#else\n            connect(&process, &QProcess::finished, &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#endif\n\n            process.start(QStringLiteral(\"/usr/bin/kdialog\"), args );\n            loop.exec(QEventLoop::ExcludeUserInputEvents);\n\n            if( process.exitStatus() == QProcess::NormalExit )\n                return QString::fromUtf8(process.readAll()).remove(QStringLiteral(\"\\n\"));\n            else\n                return QFileDialog::getSaveFileName(0, title, startPath, filter);\n        }\n        else\n        {\n            return QFileDialog::getSaveFileName(0, title, startPath, filter);\n        }\n        break;\n\n    case AsemanDesktopTools::Unity:\n    case AsemanDesktopTools::GnomeFallBack:\n    case AsemanDesktopTools::Gnome:\n        if( QFileInfo::exists(QStringLiteral(\"/usr/bin/zenity\")) )\n        {\n            QStringList args = QStringList()<< QStringLiteral(\"--title=\") << QStringLiteral(\"--file-selection\") << QStringLiteral(\"--save\") <<\n                                               QStringLiteral(\"--class=Cutegram\") << QStringLiteral(\"--name=Cutegram\");\n            if(!filter.isEmpty())\n                args << QStringLiteral(\"--file-filter=\") + filter;\n\n            QProcess process;\n            QEventLoop loop;\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n            connect(&process, static_cast<void(QProcess::*)(int)>(&QProcess::finished), &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#else\n            connect(&process, &QProcess::finished, &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#endif\n\n            process.start(QStringLiteral(\"/usr/bin/zenity\"), args );\n            loop.exec(QEventLoop::ExcludeUserInputEvents);\n\n            if( process.exitStatus() == QProcess::NormalExit )\n                return QString::fromUtf8(process.readAll()).remove(QStringLiteral(\"\\n\"));\n            else\n                return QFileDialog::getSaveFileName(0, title, startPath, filter);\n        }\n        else\n            return QFileDialog::getSaveFileName(0, title, startPath, filter);\n        break;\n\n    case AsemanDesktopTools::Mac:\n    case AsemanDesktopTools::Windows:\n        return QFileDialog::getSaveFileName(0, title, startPath, filter);\n        break;\n    }\n\n    return QString();\n#else\n#if defined(QT_WIDGETS_LIB)\n    return QFileDialog::getSaveFileName(0, title, startPath, filter);\n#else\n    Q_UNUSED(window)\n    Q_UNUSED(title)\n    Q_UNUSED(filter)\n    Q_UNUSED(startPath)\n    return QString();\n#endif\n#endif\n}\n\nQString AsemanDesktopTools::getExistingDirectory(QWindow *window, const QString &title, const QString &startPath)\n{\n#if defined(DESKTOP_DEVICE) && defined(QT_WIDGETS_LIB)\n    const int dsession = desktopSession();\n    switch( dsession )\n    {\n    case AsemanDesktopTools::Kde:\n    case AsemanDesktopTools::Plasma:\n        if( QFileInfo::exists(QStringLiteral(\"/usr/bin/kdialog\")) )\n        {\n            QStringList args = QStringList()<< QStringLiteral(\"--title\") << title << QStringLiteral(\"--getexistingdirectory\")\n                                            << startPath;\n            if( window )\n                args << QStringLiteral(\"--attach\") << QString::number(window->winId());\n\n            QProcess process;\n            QEventLoop loop;\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n            connect(&process, static_cast<void(QProcess::*)(int)>(&QProcess::finished), &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#else\n            connect(&process, &QProcess::finished, &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#endif\n\n            process.start(QStringLiteral(\"/usr/bin/kdialog\"), args );\n            loop.exec(QEventLoop::ExcludeUserInputEvents);\n\n            if( process.exitStatus() == QProcess::NormalExit )\n                return QString::fromUtf8(process.readAll()).remove(QStringLiteral(\"\\n\"));\n            else\n                return QFileDialog::getExistingDirectory(0, title, startPath);\n        }\n        else\n        {\n            return QFileDialog::getExistingDirectory(0, title, startPath);\n        }\n        break;\n\n    case AsemanDesktopTools::Unity:\n    case AsemanDesktopTools::GnomeFallBack:\n    case AsemanDesktopTools::Gnome:\n        if( QFileInfo::exists(QStringLiteral(\"/usr/bin/zenity\")) )\n        {\n            QStringList args = QStringList()<< QStringLiteral(\"--title=\") << QStringLiteral(\"--file-selection\") << QStringLiteral(\"--directory\") <<\n                                               QStringLiteral(\"--class=Cutegram\") << QStringLiteral(\"--name=Cutegram\");\n\n            QProcess process;\n            QEventLoop loop;\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n            connect(&process, static_cast<void(QProcess::*)(int)>(&QProcess::finished), &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#else\n            connect(&process, &QProcess::finished, &loop, &QEventLoop::quit, Qt::QueuedConnection );\n#endif\n\n            process.start(QStringLiteral(\"/usr/bin/zenity\"), args );\n            loop.exec(QEventLoop::ExcludeUserInputEvents);\n\n            if( process.exitStatus() == QProcess::NormalExit )\n                return QString::fromUtf8(process.readAll()).remove(QStringLiteral(\"\\n\"));\n            else\n                return QFileDialog::getExistingDirectory(0, title, startPath);\n        }\n        else\n            return QFileDialog::getExistingDirectory(0, title, startPath);\n        break;\n\n    case AsemanDesktopTools::Mac:\n    case AsemanDesktopTools::Windows:\n        return QFileDialog::getExistingDirectory(0, title, startPath);\n        break;\n    }\n\n    return QString();\n#else\n#if defined(QT_WIDGETS_LIB)\n    return QFileDialog::getExistingDirectory(0, title, startPath);\n#else\n    Q_UNUSED(window)\n    Q_UNUSED(title)\n    Q_UNUSED(startPath)\n    return QString();\n#endif\n#endif\n}\n\nQFont AsemanDesktopTools::getFont(QWindow *window, const QString &title, const QFont &font)\n{\n#if defined(DESKTOP_DEVICE) && defined(QT_WIDGETS_LIB)\n    Q_UNUSED(window)\n    bool ok = false;\n    return QFontDialog::getFont(&ok, font, 0, title);\n#else\n    Q_UNUSED(window)\n    Q_UNUSED(title)\n    Q_UNUSED(font)\n    return font;\n#endif\n}\n\nQColor AsemanDesktopTools::getColor(const QColor &color)\n{\n#if defined(DESKTOP_DEVICE) && defined(QT_WIDGETS_LIB)\n    return QColorDialog::getColor(color);\n#else\n    return color;\n#endif\n}\n\nQString AsemanDesktopTools::getText(QWindow *window, const QString &title, const QString &text, const QString &defaultText)\n{\n    Q_UNUSED(window)\n    Q_UNUSED(title)\n    Q_UNUSED(text)\n    Q_UNUSED(defaultText)\n\n#if defined(DESKTOP_DEVICE) && defined(QT_WIDGETS_LIB)\n    bool ok = false;\n    const QString &result = QInputDialog::getText(0, title, text, QLineEdit::Normal, defaultText, &ok);\n    if(!ok)\n        return QString();\n\n    return result;\n#else\n    return QString();\n#endif\n}\n\nint AsemanDesktopTools::showMenu(const QVariantList &actions, QPoint point)\n{\n#if defined(DESKTOP_DEVICE) && defined(QT_WIDGETS_LIB)\n    if( point.isNull() )\n        point = QCursor::pos();\n\n    QList<QAction*> pointers;\n    QMenu *menu = menuOf(actions, &pointers);\n    menu->setStyleSheet(p->style);\n\n    p->currentMenuObjects.append(menu);\n    Q_EMIT currentMenuObjectChanged();\n\n    QAction *res = menu->exec(point);\n\n    p->currentMenuObjects.removeAll(menu);\n    Q_EMIT currentMenuObjectChanged();\n\n    menu->deleteLater();\n\n    return pointers.indexOf(res);\n#else\n    Q_UNUSED(actions)\n    Q_UNUSED(point)\n    return -1;\n#endif\n}\n\nQMenu *AsemanDesktopTools::menuOf(const QVariantList &list, QList<QAction *> *actions, QMenu *parent)\n{\n#if defined(DESKTOP_DEVICE) && defined(QT_WIDGETS_LIB)\n    QMenu *result = new QMenu(parent);\n    for(const QVariant &var: list)\n    {\n        QString txt;\n        bool checkable = false;\n        bool checked = false;\n        QVariantList list;\n\n        switch(static_cast<int>(var.type()))\n        {\n        case QVariant::Map:\n        {\n            const QVariantMap &map = var.toMap();\n            checkable = map[QStringLiteral(\"checkable\")].toBool();\n            checked = map[QStringLiteral(\"checked\")].toBool();\n            txt = map[QStringLiteral(\"text\")].toString();\n            list = map[QStringLiteral(\"list\")].toList();\n        }\n            break;\n\n        default:\n            txt = var.toString();\n            break;\n        }\n\n        QAction *act;\n        if(list.isEmpty())\n        {\n            act = (txt.isEmpty()? result->addSeparator() : result->addAction(txt));\n            act->setCheckable(checkable);\n            if(checkable)\n                act->setChecked(checked);\n        }\n        else\n        {\n            QMenu *menu = menuOf(list, actions, result);\n            menu->setTitle(txt);\n\n            act = result->addMenu(menu);\n        }\n\n        (*actions) << act;\n    }\n\n    return result;\n#else\n    Q_UNUSED(list)\n    Q_UNUSED(actions)\n    Q_UNUSED(parent)\n    return 0;\n#endif\n}\n\nbool AsemanDesktopTools::yesOrNo(QWindow *window, const QString &title, const QString &text, int type)\n{\n    Q_UNUSED(window)\n#if defined(DESKTOP_DEVICE) && defined(QT_WIDGETS_LIB)\n    switch(type)\n    {\n    case Warning:\n        return QMessageBox::warning(0, title, text, QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes;\n        break;\n\n    case Information:\n        return QMessageBox::information(0, title, text, QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes;\n        break;\n\n    case Question:\n        return QMessageBox::question(0, title, text, QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes;\n        break;\n\n    case Critical:\n        return QMessageBox::critical(0, title, text, QMessageBox::Yes|QMessageBox::No) == QMessageBox::Yes;\n        break;\n    }\n\n    return false;\n#else\n    Q_UNUSED(title)\n    Q_UNUSED(text)\n    Q_UNUSED(type)\n    return false;\n#endif\n}\n\nvoid AsemanDesktopTools::showMessage(QWindow *window, const QString &title, const QString &text, int type)\n{\n    Q_UNUSED(window)\n#if defined(DESKTOP_DEVICE) && defined(QT_WIDGETS_LIB)\n    switch(type)\n    {\n    case Warning:\n        QMessageBox::warning(0, title, text, QMessageBox::Ok);\n        break;\n\n    case Information:\n        QMessageBox::information(0, title, text, QMessageBox::Ok);\n        break;\n\n    case Question:\n        QMessageBox::question(0, title, text, QMessageBox::Ok);\n        break;\n\n    case Critical:\n        QMessageBox::critical(0, title, text, QMessageBox::Ok);\n        break;\n    }\n#else\n    Q_UNUSED(title)\n    Q_UNUSED(text)\n    Q_UNUSED(type)\n    return;\n#endif\n}\n\nAsemanDesktopTools::~AsemanDesktopTools()\n{\n    if(p->font_db)\n        delete p->font_db;\n\n    delete p;\n}\n"
  },
  {
    "path": "src/widgets/asemandesktoptools.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANDESKTOPTOOLS_H\n#define ASEMANDESKTOPTOOLS_H\n\n#include \"aseman_macros.h\"\n\n#include <QObject>\n#include <QColor>\n#include <QDir>\n#include <QFont>\n#include <QWindow>\n#include <QVariant>\n\n#include \"asemanwidgets_global.h\"\n\nclass QAction;\nclass QMenu;\nclass AsemanDesktopToolsPrivate;\nclass LIBQTASEMAN_WIDGETS_EXPORT AsemanDesktopTools : public QObject\n{\n    Q_PROPERTY(QColor titleBarColor READ titleBarColor NOTIFY titleBarColorChanged)\n    Q_PROPERTY(QColor titleBarTransparentColor READ titleBarTransparentColor NOTIFY titleBarTransparentColorChanged)\n    Q_PROPERTY(QColor titleBarTextColor READ titleBarTextColor NOTIFY titleBarTextColorChanged)\n    Q_PROPERTY(bool titleBarIsDark READ titleBarIsDark NOTIFY titleBarIsDarkChanged)\n    Q_PROPERTY(int desktopSession READ desktopSession NOTIFY desktopSessionChanged)\n    Q_PROPERTY(QStringList fontFamilies READ fontFamilies NOTIFY fakeSignal)\n    Q_PROPERTY(QString menuStyle READ menuStyle WRITE setMenuStyle NOTIFY menuStyleChanged)\n    Q_PROPERTY(QObject* currentMenuObject READ currentMenuObject NOTIFY currentMenuObjectChanged)\n    Q_PROPERTY(QString tooltip READ tooltip WRITE setTooltip NOTIFY tooltipChanged)\n\n    Q_ENUMS(DesktopSession)\n    Q_ENUMS(YesOrNoType)\n\n    Q_OBJECT\npublic:\n    AsemanDesktopTools(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanDesktopTools();\n\n    enum DesktopSession {\n        Unknown,\n        Gnome,\n        GnomeFallBack,\n        Unity,\n        Kde,\n        Plasma,\n        Windows,\n        Mac\n    };\n\n    enum YesOrNoType {\n        Warning,\n        Question,\n        Information,\n        Critical\n    };\n\n    static int desktopSession();\n\n    QColor titleBarColor() const;\n    QColor titleBarTransparentColor() const;\n    QColor titleBarTextColor() const;\n    bool titleBarIsDark() const;\n\n    QStringList fontFamilies() const;\n\n    void setMenuStyle(const QString &style);\n    QString menuStyle() const;\n\n    void setTooltip(const QString &txt);\n    QString tooltip() const;\n\n    QObject *currentMenuObject() const;\n\npublic Q_SLOTS:\n    static QString getOpenFileName(QWindow *window = Q_NULLPTR, const QString &title = QString(), const QString &filter = QString(), const QString & startPath = QDir::homePath() );\n    static QStringList getOpenFileNames(QWindow *window = Q_NULLPTR, const QString &title = QString(), const QString &filter = QString(), const QString & startPath = QDir::homePath() );\n    static QString getSaveFileName(QWindow *window = Q_NULLPTR, const QString &title = QString(), const QString &filter = QString(), const QString & startPath = QDir::homePath() );\n    static QString getExistingDirectory(QWindow *window = Q_NULLPTR, const QString &title = QString(), const QString & startPath = QDir::homePath());\n    static QFont getFont(QWindow *window = Q_NULLPTR, const QString &title = QString(), const QFont &font = QFont());\n    static QColor getColor(const QColor &color = QColor());\n    static QString getText(QWindow *window = Q_NULLPTR, const QString &title = QString(), const QString &text = QString(), const QString &defaultText = QString());\n    int showMenu( const QVariantList & actions, QPoint point = QPoint() );\n    static bool yesOrNo(QWindow *window, const QString &title, const QString &text, int type = Warning);\n    static void showMessage(QWindow *window, const QString &title, const QString &text, int type = Information);\n\nQ_SIGNALS:\n    void titleBarColorChanged();\n    void titleBarTextColorChanged();\n    void titleBarTransparentColorChanged();\n    void titleBarIsDarkChanged();\n    void desktopSessionChanged();\n    void menuStyleChanged();\n    void fakeSignal();\n    void currentMenuObjectChanged();\n    void tooltipChanged();\n\nprivate:\n    QMenu *menuOf(const QVariantList &list, QList<QAction*> *actions = Q_NULLPTR, QMenu *parent = Q_NULLPTR);\n\nprivate:\n    AsemanDesktopToolsPrivate *p;\n};\n\ntypedef AsemanDesktopTools QAsemanDesktopTools;\n\n#endif // ASEMANDESKTOPTOOLS_H\n"
  },
  {
    "path": "src/widgets/asemanfonthandler.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanfonthandler.h\"\n#include \"asemanlistrecord.h\"\n\n#include <QFont>\n#include <QHash>\n#include <QDebug>\n\n#ifdef QT_WIDGETS_LIB\n#include <QDialog>\n#include <QFontDialog>\n#include <QComboBox>\n#include <QVBoxLayout>\n#endif\n\nQMap<int,QString> aseman_font_handler_scipts;\n\nclass AsemanFontHandlerPrivate\n{\npublic:\n    QVariantMap fonts;\n#ifdef QT_WIDGETS_LIB\n    QHash<QComboBox*, QFontDialog*> combo_hash;\n    QHash<QComboBox*, QVariantMap> combo_cache;\n#endif\n};\n\nAsemanFontHandler::AsemanFontHandler(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanFontHandlerPrivate;\n\n    if(aseman_font_handler_scipts.isEmpty())\n    {\n        aseman_font_handler_scipts[QChar::Script_Unknown] = QStringLiteral(\"unknown\");\n        aseman_font_handler_scipts[QChar::Script_Inherited] = QStringLiteral(\"inherited\");\n        aseman_font_handler_scipts[QChar::Script_Common] = QStringLiteral(\"common\");\n        aseman_font_handler_scipts[QChar::Script_Latin] = QStringLiteral(\"latin\");\n        aseman_font_handler_scipts[QChar::Script_Greek] = QStringLiteral(\"greek\");\n        aseman_font_handler_scipts[QChar::Script_Cyrillic] = QStringLiteral(\"cyrillic\");\n        aseman_font_handler_scipts[QChar::Script_Armenian] = QStringLiteral(\"armenian\");\n        aseman_font_handler_scipts[QChar::Script_Hebrew] = QStringLiteral(\"hebrew\");\n        aseman_font_handler_scipts[QChar::Script_Arabic] = QStringLiteral(\"arabic\");\n        aseman_font_handler_scipts[QChar::Script_Syriac] = QStringLiteral(\"syriac\");\n        aseman_font_handler_scipts[QChar::Script_Thaana] = QStringLiteral(\"thaana\");\n        aseman_font_handler_scipts[QChar::Script_Devanagari] = QStringLiteral(\"devanagari\");\n        aseman_font_handler_scipts[QChar::Script_Bengali] = QStringLiteral(\"bengali\");\n        aseman_font_handler_scipts[QChar::Script_Gurmukhi] = QStringLiteral(\"gurmukhi\");\n        aseman_font_handler_scipts[QChar::Script_Gujarati] = QStringLiteral(\"gujarati\");\n        aseman_font_handler_scipts[QChar::Script_Oriya] = QStringLiteral(\"oriya\");\n        aseman_font_handler_scipts[QChar::Script_Tamil] = QStringLiteral(\"tamil\");\n        aseman_font_handler_scipts[QChar::Script_Telugu] = QStringLiteral(\"telugu\");\n        aseman_font_handler_scipts[QChar::Script_Kannada] = QStringLiteral(\"kannada\");\n        aseman_font_handler_scipts[QChar::Script_Malayalam] = QStringLiteral(\"malayalam\");\n        aseman_font_handler_scipts[QChar::Script_Sinhala] = QStringLiteral(\"sinhala\");\n        aseman_font_handler_scipts[QChar::Script_Thai] = QStringLiteral(\"thai\");\n        aseman_font_handler_scipts[QChar::Script_Lao] = QStringLiteral(\"lao\");\n        aseman_font_handler_scipts[QChar::Script_Tibetan] = QStringLiteral(\"tibetan\");\n        aseman_font_handler_scipts[QChar::Script_Myanmar] = QStringLiteral(\"myanmar\");\n        aseman_font_handler_scipts[QChar::Script_Georgian] = QStringLiteral(\"georgian\");\n        aseman_font_handler_scipts[QChar::Script_Hangul] = QStringLiteral(\"hangul\");\n        aseman_font_handler_scipts[QChar::Script_Ethiopic] = QStringLiteral(\"ethiopic\");\n        aseman_font_handler_scipts[QChar::Script_Cherokee] = QStringLiteral(\"cherokee\");\n        aseman_font_handler_scipts[QChar::Script_CanadianAboriginal] = QStringLiteral(\"canadianAboriginal\");\n        aseman_font_handler_scipts[QChar::Script_Ogham] = QStringLiteral(\"ogham\");\n        aseman_font_handler_scipts[QChar::Script_Runic] = QStringLiteral(\"runic\");\n        aseman_font_handler_scipts[QChar::Script_Khmer] = QStringLiteral(\"khmer\");\n        aseman_font_handler_scipts[QChar::Script_Mongolian] = QStringLiteral(\"mongolian\");\n        aseman_font_handler_scipts[QChar::Script_Hiragana] = QStringLiteral(\"hiragana\");\n        aseman_font_handler_scipts[QChar::Script_Katakana] = QStringLiteral(\"katakana\");\n        aseman_font_handler_scipts[QChar::Script_Bopomofo] = QStringLiteral(\"bopomofo\");\n        aseman_font_handler_scipts[QChar::Script_Han] = QStringLiteral(\"han\");\n        aseman_font_handler_scipts[QChar::Script_Yi] = QStringLiteral(\"yi\");\n        aseman_font_handler_scipts[QChar::Script_OldItalic] = QStringLiteral(\"oldItalic\");\n        aseman_font_handler_scipts[QChar::Script_Gothic] = QStringLiteral(\"gothic\");\n        aseman_font_handler_scipts[QChar::Script_Deseret] = QStringLiteral(\"deseret\");\n        aseman_font_handler_scipts[QChar::Script_Tagalog] = QStringLiteral(\"tagalog\");\n        aseman_font_handler_scipts[QChar::Script_Hanunoo] = QStringLiteral(\"hanunoo\");\n        aseman_font_handler_scipts[QChar::Script_Buhid] = QStringLiteral(\"buhid\");\n        aseman_font_handler_scipts[QChar::Script_Tagbanwa] = QStringLiteral(\"tagbanwa\");\n        aseman_font_handler_scipts[QChar::Script_Coptic] = QStringLiteral(\"coptic\");\n        aseman_font_handler_scipts[QChar::Script_Limbu] = QStringLiteral(\"limbu\");\n        aseman_font_handler_scipts[QChar::Script_TaiLe] = QStringLiteral(\"taiLe\");\n        aseman_font_handler_scipts[QChar::Script_LinearB] = QStringLiteral(\"linearB\");\n        aseman_font_handler_scipts[QChar::Script_Ugaritic] = QStringLiteral(\"ugaritic\");\n        aseman_font_handler_scipts[QChar::Script_Shavian] = QStringLiteral(\"shavian\");\n        aseman_font_handler_scipts[QChar::Script_Osmanya] = QStringLiteral(\"osmanya\");\n        aseman_font_handler_scipts[QChar::Script_Cypriot] = QStringLiteral(\"cypriot\");\n        aseman_font_handler_scipts[QChar::Script_Braille] = QStringLiteral(\"braille\");\n        aseman_font_handler_scipts[QChar::Script_Buginese] = QStringLiteral(\"buginese\");\n        aseman_font_handler_scipts[QChar::Script_NewTaiLue] = QStringLiteral(\"newTaiLue\");\n        aseman_font_handler_scipts[QChar::Script_Glagolitic] = QStringLiteral(\"glagolitic\");\n        aseman_font_handler_scipts[QChar::Script_Tifinagh] = QStringLiteral(\"tifinagh\");\n        aseman_font_handler_scipts[QChar::Script_SylotiNagri] = QStringLiteral(\"sylotiNagri\");\n        aseman_font_handler_scipts[QChar::Script_OldPersian] = QStringLiteral(\"oldPersian\");\n        aseman_font_handler_scipts[QChar::Script_Kharoshthi] = QStringLiteral(\"kharoshthi\");\n        aseman_font_handler_scipts[QChar::Script_Balinese] = QStringLiteral(\"balinese\");\n        aseman_font_handler_scipts[QChar::Script_Cuneiform] = QStringLiteral(\"cuneiform\");\n        aseman_font_handler_scipts[QChar::Script_Phoenician] = QStringLiteral(\"phoenician\");\n        aseman_font_handler_scipts[QChar::Script_PhagsPa] = QStringLiteral(\"phagsPa\");\n        aseman_font_handler_scipts[QChar::Script_Nko] = QStringLiteral(\"nko\");\n        aseman_font_handler_scipts[QChar::Script_Sundanese] = QStringLiteral(\"sundanese\");\n        aseman_font_handler_scipts[QChar::Script_Lepcha] = QStringLiteral(\"lepcha\");\n        aseman_font_handler_scipts[QChar::Script_OlChiki] = QStringLiteral(\"olChiki\");\n        aseman_font_handler_scipts[QChar::Script_Vai] = QStringLiteral(\"vai\");\n        aseman_font_handler_scipts[QChar::Script_Saurashtra] = QStringLiteral(\"saurashtra\");\n        aseman_font_handler_scipts[QChar::Script_KayahLi] = QStringLiteral(\"kayahLi\");\n        aseman_font_handler_scipts[QChar::Script_Rejang] = QStringLiteral(\"rejang\");\n        aseman_font_handler_scipts[QChar::Script_Lycian] = QStringLiteral(\"lycian\");\n        aseman_font_handler_scipts[QChar::Script_Carian] = QStringLiteral(\"carian\");\n        aseman_font_handler_scipts[QChar::Script_Lydian] = QStringLiteral(\"lydian\");\n        aseman_font_handler_scipts[QChar::Script_Cham] = QStringLiteral(\"cham\");\n        aseman_font_handler_scipts[QChar::Script_TaiTham] = QStringLiteral(\"taiTham\");\n        aseman_font_handler_scipts[QChar::Script_TaiViet] = QStringLiteral(\"taiViet\");\n        aseman_font_handler_scipts[QChar::Script_Avestan] = QStringLiteral(\"avestan\");\n        aseman_font_handler_scipts[QChar::Script_EgyptianHieroglyphs] = QStringLiteral(\"egyptianHieroglyphs\");\n        aseman_font_handler_scipts[QChar::Script_Samaritan] = QStringLiteral(\"samaritan\");\n        aseman_font_handler_scipts[QChar::Script_Lisu] = QStringLiteral(\"lisu\");\n        aseman_font_handler_scipts[QChar::Script_Bamum] = QStringLiteral(\"bamum\");\n        aseman_font_handler_scipts[QChar::Script_Javanese] = QStringLiteral(\"javanese\");\n        aseman_font_handler_scipts[QChar::Script_MeeteiMayek] = QStringLiteral(\"meeteiMayek\");\n        aseman_font_handler_scipts[QChar::Script_ImperialAramaic] = QStringLiteral(\"imperialAramaic\");\n        aseman_font_handler_scipts[QChar::Script_OldSouthArabian] = QStringLiteral(\"oldSouthArabian\");\n        aseman_font_handler_scipts[QChar::Script_InscriptionalParthian] = QStringLiteral(\"inscriptionalParthian\");\n        aseman_font_handler_scipts[QChar::Script_InscriptionalPahlavi] = QStringLiteral(\"inscriptionalPahlavi\");\n        aseman_font_handler_scipts[QChar::Script_OldTurkic] = QStringLiteral(\"oldTurkic\");\n        aseman_font_handler_scipts[QChar::Script_Kaithi] = QStringLiteral(\"kaithi\");\n        aseman_font_handler_scipts[QChar::Script_Batak] = QStringLiteral(\"batak\");\n        aseman_font_handler_scipts[QChar::Script_Brahmi] = QStringLiteral(\"brahmi\");\n        aseman_font_handler_scipts[QChar::Script_Mandaic] = QStringLiteral(\"mandaic\");\n        aseman_font_handler_scipts[QChar::Script_Chakma] = QStringLiteral(\"chakma\");\n        aseman_font_handler_scipts[QChar::Script_MeroiticCursive] = QStringLiteral(\"meroiticCursive\");\n        aseman_font_handler_scipts[QChar::Script_MeroiticHieroglyphs] = QStringLiteral(\"meroiticHieroglyphs\");\n        aseman_font_handler_scipts[QChar::Script_Miao] = QStringLiteral(\"miao\");\n        aseman_font_handler_scipts[QChar::Script_Sharada] = QStringLiteral(\"sharada\");\n        aseman_font_handler_scipts[QChar::Script_SoraSompeng] = QStringLiteral(\"soraSompeng\");\n        aseman_font_handler_scipts[QChar::Script_Takri] = QStringLiteral(\"takri\");\n    }\n\n    init();\n}\n\nQVariantMap AsemanFontHandler::fonts()\n{\n    return p->fonts;\n}\n\nvoid AsemanFontHandler::setFonts(const QVariantMap &fonts)\n{\n    if(p->fonts == fonts)\n        return;\n\n    p->fonts = fonts;\n    Q_EMIT fontsChanged();\n}\n\nQFont AsemanFontHandler::fontOf(int script)\n{\n    const QString &key = aseman_font_handler_scipts.value(static_cast<QChar::Script>(script));\n    return p->fonts.value(key).value<QFont>();\n}\n\nQString AsemanFontHandler::textToHtml(const QString &text)\n{\n    QString result;\n    QChar::Script lastScript = QChar::Script_Unknown;\n\n    int level = 0;\n    for(int i=0; i<text.length(); i++)\n    {\n        const QChar &ch = text.at(i);\n        if(ch == '<')\n            level++;\n        if(level > 0)\n        {\n            if(ch == '>')\n                level--;\n\n            result += ch;\n            continue;\n        }\n\n        QChar::Script script = (ch=='&'? QChar::Script_Latin : ch.script());\n        if(script <= QChar::Script_Common && lastScript != QChar::Script_Unknown)\n            script = lastScript;\n\n        if(lastScript != script)\n        {\n            if(lastScript != QChar::Script_Unknown)\n                result += QStringLiteral(\"</span>\");\n\n            QString scriptKey = aseman_font_handler_scipts.value(script);\n            QFont font = p->fonts.value(scriptKey).value<QFont>();\n\n            result += QStringLiteral(\"<span style=\\\"font-family:'%1'; font-size:%2pt; font-style:%3;\\\">\")\n                    .arg(font.family()).arg(font.pointSize()).arg(font.styleName());\n        }\n\n        result += ch;\n        lastScript = script;\n    }\n\n    return result;\n}\n\nQByteArray AsemanFontHandler::save()\n{\n    AsemanListRecord list;\n    QMapIterator<QString, QVariant> i(p->fonts);\n    while(i.hasNext())\n    {\n        i.next();\n        AsemanListRecord record;\n        record << i.key().toUtf8();\n        record << i.value().toString().toUtf8();\n\n        list << record.toQByteArray();\n    }\n\n    return list.toQByteArray();\n}\n\nvoid AsemanFontHandler::load(const QByteArray &data)\n{\n    AsemanListRecord list(data);\n    for(int i=0; i<list.count(); i++)\n    {\n        AsemanListRecord record(list.at(i));\n        if(record.count() != 2)\n            continue;\n\n        QFont font;\n        font.fromString(QString::fromUtf8(record.last()));\n        p->fonts[QString::fromUtf8(record.first())] = font;\n    }\n\n    Q_EMIT fontsChanged();\n}\n\n#ifdef QT_WIDGETS_LIB\nvoid AsemanFontHandler::openFontChooser()\n{\n    QDialog dialog;\n    dialog.resize(QSize(500, 400));\n\n    QComboBox *comboBox = new QComboBox();\n    comboBox->addItems(p->fonts.keys());\n\n    QFontDialog *fontDlg = new QFontDialog();\n    fontDlg->setWindowFlags(Qt::Widget);\n    fontDlg->setWindowTitle(tr(\"Select font\"));\n    fontDlg->setOption(QFontDialog::DontUseNativeDialog);\n\n    p->combo_hash[comboBox] = fontDlg;\n    p->combo_cache[comboBox] = p->fonts;\n\n    QVBoxLayout *layout = new QVBoxLayout(&dialog);\n    layout->addWidget(comboBox);\n    layout->addWidget(fontDlg);\n    layout->setContentsMargins(0,0,0,0);\n    layout->setSpacing(1);\n\n    connect(comboBox, &QComboBox::currentTextChanged, this, &AsemanFontHandler::currentIndexChanged);\n    connect(fontDlg , &QFontDialog::currentFontChanged, this, &AsemanFontHandler::currentFontChanged);\n\n    connect(fontDlg, &QFontDialog::accepted, &dialog, &QDialog::accept);\n    connect(fontDlg, &QFontDialog::rejected, &dialog, &QDialog::reject);\n\n    comboBox->setCurrentText(QStringLiteral(\"latin\"));\n    comboBox->currentTextChanged(QStringLiteral(\"latin\"));\n\n    if(dialog.exec() == QDialog::Accepted)\n        p->fonts = p->combo_cache[comboBox];\n\n    p->combo_hash.remove(comboBox);\n    p->combo_cache.remove(comboBox);\n\n    Q_EMIT fontsChanged();\n}\n\nvoid AsemanFontHandler::currentIndexChanged(const QString &key)\n{\n    QComboBox *comboBox = static_cast<QComboBox*>(sender());\n    QFontDialog *fontDlg = p->combo_hash.value(comboBox);\n    QFont font = p->combo_cache[comboBox][key].value<QFont>();\n    fontDlg->setCurrentFont(font);\n}\n\nvoid AsemanFontHandler::currentFontChanged(const QFont &font)\n{\n    QFontDialog *fontDlg = static_cast<QFontDialog*>(sender());\n    QComboBox *comboBox = p->combo_hash.key(fontDlg);\n    QString key = comboBox->currentText();\n    p->combo_cache[comboBox][key] = font;\n}\n#endif\n\nvoid AsemanFontHandler::init()\n{\n    p->fonts.clear();\n    QFont defaultFont;\n    QMapIterator<int, QString> i(aseman_font_handler_scipts);\n    while(i.hasNext())\n    {\n        i.next();\n        p->fonts[i.value()] = defaultFont;\n    }\n}\n\nAsemanFontHandler::~AsemanFontHandler()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/widgets/asemanfonthandler.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANFONTHANDLER_H\n#define ASEMANFONTHANDLER_H\n\n#include <QObject>\n#include <QHash>\n#include <QVariant>\n#include <QFont>\n#include <QMap>\n\n#include \"asemanwidgets_global.h\"\n\nclass AsemanFontHandlerPrivate;\nclass LIBQTASEMAN_WIDGETS_EXPORT AsemanFontHandler : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QVariantMap fonts READ fonts WRITE setFonts NOTIFY fontsChanged)\n\npublic:\n    AsemanFontHandler(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanFontHandler();\n\n    QVariantMap fonts();\n    void setFonts(const QVariantMap &fonts);\n\n    Q_INVOKABLE QFont fontOf(int script);\n    Q_INVOKABLE QString textToHtml(const QString &text);\n\n    Q_INVOKABLE QByteArray save();\n    Q_INVOKABLE void load(const QByteArray &data);\n\npublic Q_SLOTS:\n#ifdef QT_WIDGETS_LIB\n    void openFontChooser();\n#endif\n\nQ_SIGNALS:\n    void fontsChanged();\n\nprivate Q_SLOTS:\n    void init();\n#ifdef QT_WIDGETS_LIB\n    void currentIndexChanged(const QString &key);\n    void currentFontChanged(const QFont &font);\n#endif\n\nprivate:\n    AsemanFontHandlerPrivate *p;\n};\n\ntypedef AsemanFontHandler QAsemanFontHandler;\n\n#endif // ASEMANFONTHANDLER_H\n"
  },
  {
    "path": "src/widgets/asemankdewallet.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#define APP_ID AsemanApplication::applicationDisplayName()\n#define DBUS_SERVICE QStringLiteral(\"org.kde.kwalletd\")\n#define DBUS_PATH    QStringLiteral(\"/modules/kwalletd\")\n#define DBUS_OBJECT  QStringLiteral(\"org.kde.KWallet\")\n#define DBUS_SIGNAL_WALLET_CREATED QStringLiteral(\"walletCreated\")\n#define DBUS_SIGNAL_WALLET_DELETED QStringLiteral(\"walletDeleted\")\n#define DBUS_SIGNAL_FOLDERLIST_UPDATED QStringLiteral(\"folderListUpdated\")\n#define DBUS_SLOT_WALLETS QStringLiteral(\"wallets\")\n#define DBUS_SLOT_OPEN QStringLiteral(\"open\")\n#define DBUS_SLOT_CLOSE QStringLiteral(\"close\")\n#define DBUS_SLOT_FOLDERLIST QStringLiteral(\"folderList\")\n#define DBUS_NCLOSE  QStringLiteral(\"CloseNotification\")\n\n#include \"asemankdewallet.h\"\n#include \"asemanapplication.h\"\n\n#include <QDBusConnection>\n#include <QDBusMessage>\n#include <QDBusArgument>\n#include <QDebug>\n\nclass AsemanKdeWalletPrivate\n{\npublic:\n    QStringList availableWallets;\n    QStringList folderList;\n\n    QDBusConnection *connection;\n    bool open;\n    int handle;\n    QString wallet;\n};\n\nAsemanKdeWallet::AsemanKdeWallet(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanKdeWalletPrivate;\n    p->handle = 0;\n\n    p->connection = new QDBusConnection( QDBusConnection::sessionBus() );\n    p->connection->connect( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , DBUS_SIGNAL_WALLET_CREATED , this , SLOT(fetchWalletsList()));\n    p->connection->connect( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , DBUS_SIGNAL_WALLET_DELETED , this , SLOT(fetchWalletsList()));\n    p->connection->connect( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , DBUS_SIGNAL_FOLDERLIST_UPDATED , this , SLOT(fetchFolderList()));\n\n    fetchWalletsList();\n}\n\nQStringList AsemanKdeWallet::availableWallets() const\n{\n    return p->availableWallets;\n}\n\nQStringList AsemanKdeWallet::folderList() const\n{\n    return p->folderList;\n}\n\nvoid AsemanKdeWallet::setWallet(const QString &wallet)\n{\n    if(p->wallet == wallet)\n        return;\n\n    p->wallet = wallet;\n    Q_EMIT walletChanged();\n}\n\nQString AsemanKdeWallet::wallet() const\n{\n    return p->wallet;\n}\n\nbool AsemanKdeWallet::opened() const\n{\n    return p->handle;\n}\n\nbool AsemanKdeWallet::createFolder(const QString &name)\n{\n    if(!p->handle)\n        return false;\n\n    QVariantList args;\n    args << p->handle;\n    args << name;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return false;\n\n    qint64 ok = res.first().toBool();\n    if(!ok)\n        return false;\n\n    p->folderList << name;\n    Q_EMIT folderListChanged();\n    return true;\n}\n\nbool AsemanKdeWallet::removeFolder(const QString &name)\n{\n    if(!p->handle)\n        return false;\n\n    QVariantList args;\n    args << p->handle;\n    args << name;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return false;\n\n    qint64 ok = res.first().toBool();\n    if(!ok)\n        return false;\n\n    p->folderList.removeAll(name);\n    Q_EMIT folderListChanged();\n    return true;\n}\n\nQByteArray AsemanKdeWallet::readEntry(const QString &folder, const QString &key)\n{\n    if(!p->handle)\n        return QByteArray();\n\n    QVariantList args;\n    args << p->handle;\n    args << folder;\n    args << key;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return QByteArray();\n\n    return res.first().toByteArray();\n}\n\nQVariantMap AsemanKdeWallet::readEntryList(const QString &folder, const QString &key)\n{\n    if(!p->handle)\n        return QVariantMap();\n\n    QVariantList args;\n    args << p->handle;\n    args << folder;\n    args << key;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return QVariantMap();\n\n    return res.first().toMap();\n}\n\nQByteArray AsemanKdeWallet::readMap(const QString &folder, const QString &key)\n{\n    if(!p->handle)\n        return QByteArray();\n\n    QVariantList args;\n    args << p->handle;\n    args << folder;\n    args << key;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return QByteArray();\n\n    return res.first().toByteArray();\n}\n\nQVariantMap AsemanKdeWallet::readMapList(const QString &folder, const QString &key)\n{\n    if(!p->handle)\n        return QVariantMap();\n\n    QVariantList args;\n    args << p->handle;\n    args << folder;\n    args << key;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return QVariantMap();\n\n    return res.first().toMap();\n}\n\nQString AsemanKdeWallet::readPassword(const QString &folder, const QString &key)\n{\n    if(!p->handle)\n        return QString();\n\n    QVariantList args;\n    args << p->handle;\n    args << folder;\n    args << key;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return QString();\n\n    return res.first().toString();\n}\n\nQVariantMap AsemanKdeWallet::readPasswordList(const QString &folder, const QString &key)\n{\n    if(!p->handle)\n        return QVariantMap();\n\n    QVariantList args;\n    args << p->handle;\n    args << folder;\n    args << key;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return QVariantMap();\n\n    return res.first().toMap();\n}\n\nint AsemanKdeWallet::removeEntry(const QString &folder, const QString &key)\n{\n    if(!p->handle)\n        return 0;\n\n    QVariantList args;\n    args << p->handle;\n    args << folder;\n    args << key;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return 0;\n\n    return res.first().toInt();\n}\n\nint AsemanKdeWallet::renameEntry(const QString &folder, const QString &oldName, const QString &newName)\n{\n    if(!p->handle)\n        return 0;\n\n    QVariantList args;\n    args << p->handle;\n    args << folder;\n    args << oldName;\n    args << newName;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return 0;\n\n    return res.first().toInt();\n}\n\nint AsemanKdeWallet::writeEntry(const QString &folder, const QString &key, const QByteArray &value)\n{\n    if(!p->handle)\n        return 0;\n\n    QVariantList args;\n    args << p->handle;\n    args << folder;\n    args << key;\n    args << value;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return 0;\n\n    return res.first().toInt();\n}\n\nint AsemanKdeWallet::writeEntry(const QString &folder, const QString &key, const QByteArray &value, int entryType)\n{\n    if(!p->handle)\n        return 0;\n\n    QVariantList args;\n    args << p->handle;\n    args << folder;\n    args << key;\n    args << value;\n    args << entryType;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return 0;\n\n    return res.first().toInt();\n}\n\nint AsemanKdeWallet::writeMap(const QString &folder, const QString &key, const QByteArray &value)\n{\n    if(!p->handle)\n        return 0;\n\n    QVariantList args;\n    args << p->handle;\n    args << folder;\n    args << key;\n    args << value;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return 0;\n\n    return res.first().toInt();\n}\n\nint AsemanKdeWallet::writePassword(const QString &folder, const QString &key, const QString &value)\n{\n    if(!p->handle)\n        return 0;\n\n    QVariantList args;\n    args << p->handle;\n    args << folder;\n    args << key;\n    args << value;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return 0;\n\n    return res.first().toInt();\n}\n\nbool AsemanKdeWallet::hasEntry(const QString &folder, const QString &key)\n{\n    if(!p->handle)\n        return 0;\n\n    QVariantList args;\n    args << p->handle;\n    args << folder;\n    args << key;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return 0;\n\n    return res.first().toBool();\n}\n\nbool AsemanKdeWallet::hasFolder(const QString &folder)\n{\n    if(!p->handle)\n        return 0;\n\n    QVariantList args;\n    args << p->handle;\n    args << folder;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , QString::fromUtf8(__FUNCTION__) );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return 0;\n\n    return res.first().toBool();\n}\n\nbool AsemanKdeWallet::open()\n{\n    if(p->handle)\n        close();\n    if(p->wallet.isEmpty())\n        return false;\n\n    QVariantList args;\n    args << p->wallet;\n    args << (qint64)0;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , DBUS_SLOT_OPEN );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return false;\n\n    int hid = res.first().toInt();\n    p->handle = hid<=0? 0 : hid;\n\n    fetchFolderList();\n\n    Q_EMIT openedChanged();\n    return opened();\n}\n\nbool AsemanKdeWallet::close()\n{\n    if(!p->handle)\n        return true;\n\n    QVariantList args;\n    args << p->handle;\n    args << true;\n    args << APP_ID;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , DBUS_SLOT_CLOSE );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return false;\n\n    bool ok = res.first().toBool();\n    if(ok)\n        p->handle = false;\n\n    Q_EMIT openedChanged();\n    return true;\n}\n\nvoid AsemanKdeWallet::fetchWalletsList()\n{\n    QVariantList args;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , DBUS_SLOT_WALLETS );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return;\n\n    p->availableWallets = res.first().toStringList();\n    Q_EMIT availableWalletsChanged();\n}\n\nvoid AsemanKdeWallet::fetchFolderList()\n{\n    p->folderList.clear();\n    if(p->handle)\n    {\n        QVariantList args;\n        args << p->handle;\n        args << APP_ID;\n\n        QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , DBUS_SLOT_FOLDERLIST );\n        omsg.setArguments( args );\n\n        const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n        const QVariantList & res = imsg.arguments();\n        if( res.isEmpty() )\n            return;\n\n        p->folderList = res.first().toStringList();\n    }\n\n    Q_EMIT folderListChanged();\n}\n\nAsemanKdeWallet::~AsemanKdeWallet()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/widgets/asemankdewallet.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANKDEWALLET_H\n#define ASEMANKDEWALLET_H\n\n#include <QObject>\n#include <QStringList>\n#include <QVariantMap>\n#include <QByteArray>\n\n#include \"asemanwidgets_global.h\"\n\nclass AsemanKdeWalletPrivate;\nclass LIBQTASEMAN_WIDGETS_EXPORT AsemanKdeWallet : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QStringList availableWallets READ availableWallets NOTIFY availableWalletsChanged)\n    Q_PROPERTY(bool opened READ opened NOTIFY openedChanged)\n    Q_PROPERTY(QString wallet READ wallet WRITE setWallet NOTIFY walletChanged)\n    Q_PROPERTY(QStringList folderList READ folderList NOTIFY folderListChanged)\n\npublic:\n    AsemanKdeWallet(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanKdeWallet();\n\n    QStringList availableWallets() const;\n    QStringList folderList() const;\n\n    void setWallet(const QString &wallet);\n    QString wallet() const;\n\n    bool opened() const;\n\npublic Q_SLOTS:\n    bool createFolder(const QString &name);\n    bool removeFolder(const QString &name);\n    QByteArray readEntry(const QString &folder, const QString &key);\n    QVariantMap readEntryList(const QString &folder, const QString &key);\n    QByteArray readMap(const QString &folder, const QString &key);\n    QVariantMap readMapList(const QString &folder, const QString &key);\n    QString readPassword(const QString &folder, const QString &key);\n    QVariantMap readPasswordList(const QString &folder, const QString &key);\n    int removeEntry(const QString &folder, const QString &key);\n    int renameEntry(const QString &folder, const QString &oldName, const QString &newName);\n    int writeEntry(const QString &folder, const QString &key, const QByteArray &value);\n    int writeEntry(const QString &folder, const QString &key, const QByteArray &value, int entryType);\n    int writeMap(const QString &folder, const QString &key, const QByteArray &value);\n    int writePassword(const QString &folder, const QString &key, const QString &value);\n    bool hasEntry(const QString &folder, const QString &key);\n    bool hasFolder(const QString &folder);\n\n    bool open();\n    bool close();\n\nQ_SIGNALS:\n    void availableWalletsChanged();\n    void folderListChanged();\n    void openedChanged();\n    void walletChanged();\n\nprivate Q_SLOTS:\n    void fetchWalletsList();\n    void fetchFolderList();\n\nprivate:\n    AsemanKdeWalletPrivate *p;\n};\n\ntypedef AsemanKdeWallet QAsemanKdeWallet;\n\n#endif // ASEMANKDEWALLET_H\n"
  },
  {
    "path": "src/widgets/asemanlinuxnativenotification.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#define DBUS_SERVICE QStringLiteral(\"org.freedesktop.Notifications\")\n#define DBUS_PATH    QStringLiteral(\"/org/freedesktop/Notifications\")\n#define DBUS_OBJECT  QStringLiteral(\"org.freedesktop.Notifications\")\n#define DBUS_CLOSED  QStringLiteral(\"NotificationClosed\")\n#define DBUS_ACTION  QStringLiteral(\"ActionInvoked\")\n#define DBUS_NOTIFY  QStringLiteral(\"Notify\")\n#define DBUS_NCLOSE  QStringLiteral(\"CloseNotification\")\n\n#include \"asemanlinuxnativenotification.h\"\n\n#include <QDBusConnection>\n#include <QDBusMessage>\n#include <QDBusArgument>\n#include <QCoreApplication>\n#include <QDebug>\n\nclass AsemanLinuxNativeNotificationPrivate\n{\npublic:\n    QDBusConnection *connection;\n\n    QSet<uint> notifies;\n    QColor color;\n};\n\nAsemanLinuxNativeNotification::AsemanLinuxNativeNotification(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanLinuxNativeNotificationPrivate;\n\n    p->connection = new QDBusConnection( QDBusConnection::sessionBus() );\n    p->connection->connect( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , DBUS_CLOSED , this , SLOT(notificationClosed(QDBusMessage)) );\n    p->connection->connect( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , DBUS_ACTION , this , SLOT(actionInvoked(QDBusMessage))      );\n}\n\nvoid AsemanLinuxNativeNotification::setColor(const QColor &color)\n{\n    if(p->color == color)\n        return;\n\n    p->color = color;\n    Q_EMIT colorChanged();\n}\n\nQColor AsemanLinuxNativeNotification::color() const\n{\n    return p->color;\n}\n\nuint AsemanLinuxNativeNotification::sendNotify(const QString &title, const QString &body, const QString &icon_path, uint replace_id, int timeOut, const QStringList &actions)\n{\n    QVariantList args;\n    args << QCoreApplication::applicationName();\n    args << replace_id;\n    args << icon_path;\n    args << title;\n    args << body;\n    args << QVariant::fromValue<QStringList>(actions) ;\n    args << QVariant::fromValue<QVariantMap>(QVariantMap());\n    args << timeOut;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , DBUS_NOTIFY );\n    omsg.setArguments( args );\n\n    const QDBusMessage & imsg = p->connection->call( omsg , QDBus::BlockWithGui );\n    const QVariantList & res = imsg.arguments();\n    if( res.isEmpty() )\n        return 0;\n\n    uint id_res = res.first().toUInt();\n    p->notifies.insert( id_res );\n    return id_res;\n}\n\nvoid AsemanLinuxNativeNotification::closeNotification(uint id)\n{\n    if( !p->notifies.contains(id) )\n        return;\n\n    QVariantList args;\n    args << id;\n\n    QDBusMessage omsg = QDBusMessage::createMethodCall( DBUS_SERVICE , DBUS_PATH , DBUS_OBJECT , DBUS_NCLOSE );\n    omsg.setArguments( args );\n\n    p->connection->call( omsg , QDBus::NoBlock );\n}\n\nvoid AsemanLinuxNativeNotification::notificationClosed(const QDBusMessage &dmsg)\n{\n    if( dmsg.type() != QDBusMessage::SignalMessage )\n        return ;\n\n    const QVariantList & args = dmsg.arguments();\n    if( args.isEmpty() )\n        return ;\n\n    uint id = args.at(0).toUInt();\n    if( !p->notifies.contains(id) )\n        return;\n\n    if( args.count() == 1 )\n    {\n        Q_EMIT notifyClosed(id);\n        p->notifies.remove(id);\n        return;\n    }\n\n    int type = args.at(1).toInt();\n    switch (type) {\n    case 1:\n        Q_EMIT notifyTimedOut( id );\n        break;\n\n    case 2:\n    default:\n        Q_EMIT notifyClosed( id );\n        p->notifies.remove(id);\n        break;\n    }\n}\n\nvoid AsemanLinuxNativeNotification::actionInvoked(const QDBusMessage &dmsg)\n{\n    if( dmsg.type() != QDBusMessage::SignalMessage )\n        return ;\n\n    const QVariantList & args = dmsg.arguments();\n    if( args.count() != 2 )\n        return ;\n\n    uint id = args.at(0).toUInt();\n    if( !p->notifies.contains(id) )\n        return;\n\n    QString action = args.at(1).toString();\n    Q_EMIT notifyAction(id, action);\n}\n\nAsemanLinuxNativeNotification::~AsemanLinuxNativeNotification()\n{\n    delete p->connection;\n    delete p;\n}\n"
  },
  {
    "path": "src/widgets/asemanlinuxnativenotification.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANLINUXNATIVENOTIFICATION_H\n#define ASEMANLINUXNATIVENOTIFICATION_H\n\n#include <QObject>\n#include <QStringList>\n#include <QColor>\n\n#include \"asemanwidgets_global.h\"\n\nclass QDBusMessage;\nclass AsemanLinuxNativeNotificationPrivate;\nclass LIBQTASEMAN_WIDGETS_EXPORT AsemanLinuxNativeNotification : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)\n\npublic:\n    AsemanLinuxNativeNotification(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanLinuxNativeNotification();\n\n    void setColor(const QColor &color);\n    QColor color() const;\n\npublic Q_SLOTS:\n    uint sendNotify(const QString & title, const QString & body, const QString & icon, uint replace_id = 0, int timeOut = 3000 , const QStringList &actions = QStringList());\n    void closeNotification( uint id );\n\nQ_SIGNALS:\n    void notifyClosed( uint id );\n    void notifyTimedOut( uint id );\n    void notifyAction( uint id, const QString & action );\n    void colorChanged();\n\nprivate Q_SLOTS:\n    void notificationClosed( const QDBusMessage & dmsg );\n    void actionInvoked( const QDBusMessage & dmsg );\n\nprivate:\n    AsemanLinuxNativeNotificationPrivate *p;\n};\n\ntypedef AsemanLinuxNativeNotification QAsemanLinuxNativeNotification;\n\n#endif // ASEMANLINUXNATIVENOTIFICATION_H\n"
  },
  {
    "path": "src/widgets/asemanmacnativenotification.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanmacnativenotification.h\"\n\n#include <QSystemTrayIcon>\n#include <QTimer>\n#include <QMenu>\n#include <QHash>\n\nclass AsemanMacNativeNotificationItem: public QSystemTrayIcon\n{\npublic:\n    AsemanMacNativeNotificationItem(QObject *parent): QSystemTrayIcon(parent){\n        setContextMenu(new QMenu());\n        show();\n    }\n    virtual ~AsemanMacNativeNotificationItem(){}\n\n    QStringList actions;\n    QString icon;\n};\n\nclass AsemanMacNativeNotificationPrivate\n{\npublic:\n    QStringList last_actions;\n\n    QHash<uint, AsemanMacNativeNotificationItem*> items;\n    uint last_id;\n    QColor color;\n};\n\nAsemanMacNativeNotification::AsemanMacNativeNotification(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanMacNativeNotificationPrivate;\n    p->last_id = 1000;\n\n}\n\nvoid AsemanMacNativeNotification::setColor(const QColor &color)\n{\n    if(p->color == color)\n        return;\n\n    p->color = color;\n    Q_EMIT colorChanged();\n}\n\nQColor AsemanMacNativeNotification::color() const\n{\n    return p->color;\n}\n\nuint AsemanMacNativeNotification::sendNotify(const QString &title, const QString &body, const QString &icon, uint replace_id, int timeOut, const QStringList &actions)\n{\n    uint result = replace_id;\n\n    AsemanMacNativeNotificationItem *item = p->items.value(replace_id);\n    if(!item)\n    {\n        item = new AsemanMacNativeNotificationItem(this);\n\n        p->items.insert(p->last_id, item);\n\n        result = p->last_id;\n        p->last_id++;\n\n        connect(item, &AsemanMacNativeNotificationItem::messageClicked,\n                this, &AsemanMacNativeNotification::messageClicked, Qt::QueuedConnection );\n        connect(item, &AsemanMacNativeNotificationItem::destroyed,\n                this, &AsemanMacNativeNotification::messageDestroyed, Qt::QueuedConnection );\n    }\n\n    item->showMessage(title, body, QSystemTrayIcon::Information, timeOut);\n    item->actions = actions;\n    item->icon = icon;\n\n    if(timeOut)\n        QTimer::singleShot(timeOut+500, item, SLOT(deleteLater()));\n\n    return result;\n}\n\nvoid AsemanMacNativeNotification::closeNotification(uint id)\n{\n    AsemanMacNativeNotificationItem *item = p->items.value(id);\n    if(!item)\n        return;\n\n    item->deleteLater();\n    p->items.remove(id);\n}\n\nvoid AsemanMacNativeNotification::messageClicked()\n{\n    AsemanMacNativeNotificationItem *item = static_cast<AsemanMacNativeNotificationItem*>(sender());\n    if(!item)\n        return;\n\n    const uint id = p->items.key(item);\n    if(!id)\n        return;\n\n    const QStringList & actions = item->actions;\n    if(!actions.isEmpty())\n        Q_EMIT notifyAction(id, actions.first());\n\n    item->deleteLater();\n}\n\nvoid AsemanMacNativeNotification::messageDestroyed()\n{\n    AsemanMacNativeNotificationItem *item = static_cast<AsemanMacNativeNotificationItem*>(sender());\n    if(!item)\n        return;\n\n    const uint id = p->items.key(item);\n    if(!id)\n        return;\n\n    p->items.remove(id);\n}\n\nAsemanMacNativeNotification::~AsemanMacNativeNotification()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/widgets/asemanmacnativenotification.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANMACNATIVENOTIFICATION_H\n#define ASEMANMACNATIVENOTIFICATION_H\n\n#include <QObject>\n#include <QStringList>\n#include <QColor>\n\n#include \"asemanwidgets_global.h\"\n\nclass QDBusMessage;\nclass AsemanMacNativeNotificationPrivate;\nclass LIBQTASEMAN_WIDGETS_EXPORT AsemanMacNativeNotification : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)\n\npublic:\n    AsemanMacNativeNotification(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanMacNativeNotification();\n\n    void setColor(const QColor &color);\n    QColor color() const;\n\npublic Q_SLOTS:\n    uint sendNotify(const QString & title, const QString & body, const QString & icon, uint replace_id = 0, int timeOut = 3000 , const QStringList &actions = QStringList());\n    void closeNotification( uint id );\n\nQ_SIGNALS:\n    void notifyClosed( uint id );\n    void notifyTimedOut( uint id );\n    void notifyAction( uint id, const QString & action );\n    void colorChanged();\n\nprivate Q_SLOTS:\n    void messageClicked();\n    void messageDestroyed();\n\nprivate:\n    AsemanMacNativeNotificationPrivate *p;\n};\n\ntypedef AsemanMacNativeNotification QAsemanMacNativeNotification;\n\n#endif //ASEMANMACNATIVENOTIFICATION_H\n"
  },
  {
    "path": "src/widgets/asemannativenotification.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemannativenotification.h\"\n#include \"asemannativenotificationitem.h\"\n\n#include <QHash>\n\nclass AsemanNativeNotificationPrivate\n{\npublic:\n    QHash<uint, AsemanNativeNotificationItem*> items;\n    uint last_id;\n\n    QColor color;\n};\n\nAsemanNativeNotification::AsemanNativeNotification(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanNativeNotificationPrivate;\n    p->last_id = 1000;\n}\n\nvoid AsemanNativeNotification::setColor(const QColor &color)\n{\n    if(p->color == color)\n        return;\n\n    p->color = color;\n    Q_EMIT colorChanged();\n}\n\nQColor AsemanNativeNotification::color() const\n{\n    return p->color;\n}\n\nuint AsemanNativeNotification::sendNotify(const QString &title, const QString &body, const QString &icon, uint replace_id, int timeOut, const QStringList &actions)\n{\n    uint result = replace_id;\n\n    AsemanNativeNotificationItem *item = p->items.value(replace_id);\n    if(!item)\n    {\n        item = new AsemanNativeNotificationItem();\n        item->setFixedWidth(400);\n        item->setColor(p->color);\n\n        p->items.insert(p->last_id, item);\n\n        result = p->last_id;\n        p->last_id++;\n\n        connect(item, &AsemanNativeNotificationItem::destroyed, this, &AsemanNativeNotification::itemClosed);\n        connect(item, &AsemanNativeNotificationItem::actionTriggered, this, &AsemanNativeNotification::actionTriggered);\n    }\n\n    item->setTitle(title);\n    item->setBody(body);\n    item->setIcon(icon);\n    item->setActions(actions);\n    item->setTimeOut(timeOut);\n    item->show();\n\n    return result;\n}\n\nvoid AsemanNativeNotification::closeNotification(uint id)\n{\n    AsemanNativeNotificationItem *item = p->items.value(id);\n    if(!id)\n        return;\n\n    item->close();\n}\n\nvoid AsemanNativeNotification::itemClosed()\n{\n    AsemanNativeNotificationItem *item = static_cast<AsemanNativeNotificationItem*>(sender());\n    if(!item)\n        return;\n\n    uint id = p->items.key(item);\n    if(!id)\n        return;\n\n    p->items.remove(id);\n    Q_EMIT notifyClosed(id);\n}\n\nvoid AsemanNativeNotification::actionTriggered(const QString &action)\n{\n    AsemanNativeNotificationItem *item = static_cast<AsemanNativeNotificationItem*>(sender());\n    if(!item)\n        return;\n\n    uint id = p->items.key(item);\n    if(!id)\n        return;\n\n    Q_EMIT notifyAction(id, action);\n    item->close();\n}\n\nAsemanNativeNotification::~AsemanNativeNotification()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/widgets/asemannativenotification.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANNATIVENOTIFICATION_H\n#define ASEMANNATIVENOTIFICATION_H\n\n#include <QObject>\n#include <QStringList>\n#include <QColor>\n\n#include \"asemanwidgets_global.h\"\n\nclass AsemanNativeNotificationPrivate;\nclass LIBQTASEMAN_WIDGETS_EXPORT AsemanNativeNotification : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)\n\npublic:\n    AsemanNativeNotification(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanNativeNotification();\n\n    void setColor(const QColor &color);\n    QColor color() const;\n\npublic Q_SLOTS:\n    uint sendNotify(const QString & title, const QString & body, const QString & icon, uint replace_id = 0, int timeOut = 3000 , const QStringList &actions = QStringList());\n    void closeNotification( uint id );\n\nQ_SIGNALS:\n    void notifyClosed( uint id );\n    void notifyTimedOut( uint id );\n    void notifyAction( uint id, const QString & action );\n    void colorChanged();\n\nprivate Q_SLOTS:\n    void itemClosed();\n    void actionTriggered(const QString &action);\n\nprivate:\n    AsemanNativeNotificationPrivate *p;\n};\n\ntypedef AsemanNativeNotification QAsemanNativeNotification;\n\n#endif // ASEMANNATIVENOTIFICATION_H\n"
  },
  {
    "path": "src/widgets/asemannativenotificationitem.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#define ROUNDED_PIXEL    5\n#define SHADOW_COLOR     palette().highlight().color()\n\n#include \"asemannativenotificationitem.h\"\n\n#include <QPainterPath>\n#include <QPaintEvent>\n#include <QSize>\n#include <QPainter>\n#include <QGraphicsBlurEffect>\n#include <QLabel>\n#include <QPushButton>\n#include <QToolButton>\n#include <QHBoxLayout>\n#include <QVBoxLayout>\n#include <QScreen>\n#include <QApplication>\n#include <QTimer>\n#include <QPixmap>\n#include <QStyleFactory>\n#include <QDebug>\n\nclass DialogScene: public QWidget\n{\npublic:\n    DialogScene( QWidget *parent = 0 ): QWidget(parent){    }\n    virtual ~DialogScene(){}\n\nprotected:\n    void paintEvent(QPaintEvent *e) Q_DECL_OVERRIDE {\n        Q_UNUSED(e)\n        QPainter painter(this);\n        painter.setRenderHint( QPainter::Antialiasing , true );\n        painter.fillRect(e->rect(), palette().window());\n    }\n};\n\nclass AsemanNativeNotificationItemPrivate\n{\npublic:\n    DialogScene *scene;\n\n    QVBoxLayout *layout;\n    QHBoxLayout *body_layout;\n    QVBoxLayout *btns_layout;\n    QHBoxLayout *ttle_layout;\n\n    QLabel *title_lbl;\n    QLabel *body_lbl;\n    QLabel *icon_lbl;\n\n    QList<QPushButton*> buttons;\n    QHash<QPushButton*,QString> actions;\n\n    QToolButton *close_btn;\n\n    QColor color;\n    QColor backColor;\n    QColor textColor;\n    QColor buttonColor;\n};\n\n\nAsemanNativeNotificationItem::AsemanNativeNotificationItem(QWidget *parent) :\n    QWidget(parent)\n{\n    p = new AsemanNativeNotificationItemPrivate;\n\n    QFont font;\n    font.setPointSize(10);\n\n    setFont(font);\n    setColor(palette().highlight().color());\n\n    p->scene = new DialogScene( this );\n\n    p->title_lbl = new QLabel();\n    p->title_lbl->setAlignment(Qt::AlignCenter);\n    p->title_lbl->setFixedHeight(26);\n\n    p->close_btn = new QToolButton();\n    p->close_btn->setText(QStringLiteral(\"X\"));\n    p->close_btn->setFixedSize(26, 26);\n    p->close_btn->setAutoRaise(true);\n\n    p->ttle_layout = new QHBoxLayout();\n    p->ttle_layout->addWidget(p->title_lbl);\n    p->ttle_layout->addWidget(p->close_btn);\n    p->ttle_layout->setContentsMargins(0,0,0,0);\n    p->ttle_layout->setSpacing(1);\n\n    p->icon_lbl = new QLabel();\n    p->icon_lbl->setFixedSize(64, 64);\n    p->icon_lbl->setScaledContents(true);\n\n    p->body_lbl = new QLabel();\n    p->body_lbl->setWordWrap(true);\n\n    p->btns_layout = new QVBoxLayout();\n    p->btns_layout->setContentsMargins(0,0,0,0);\n    p->btns_layout->setSpacing(1);\n\n    p->body_layout = new QHBoxLayout();\n    p->body_layout->addWidget(p->icon_lbl);\n    p->body_layout->addWidget(p->body_lbl, 10000);\n    p->body_layout->addLayout(p->btns_layout);\n    p->body_layout->setContentsMargins(0,0,0,0);\n    p->body_layout->setSpacing(8);\n\n    p->layout = new QVBoxLayout(this);\n    p->layout->addLayout(p->ttle_layout);\n    p->layout->addLayout(p->body_layout);\n    p->layout->setContentsMargins(10,8,10,8);\n    p->layout->setSpacing(1);\n\n    setWindowFlags( Qt::ToolTip );\n    setAttribute(Qt::WA_TranslucentBackground);\n    setAttribute(Qt::WA_NoSystemBackground);\n    setAttribute(Qt::WA_DeleteOnClose);\n    setMouseTracking( true );\n    setWindowOpacity(0.98);\n\n    refreshSize();\n\n    connect(p->close_btn, &QToolButton::clicked, this, &AsemanNativeNotificationItem::close);\n}\n\nvoid AsemanNativeNotificationItem::setColor(const QColor &color)\n{\n    if(p->color == color)\n        return;\n\n    p->color = color;\n\n\n    p->backColor = QColor( p->color.red()*0.8, p->color.green()*0.8, p->color.blue()*0.8 );\n    p->buttonColor = QColor( p->color.red()*0.5, p->color.green()*0.5, p->color.blue()*0.5 );\n\n    qreal mid = (p->buttonColor.red()+p->buttonColor.green()+p->buttonColor.blue())/3.0;\n    p->textColor = mid>=128? QColor(\"#333333\") : QColor(\"#ffffff\");\n\n    QPalette palette;\n    palette.setColor(QPalette::Window, p->backColor);\n    palette.setColor(QPalette::WindowText, p->textColor);\n    palette.setColor(QPalette::ButtonText, \"#ffffff\");\n    palette.setColor(QPalette::Button, p->buttonColor);\n    setPalette(palette);\n\n    Q_EMIT colorChanged();\n}\n\nQColor AsemanNativeNotificationItem::color() const\n{\n    return p->color;\n}\n\nvoid AsemanNativeNotificationItem::setActions(const QStringList &actions)\n{\n    for(int i=0; i<p->btns_layout->count(); i++)\n        delete p->btns_layout->takeAt(i);\n\n    for(int i=1 ;i<actions.count(); i+=2)\n    {\n        const QString &action = actions.at(i-1);\n        const QString &text = actions.at(i);\n\n        QPushButton *btn = new QPushButton();\n        btn->setText(text);\n        btn->setPalette(QPalette());\n        btn->setFont(QFont());\n\n        static QStyle *style = QStyleFactory::create(QStringLiteral(\"Fusion\"));\n        btn->setStyle(style);\n\n        p->actions.insert(btn, action);\n        p->buttons << btn;\n\n        p->btns_layout->addWidget(btn);\n\n        connect(btn, &QPushButton::clicked, this, &AsemanNativeNotificationItem::buttonClicked);\n    }\n\n    p->body_layout->addStretch();\n}\n\nvoid AsemanNativeNotificationItem::setTitle(const QString &title)\n{\n    p->title_lbl->setText(title);\n}\n\nvoid AsemanNativeNotificationItem::setBody(const QString &body)\n{\n    p->body_lbl->setText(body.left(100) + \"...\");\n}\n\nvoid AsemanNativeNotificationItem::setIcon(const QString &icon)\n{\n    p->icon_lbl->setPixmap( QPixmap(icon) );\n}\n\nvoid AsemanNativeNotificationItem::setTimeOut(int timeOut)\n{\n    if(timeOut == 0)\n        return;\n\n    QTimer::singleShot(timeOut, this, SLOT(close()) );\n}\n\nvoid AsemanNativeNotificationItem::resizeEvent(QResizeEvent *e)\n{\n    refreshSize();\n    QWidget::resizeEvent(e);\n}\n\nvoid AsemanNativeNotificationItem::mouseReleaseEvent(QMouseEvent *e)\n{\n    Q_UNUSED(e)\n    close();\n}\n\nvoid AsemanNativeNotificationItem::refreshSize()\n{\n    QRect rect( 0, 0, width(), height() );\n\n    const auto screens = QApplication::screens();\n    if (screens.isEmpty())\n        return;\n\n    const QRect &scr = screens.first()->availableGeometry();\n\n    p->scene->setGeometry( rect );\n\n    move(scr.x()+scr.width()-width() - 4, scr.y()+scr.height()-height() - 4);\n}\n\nvoid AsemanNativeNotificationItem::setRaised()\n{\n    raise();\n}\n\nvoid AsemanNativeNotificationItem::buttonClicked()\n{\n    QPushButton *btn = static_cast<QPushButton*>(sender());\n    if(!btn)\n        return;\n\n    const QString &action = p->actions.value(btn);\n    Q_EMIT actionTriggered(action);\n}\n\nAsemanNativeNotificationItem::~AsemanNativeNotificationItem()\n{\n    delete p;\n}\n"
  },
  {
    "path": "src/widgets/asemannativenotificationitem.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANNATIVENOTIFICATIONITEM_H\n#define ASEMANNATIVENOTIFICATIONITEM_H\n\n#include <QWidget>\n#include <QStringList>\n\n#include \"asemanwidgets_global.h\"\n\nclass AsemanNativeNotificationItemPrivate;\nclass LIBQTASEMAN_WIDGETS_EXPORT AsemanNativeNotificationItem : public QWidget\n{\n    Q_OBJECT\n    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)\n\npublic:\n    AsemanNativeNotificationItem(QWidget *parent = Q_NULLPTR);\n    virtual ~AsemanNativeNotificationItem();\n\n    void setColor(const QColor &color);\n    QColor color() const;\n\n    void setActions(const QStringList & actions);\n    void setTitle(const QString &title);\n    void setBody(const QString &body);\n    void setIcon(const QString &icon);\n    void setTimeOut(int timeOut);\n\nQ_SIGNALS:\n    void actionTriggered(const QString & act);\n    void colorChanged();\n\nprotected:\n    void resizeEvent(QResizeEvent *e) Q_DECL_OVERRIDE;\n    void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE;\n\nprivate Q_SLOTS:\n    void refreshSize();\n    void setRaised();\n    void buttonClicked();\n\nprivate:\n    AsemanNativeNotificationItemPrivate *p;\n};\n\ntypedef AsemanNativeNotificationItem QAsemanNativeNotificationItem;\n\n#endif // ASEMANNATIVENOTIFICATIONITEM_H\n"
  },
  {
    "path": "src/widgets/asemannotification.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemannotification.h\"\n"
  },
  {
    "path": "src/widgets/asemannotification.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANNOTIFICATION_H\n#define ASEMANNOTIFICATION_H\n\n#include <QObject>\n\n#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)\n#include \"asemanlinuxnativenotification.h\"\ntypedef AsemanLinuxNativeNotification AsemanNotification;\n#elif defined(Q_OS_OSX) && !defined(Q_OS_IOS)\n#include \"asemanmacnativenotification.h\"\ntypedef AsemanMacNativeNotification AsemanNotification;\n#elif defined(Q_OS_WIN)\n#include \"asemannativenotification.h\"\ntypedef AsemanNativeNotification AsemanNotification;\n#elif defined(Q_OS_ANDROID)\n#include \"asemanandroidnativenotification.h\"\ntypedef AsemanAndroidNativeNotification AsemanNotification;\n#else\ntypedef QObject AsemanNotification;\n#endif\n\ntypedef AsemanNotification QAsemanNotification;\n\n#endif // ASEMANNOTIFICATION_H\n"
  },
  {
    "path": "src/widgets/asemansystemtray.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemansystemtray.h\"\n\n#include <QPainter>\n#include <QMenu>\n#include <QAction>\n#include <QDebug>\n#include <QGuiApplication>\n#include <QPainterPath>\n\nclass AsemanSystemTrayPrivate\n{\npublic:\n    QSystemTrayIcon *sysTray;\n    QUrl icon;\n    int badgeCount;\n    QColor badgeStrokeColor;\n    QColor badgeFillColor;\n    QColor badgeTextColor;\n    QStringList menu;\n    bool visible;\n\n    QMenu *menuItem;\n};\n\nAsemanSystemTray::AsemanSystemTray(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanSystemTrayPrivate;\n    p->visible = false;\n    p->menuItem = 0;\n    p->badgeFillColor = QColor(\"#ff0000\");\n    p->badgeStrokeColor = QColor(\"#333333\");\n    p->badgeTextColor = QColor(\"#ffffff\");\n    p->badgeCount = 0;\n\n    p->sysTray = new QSystemTrayIcon(this);\n\n    connect(p->sysTray, &QSystemTrayIcon::activated, this, &AsemanSystemTray::activated_slt);\n}\n\nvoid AsemanSystemTray::setVisible(bool visible)\n{\n    if(p->visible == visible)\n        return;\n\n    p->visible = visible;\n    QGuiApplication::setQuitOnLastWindowClosed(!p->visible);\n    refreshVisible();\n    Q_EMIT visibleChanged();\n}\n\nbool AsemanSystemTray::visible() const\n{\n    return p->sysTray->isVisible();\n}\n\nvoid AsemanSystemTray::setIcon(const QUrl &icon)\n{\n    if(p->icon == icon)\n        return;\n\n    p->icon = icon;\n    refreshIcon();\n    refreshVisible();\n    Q_EMIT iconChanged();\n}\n\nQUrl AsemanSystemTray::icon() const\n{\n    return p->icon;\n}\n\nvoid AsemanSystemTray::setBadgeCount(int badgeCount)\n{\n    if(p->badgeCount == badgeCount)\n        return;\n\n    p->badgeCount = badgeCount;\n    refreshIcon();\n    Q_EMIT badgeCountChanged();\n}\n\nint AsemanSystemTray::badgeCount() const\n{\n    return p->badgeCount;\n}\n\nvoid AsemanSystemTray::setBadgeFillColor(const QColor &badgeFillColor)\n{\n    if(p->badgeFillColor == badgeFillColor)\n        return;\n\n    p->badgeFillColor = badgeFillColor;\n    refreshIcon();\n    Q_EMIT badgeFillColorChanged();\n}\n\nQColor AsemanSystemTray::badgeFillColor() const\n{\n    return p->badgeTextColor;\n}\n\nvoid AsemanSystemTray::setBadgeStrokeColor(const QColor &badgeStrokeColor)\n{\n    if(p->badgeStrokeColor == badgeStrokeColor)\n        return;\n\n    p->badgeStrokeColor = badgeStrokeColor;\n    refreshIcon();\n    Q_EMIT badgeStrokeColorChanged();\n}\n\nQColor AsemanSystemTray::badgeStrokeColor() const\n{\n    return p->badgeStrokeColor;\n}\n\nvoid AsemanSystemTray::setBadgeTextColor(const QColor &badgeTextColor)\n{\n    if(p->badgeTextColor == badgeTextColor)\n        return;\n\n    p->badgeTextColor = badgeTextColor;\n    refreshIcon();\n    Q_EMIT badgeTextColorChanged();\n}\n\nQColor AsemanSystemTray::badgeTextColor() const\n{\n    return p->badgeTextColor;\n}\n\nvoid AsemanSystemTray::setMenu(const QStringList &menu)\n{\n    if(p->menu == menu)\n        return;\n\n    p->menu = menu;\n\n    if(p->menuItem)\n        delete p->menuItem;\n\n    p->menuItem = new QMenu();\n    if(p->menu.isEmpty()) {\n        p->menuItem = 0;\n    } else {\n        for(int i=0; i<menu.count(); i++)\n        {\n            const QString &m = menu.at(i);\n            if(m.isEmpty())\n            {\n                p->menuItem->addSeparator();\n                continue;\n            }\n\n            QAction *act = p->menuItem->addAction(m);\n            connect(act, &QAction::triggered, this, [this, i](){\n                Q_EMIT menuTriggered(i);\n            });\n        }\n    }\n\n    p->sysTray->setContextMenu(p->menuItem);\n    Q_EMIT menuChanged();\n}\n\nQStringList AsemanSystemTray::menu() const\n{\n    return p->menu;\n}\n\nvoid AsemanSystemTray::activated_slt(QSystemTrayIcon::ActivationReason reason)\n{\n    switch(static_cast<int>(reason))\n    {\n    case QSystemTrayIcon::Unknown:\n        Q_EMIT activated(ActivateUnknown);\n        break;\n    case QSystemTrayIcon::Context:\n        Q_EMIT activated(ActivateContext);\n        break;\n    case QSystemTrayIcon::DoubleClick:\n        Q_EMIT activated(ActivateDoubleClick);\n        break;\n    case QSystemTrayIcon::Trigger:\n        Q_EMIT activated(ActivateTrigger);\n        break;\n    case QSystemTrayIcon::MiddleClick:\n        Q_EMIT activated(ActivateMiddleClick);\n        break;\n    }\n}\n\nvoid AsemanSystemTray::refreshIcon()\n{\n    QString iconPath = p->icon.toLocalFile();\n    if(iconPath.isEmpty())\n        iconPath = p->icon.toString();\n    if(iconPath.left(4) == QStringLiteral(\"qrc:\"))\n        iconPath = iconPath.mid(3);\n\n    const QImage & img = generateIcon( iconPath, p->badgeCount );\n    p->sysTray->setIcon( QPixmap::fromImage(img) );\n}\n\nQImage AsemanSystemTray::generateIcon(const QString &filePath, int count)\n{\n    if(filePath.isEmpty())\n        return QImage();\n\n    QImage img(filePath);\n    if( count == 0 || filePath.isEmpty() )\n        return img;\n\n    QImage res = img;\n\n    QRect rct;\n    rct.setX( img.width()/5 );\n    rct.setWidth( 4*img.width()/5 );\n    rct.setY( img.height()-rct.width() );\n    rct.setHeight( rct.width() );\n\n    QPainterPath path;\n    path.addEllipse(rct);\n\n    QPainter painter(&res);\n    painter.setRenderHint( QPainter::Antialiasing , true );\n    painter.fillPath( path, p->badgeFillColor );\n    painter.setPen(p->badgeStrokeColor);\n    painter.drawPath( path );\n    painter.setPen(p->badgeTextColor);\n    painter.drawText( rct, Qt::AlignCenter | Qt::AlignHCenter, QString::number(count) );\n\n    return res;\n}\n\nvoid AsemanSystemTray::refreshVisible()\n{\n    if(p->visible && p->icon.isValid())\n        p->sysTray->setVisible(true);\n    else\n        p->sysTray->setVisible(false);\n}\n\nAsemanSystemTray::~AsemanSystemTray()\n{\n    if(p->menuItem)\n        delete p->menuItem;\n    delete p;\n}\n"
  },
  {
    "path": "src/widgets/asemansystemtray.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANSYSTEMTRAY_H\n#define ASEMANSYSTEMTRAY_H\n\n#include \"aseman_macros.h\"\n\n#include <QUrl>\n#include <QObject>\n#include <QSystemTrayIcon>\n\n#include \"asemanwidgets_global.h\"\n\nclass AsemanSystemTrayPrivate;\nclass LIBQTASEMAN_WIDGETS_EXPORT AsemanSystemTray : public QObject\n{\n    Q_OBJECT\n    Q_ENUMS(ActivateReason)\n    Q_PROPERTY(bool visible READ visible WRITE setVisible NOTIFY visibleChanged)\n    Q_PROPERTY(QUrl icon READ icon WRITE setIcon NOTIFY iconChanged)\n    Q_PROPERTY(int badgeCount READ badgeCount WRITE setBadgeCount NOTIFY badgeCountChanged)\n    Q_PROPERTY(QColor badgeFillColor READ badgeFillColor WRITE setBadgeFillColor NOTIFY badgeFillColorChanged)\n    Q_PROPERTY(QColor badgeStrokeColor READ badgeStrokeColor WRITE setBadgeStrokeColor NOTIFY badgeStrokeColorChanged)\n    Q_PROPERTY(QColor badgeTextColor READ badgeTextColor WRITE setBadgeTextColor NOTIFY badgeTextColorChanged)\n    Q_PROPERTY(QStringList menu READ menu WRITE setMenu NOTIFY menuChanged)\n\npublic:\n    enum ActivateReason {\n        ActivateUnknown,\n        ActivateContext,\n        ActivateDoubleClick,\n        ActivateTrigger,\n        ActivateMiddleClick\n    };\n\n    AsemanSystemTray(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanSystemTray();\n\n    void setVisible(bool visible);\n    bool visible() const;\n\n    void setIcon(const QUrl &icon);\n    QUrl icon() const;\n\n    void setBadgeCount(int badgeCount);\n    int badgeCount() const;\n\n    void setBadgeFillColor(const QColor &color);\n    QColor badgeFillColor() const;\n\n    void setBadgeStrokeColor(const QColor &color);\n    QColor badgeStrokeColor() const;\n\n    void setBadgeTextColor(const QColor &color);\n    QColor badgeTextColor() const;\n\n    void setMenu(const QStringList &menu);\n    QStringList menu() const;\n\nQ_SIGNALS:\n    void visibleChanged();\n    void activated(int reason);\n    void iconChanged();\n    void badgeCountChanged();\n    void badgeFillColorChanged();\n    void badgeStrokeColorChanged();\n    void badgeTextColorChanged();\n    void menuChanged();\n    void menuTriggered(int index);\n\npublic Q_SLOTS:\n\nprotected:\n    void activated_slt(QSystemTrayIcon::ActivationReason reason);\n    void refreshIcon();\n    QImage generateIcon(const QString & img, int count );\n    void refreshVisible();\n\nprivate:\n    AsemanSystemTrayPrivate *p;\n};\n\ntypedef AsemanSystemTray QAsemanSystemTray;\n\n#endif // ASEMANSYSTEMTRAY_H\n"
  },
  {
    "path": "src/widgets/asemantaskbarbutton.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemantaskbarbutton.h\"\n#include \"private/asemanabstracttaskbarbuttonengine.h\"\n\n#include <QDebug>\n\n#ifdef Q_OS_WIN\n#include \"private/asemanwintaskbarbuttonengine.h\"\n#else\n#ifdef Q_OS_MAC\n#include \"private/asemanmactaskbarbuttonengine.h\"\n#else\n#if defined(Q_OS_LINUX) && defined(QT_DBUS_LIB)\n#include \"private/asemanunitytaskbarbuttonengine.h\"\n#else\n#include \"private/asemanabstracttaskbarbuttonengine.h\"\nclass AsemanNullTaskbarButtonEngine: public AsemanAbstractTaskbarButtonEngine\n{\npublic:\n    void updateBadgeNumber(int number){Q_UNUSED(number)}\n    void updateProgress(qreal progress){Q_UNUSED(progress)}\n};\n#endif\n#endif\n#endif\n\nclass AsemanTaskbarButtonPrivate\n{\npublic:\n    int badgeNumber;\n    qreal progress;\n    QString launcher;\n    AsemanAbstractTaskbarButtonEngine *engine;\n    QWindow *window;\n};\n\nAsemanTaskbarButton::AsemanTaskbarButton(QObject *parent) :\n    QObject(parent)\n{\n    p = new AsemanTaskbarButtonPrivate;\n    p->badgeNumber = 0;\n    p->progress = 0;\n    p->window = 0;\n    p->engine = 0;\n\n#ifdef Q_OS_WIN\n#ifdef QT_WINEXTRAS_LIB\n    p->engine = new AsemanWinTaskbarButtonEngine();\n#endif\n#else\n#ifdef Q_OS_MAC\n#ifdef QT_MACEXTRAS_LIB\n    p->engine = new AsemanMacTaskbarButtonEngine();\n#endif\n#else\n#if defined(Q_OS_LINUX) && defined(QT_DBUS_LIB)\n    p->engine = new AsemanUnityTaskbarButtonEngine();\n#else\n    p->engine = new AsemanNullTaskbarButtonEngine();\n#endif\n#endif\n#endif\n}\n\nvoid AsemanTaskbarButton::setBadgeNumber(int num)\n{\n    if(p->badgeNumber == num)\n        return;\n\n    p->badgeNumber = num;\n    if(p->engine) p->engine->updateBadgeNumber(num);\n    Q_EMIT badgeNumberChanged();\n}\n\nint AsemanTaskbarButton::badgeNumber() const\n{\n    return p->badgeNumber;\n}\n\nvoid AsemanTaskbarButton::setProgress(qreal progress)\n{\n    if(p->progress == progress)\n        return;\n\n    p->progress = progress;\n    if(p->engine) p->engine->updateProgress(progress);\n    Q_EMIT progressChanged();\n}\n\nqreal AsemanTaskbarButton::progress() const\n{\n    return p->progress;\n}\n\nvoid AsemanTaskbarButton::setLauncher(const QString &launcher)\n{\n    if(p->launcher == launcher)\n        return;\n\n    p->launcher = launcher;\n    if(p->engine) p->engine->updateLauncher(p->launcher);\n    Q_EMIT launcherChanged();\n}\n\nQString AsemanTaskbarButton::launcher() const\n{\n    return p->launcher;\n}\n\nvoid AsemanTaskbarButton::setWindow(QWindow *win)\n{\n    if(p->window == win)\n        return;\n\n    p->window = win;\n    if(p->engine) p->engine->updateWindow(p->window);\n    Q_EMIT windowChanged();\n}\n\nQWindow *AsemanTaskbarButton::window() const\n{\n    return p->window;\n}\n\nvoid AsemanTaskbarButton::userAttention()\n{\n    if(p->engine) p->engine->userAttention();\n}\n\nAsemanTaskbarButton::~AsemanTaskbarButton()\n{\n    if(p->engine) delete p->engine;\n    delete p;\n}\n"
  },
  {
    "path": "src/widgets/asemantaskbarbutton.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANTASKBARBUTTON_H\n#define ASEMANTASKBARBUTTON_H\n\n#include <QObject>\n#include <QVariant>\n#include <QWindow>\n\n#include \"asemanwidgets_global.h\"\n\nclass QWindow;\nclass AsemanTaskbarButtonPrivate;\nclass LIBQTASEMAN_WIDGETS_EXPORT AsemanTaskbarButton : public QObject\n{\n    Q_OBJECT\n    Q_PROPERTY(int      badgeNumber READ badgeNumber WRITE setBadgeNumber NOTIFY badgeNumberChanged)\n    Q_PROPERTY(qreal    progress    READ progress    WRITE setProgress    NOTIFY progressChanged   )\n    Q_PROPERTY(QString  launcher    READ launcher    WRITE setLauncher    NOTIFY launcherChanged   )\n    Q_PROPERTY(QWindow* window      READ window      WRITE setWindow      NOTIFY windowChanged     )\n\npublic:\n    AsemanTaskbarButton(QObject *parent = Q_NULLPTR);\n    virtual ~AsemanTaskbarButton();\n\n    void setBadgeNumber(int num);\n    int badgeNumber() const;\n\n    void setProgress(qreal progress);\n    qreal progress() const;\n\n    void setLauncher(const QString &launcher);\n    QString launcher() const;\n\n    void setWindow(QWindow *win);\n    QWindow *window() const;\n\npublic Q_SLOTS:\n    void userAttention();\n\nQ_SIGNALS:\n    void badgeNumberChanged();\n    void progressChanged();\n    void launcherChanged();\n    void windowChanged();\n\nprivate:\n    AsemanTaskbarButtonPrivate *p;\n};\n\ntypedef AsemanTaskbarButton QAsemanTaskbarButton;\n\n#endif // ASEMANTASKBARBUTTON_H\n"
  },
  {
    "path": "src/widgets/asemanwidgets_global.h",
    "content": "#ifndef ASEMAN_WIDGETS_GLOBAL_H\n#define ASEMAN_WIDGETS_GLOBAL_H\n\n#include <QtCore/qglobal.h>\n\n#if !defined(QT_STATIC) && !defined(QASEMAN_STATIC)\n#if defined(LIBQTASEMAN_WIDGETS_LIBRARY)\n#  define LIBQTASEMAN_WIDGETS_EXPORT Q_DECL_EXPORT\n#else\n#  define LIBQTASEMAN_WIDGETS_EXPORT Q_DECL_IMPORT\n#endif\n#else\n#define LIBQTASEMAN_WIDGETS_EXPORT\n#endif\n\n#endif // ASEMAN_WIDGETS_GLOBAL_H\n"
  },
  {
    "path": "src/widgets/private/asemanabstracttaskbarbuttonengine.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanabstracttaskbarbuttonengine.h\"\n\nAsemanAbstractTaskbarButtonEngine::AsemanAbstractTaskbarButtonEngine(){}\n\nAsemanAbstractTaskbarButtonEngine::~AsemanAbstractTaskbarButtonEngine(){}\n\nvoid AsemanAbstractTaskbarButtonEngine::updateLauncher(const QString &launcher) {Q_UNUSED(launcher)}\n\nvoid AsemanAbstractTaskbarButtonEngine::updateWindow(QWindow *window) {Q_UNUSED(window)}\n\nvoid AsemanAbstractTaskbarButtonEngine::userAttention() {}\n"
  },
  {
    "path": "src/widgets/private/asemanabstracttaskbarbuttonengine.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANABSTRACTTASKBARBUTTONENGINE_H\n#define ASEMANABSTRACTTASKBARBUTTONENGINE_H\n\n#include <QObject>\n#include <QVariant>\n\n#include \"asemanwidgets_global.h\"\n\nclass QWindow;\nclass LIBQTASEMAN_WIDGETS_EXPORT AsemanAbstractTaskbarButtonEngine: public QObject\n{\n    Q_OBJECT\npublic:\n    AsemanAbstractTaskbarButtonEngine();\n    virtual ~AsemanAbstractTaskbarButtonEngine();\n    virtual void updateBadgeNumber(int num) = 0;\n    virtual void updateProgress(qreal progress) = 0;\n    virtual void updateLauncher(const QString &launcher);\n    virtual void updateWindow(QWindow *window);\n    virtual void userAttention();\n};\n\n#endif // ASEMANABSTRACTTASKBARBUTTONENGINE_H\n"
  },
  {
    "path": "src/widgets/private/asemanmactaskbarbuttonengine.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanmactaskbarbuttonengine.h\"\n\n#ifdef QT_MACEXTRAS_LIB\n#include <QtMac>\n#endif\n\nvoid AsemanMacTaskbarButtonEngine::updateBadgeNumber(int number)\n{\n#ifdef QT_MACEXTRAS_LIB\n    QtMac::setBadgeLabelText(number?QString::number(number):\"\");\n#else\n    Q_UNUSED(number)\n#endif\n}\n\nvoid AsemanMacTaskbarButtonEngine::updateProgress(qreal progress)\n{\n    Q_UNUSED(progress)\n}\n"
  },
  {
    "path": "src/widgets/private/asemanmactaskbarbuttonengine.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANMACTASKBARBUTTONENGINE_H\n#define ASEMANMACTASKBARBUTTONENGINE_H\n\n#include \"asemanabstracttaskbarbuttonengine.h\"\n\n#include \"asemanwidgets_global.h\"\n\nclass LIBQTASEMAN_WIDGETS_EXPORT AsemanMacTaskbarButtonEngine : public AsemanAbstractTaskbarButtonEngine\n{\npublic:\n    AsemanMacTaskbarButtonEngine(){}\n    virtual ~AsemanMacTaskbarButtonEngine(){}\n\n    void updateBadgeNumber(int number) Q_DECL_OVERRIDE;\n    void updateProgress(qreal progress) Q_DECL_OVERRIDE;\n};\n\n#endif // ASEMANMACTASKBARBUTTONENGINE_H\n"
  },
  {
    "path": "src/widgets/private/asemanunitytaskbarbuttonengine.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanunitytaskbarbuttonengine.h\"\n\n#ifdef QT_DBUS_LIB\n#include <QtDBus>\n#endif\n#include <QCoreApplication>\n\nAsemanUnityTaskbarButtonEngine::AsemanUnityTaskbarButtonEngine() :\n    _badge_number(0),\n    _progress(0),\n    _launcher(\"application://\" + QCoreApplication::applicationName() + \".desktop\")\n{\n}\n\nvoid AsemanUnityTaskbarButtonEngine::updateBadgeNumber(int number)\n{\n    _badge_number = number;\n    update(_launcher ,_badge_number, _progress, false);\n}\n\nvoid AsemanUnityTaskbarButtonEngine::updateProgress(qreal progress)\n{\n    _progress = progress;\n    update(_launcher ,_badge_number, _progress, false);\n}\n\nvoid AsemanUnityTaskbarButtonEngine::updateLauncher(const QString &launcher)\n{\n    if(_launcher == launcher)\n        return;\n    if(!_launcher.isEmpty() && (_badge_number || _progress))\n        update(_launcher ,0, 0, false);\n\n    _launcher = launcher;\n    update(_launcher ,_badge_number, _progress, false);\n}\n\nvoid AsemanUnityTaskbarButtonEngine::userAttention()\n{\n    update(_launcher ,_badge_number, _progress, true);\n}\n\nvoid AsemanUnityTaskbarButtonEngine::update(const QString &launcher, qint64 badgeNumber, qreal progress, bool userAttention)\n{\n#ifdef QT_DBUS_LIB\n    QDBusMessage signal = QDBusMessage::createSignal(\n     QStringLiteral(\"/\"),\n     QStringLiteral(\"com.canonical.Unity.LauncherEntry\"),\n     QStringLiteral(\"Update\"));\n\n    signal << launcher; // \"application://cutegram.desktop\"\n\n    QVariantMap setProperty;\n    setProperty.insert(QStringLiteral(\"count\"), badgeNumber);\n    setProperty.insert(QStringLiteral(\"count-visible\"), badgeNumber != 0);\n    setProperty.insert(QStringLiteral(\"progress\"), progress/100);\n    setProperty.insert(QStringLiteral(\"progress-visible\"), progress != 0);\n    setProperty.insert(QStringLiteral(\"urgent\"), userAttention);\n\n    signal << setProperty;\n    QDBusConnection::sessionBus().send(signal);\n#else\n    Q_UNUSED(launcher)\n    Q_UNUSED(badgeNumber)\n    Q_UNUSED(progress)\n#endif\n}\n"
  },
  {
    "path": "src/widgets/private/asemanunitytaskbarbuttonengine.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANUNITYTASKBARBUTTONENGINE_H\n#define ASEMANUNITYTASKBARBUTTONENGINE_H\n\n#include \"asemanabstracttaskbarbuttonengine.h\"\n\n#include \"asemanwidgets_global.h\"\n\nclass LIBQTASEMAN_WIDGETS_EXPORT AsemanUnityTaskbarButtonEngine : public AsemanAbstractTaskbarButtonEngine\n{\npublic:\n    AsemanUnityTaskbarButtonEngine();\n\n    void updateBadgeNumber(int number) Q_DECL_OVERRIDE;\n    void updateProgress(qreal progress) Q_DECL_OVERRIDE;\n    void updateLauncher(const QString &launcher) Q_DECL_OVERRIDE;\n    void userAttention() Q_DECL_OVERRIDE;\n\nprivate:\n    void update(const QString &launcher, qint64 badgeNumber, qreal progress, bool userAttention);\n\nprivate:\n    int _badge_number;\n    qreal _progress;\n    QString _launcher;\n};\n\n#endif // ASEMANUNITYTASKBARBUTTONENGINE_H\n"
  },
  {
    "path": "src/widgets/private/asemanwintaskbarbuttonengine.cpp",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#include \"asemanwintaskbarbuttonengine.h\"\n\n#include <QWindow>\n#include <QImage>\n#include <QIcon>\n#include <QPainter>\n#include <QPainterPath>\n#include <QRect>\n#include <QDebug>\n\n#ifdef QT_WINEXTRAS_LIB\n#include <QtWin>\n#include <QWinTaskbarButton>\n#include <QWinTaskbarProgress>\n#endif\n\nAsemanWinTaskbarButtonEngine::AsemanWinTaskbarButtonEngine()\n{\n    _button = new QWinTaskbarButton();\n}\n\nvoid AsemanWinTaskbarButtonEngine::updateBadgeNumber(int number)\n{\n    if(!_button->window())\n        return;\n\n    _button->setOverlayIcon( QIcon(QPixmap::fromImage(generateIcon(number))) );\n}\n\nvoid AsemanWinTaskbarButtonEngine::updateProgress(qreal progress)\n{\n    if(!_button->window())\n        return;\n\n    _button->progress()->setVisible(progress != 0);\n    _button->progress()->setValue(progress);\n}\n\nvoid AsemanWinTaskbarButtonEngine::updateWindow(QWindow *window)\n{\n    if(_button->window() == window)\n        return;\n    if(_button->window()) {\n        updateBadgeNumber(0);\n        updateProgress(0);\n    }\n\n    _button->setWindow(window);\n}\n\nQImage AsemanWinTaskbarButtonEngine::generateIcon(int count)\n{\n    QImage res = QImage(22, 22, QImage::Format_ARGB32);\n    res.fill(QColor(0,0,0,0));\n\n    if( count == 0 )\n        return res;\n\n    QRect rct;\n    rct.setX(1);\n    rct.setY(1);\n    rct.setWidth(res.width() - 2*rct.x());\n    rct.setHeight(res.height() - 2*rct.y());\n\n    QPainterPath path;\n    path.addEllipse(rct);\n\n    QPainter painter(&res);\n    painter.setRenderHint( QPainter::Antialiasing , true );\n    painter.fillPath( path, QColor(\"#ff0000\") );\n    painter.setPen(\"#333333\");\n    painter.drawPath( path );\n    painter.setPen(\"#ffffff\");\n    painter.drawText( rct, Qt::AlignCenter | Qt::AlignHCenter, QString::number(count) );\n\n    return res;\n}\n\nAsemanWinTaskbarButtonEngine::~AsemanWinTaskbarButtonEngine()\n{\n    delete _button;\n}\n"
  },
  {
    "path": "src/widgets/private/asemanwintaskbarbuttonengine.h",
    "content": "/*\n    Copyright (C) 2017 Aseman Team\n    http://aseman.co\n\n    AsemanQtTools is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    AsemanQtTools is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n*/\n\n#ifndef ASEMANWINTASKBARBUTTONENGINE_H\n#define ASEMANWINTASKBARBUTTONENGINE_H\n\n#include \"asemanabstracttaskbarbuttonengine.h\"\n\n#include \"asemanwidgets_global.h\"\n\nclass LIBQTASEMAN_WIDGETS_EXPORT AsemanWinTaskbarButtonEngine : public AsemanAbstractTaskbarButtonEngine\n{\npublic:\n    AsemanWinTaskbarButtonEngine();\n    virtual ~AsemanWinTaskbarButtonEngine();\n\n    void updateBadgeNumber(int number) Q_DECL_OVERRIDE;\n    void updateProgress(qreal progress) Q_DECL_OVERRIDE;\n    void updateWindow(class QWindow *window) Q_DECL_OVERRIDE;\n\nprivate:\n    QImage generateIcon(int count);\n\nprivate:\n    class QWinTaskbarButton *_button;\n};\n\n#endif // ASEMANWINTASKBARBUTTONENGINE_H\n"
  },
  {
    "path": "src/widgets/widgets.pri",
    "content": "INCLUDEPATH += $$PWD\nDEPENDPATH += $$PWD\n\nQT += core gui \n!android: !ios: {\n    QT += widgets\n    linux: QT += dbus\n}\n\nHEADERS += \\\n    $$PWD/asemandesktoptools.h \\\n    $$PWD/asemanfonthandler.h \\\n    $$PWD/asemantaskbarbutton.h \\\n    $$PWD/asemanwidgets_global.h \\\n    $$PWD/private/asemanabstracttaskbarbuttonengine.h \\\n    $$PWD/asemannotification.h\n\n\nSOURCES += \\\n    $$PWD/asemandesktoptools.cpp \\\n    $$PWD/asemanfonthandler.cpp \\\n    $$PWD/asemantaskbarbutton.cpp \\\n    $$PWD/private/asemanabstracttaskbarbuttonengine.cpp \\\n    $$PWD/asemannotification.cpp\n\n!android: !ios: {\n    HEADERS += \\\n        $$PWD/asemansystemtray.h \\\n        $$PWD/asemannativenotificationitem.h \\\n        $$PWD/asemannativenotification.h\n    SOURCES += \\\n        $$PWD/asemansystemtray.cpp \\\n        $$PWD/asemannativenotificationitem.cpp \\\n        $$PWD/asemannativenotification.cpp\n}\n\nmacx {\n    lessThan(QT_MAJOR_VERSION, 6) QT += macextras\n    DEFINES += MAC_NATIVE_ASEMAN_NOTIFICATION\n    SOURCES += \\\n        $$PWD/asemanmacnativenotification.cpp \\\n        $$PWD/private/asemanmactaskbarbuttonengine.cpp\n    HEADERS += \\\n        $$PWD/asemanmacnativenotification.h \\\n        $$PWD/private/asemanmactaskbarbuttonengine.h\n}\n!android: linux|openbsd {\n    DEFINES += LINUX_NATIVE_ASEMAN_NOTIFICATION\n    SOURCES += \\\n        $$PWD/asemanlinuxnativenotification.cpp \\\n        $$PWD/private/asemanunitytaskbarbuttonengine.cpp \\\n        $$PWD/asemankdewallet.cpp\n    HEADERS += \\\n        $$PWD/asemanlinuxnativenotification.h \\\n        $$PWD/private/asemanunitytaskbarbuttonengine.h \\\n        $$PWD/asemankdewallet.h\n}\nandroid {\n    DEFINES += ANDROID_NATIVE_ASEMAN_NOTIFICATION\n    HEADERS += \\\n        $$PWD/asemanandroidnativenotification.h\n    SOURCES += \\\n        $$PWD/asemanandroidnativenotification.cpp\n}\nwin {\n    QT += winextras\n    SOURCES += \\\n        $$PWD/private/asemanwintaskbarbuttonengine.cpp\n    HEADERS += \\\n        $$PWD/private/asemanwintaskbarbuttonengine.h\n}\n"
  },
  {
    "path": "src/widgets/widgets.pro",
    "content": "load(qt_build_config)\n\nTARGET = QAsemanWidgets\nQT += asemancore asemangui\n\nMODULE = asemanwidgets\n\nload(qt_module)\n\nDEFINES += LIBQTASEMAN_WIDGETS_LIBRARY\n\ninclude (widgets.pri)\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.5)\n\nproject(%{ProjectName} LANGUAGES CXX)\n\nset(CMAKE_INCLUDE_CURRENT_DIR ON)\n\nset(CMAKE_AUTOUIC ON)\nset(CMAKE_AUTOMOC ON)\nset(CMAKE_AUTORCC ON)\n\nset(CMAKE_CXX_STANDARD 11)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\n# QtCreator supports the following variables for Android, which are identical to qmake Android variables.\n# Check http://doc.qt.io/qt-5/deployment-android.html for more information.\n# They need to be set before the find_package(Qt5 ...) call.\n\n#if(ANDROID)\n#    set(ANDROID_PACKAGE_SOURCE_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/android\")\n#    if (ANDROID_ABI STREQUAL \"armeabi-v7a\")\n#        set(ANDROID_EXTRA_LIBS\n#            ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so\n#            ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so)\n#    endif()\n#endif()\n\n@if %{HasTranslation}\nfind_package(Qt5 COMPONENTS Core Quick LinguistTools REQUIRED)\n\nset(TS_FILES %{TsFileName})\n@else\nfind_package(Qt5 COMPONENTS Core Quick REQUIRED)\n@endif\n\nif(ANDROID)\n    add_library(%{ProjectName} SHARED\n      %{MainCppFileName}\n      qml.qrc\n@if %{HasTranslation}\n      ${TS_FILES}\n@endif\n    )\nelse()\n    add_executable(%{ProjectName}\n      %{MainCppFileName}\n      qml.qrc\n@if %{HasTranslation}\n      ${TS_FILES}\n@endif\n    )\nendif()\n\ntarget_compile_definitions(%{ProjectName}\n  PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)\ntarget_link_libraries(%{ProjectName}\n  PRIVATE Qt5::Core Qt5::Quick)\n@if %{HasTranslation}\n\nqt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES})\n@endif\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/android/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\"?>\n<manifest package=\"io.aseman.%{ProjectName}\" xmlns:android=\"http://schemas.android.com/apk/res/android\" android:versionName=\"1.0\" android:versionCode=\"1\" android:installLocation=\"auto\">\n<application android:hardwareAccelerated=\"true\" android:name=\"io.aseman.android.AsemanApplication\" android:icon=\"@mipmap/ic_launcher\" android:label=\"-- %%INSERT_APP_NAME%% --\">\n        <activity android:configChanges=\"orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation\" android:name=\"io.aseman.android.AsemanActivity\" android:label=\"-- %%INSERT_APP_NAME%% --\" android:screenOrientation=\"unspecified\" android:theme=\"@style/splashScreenTheme\" android:excludeFromRecents=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n\n            <!-- Application arguments -->\n            <!-- meta-data android:name=\"android.app.arguments\" android:value=\"arg1 arg2 arg3\"/ -->\n            <!-- Application arguments -->\n\n            <meta-data android:name=\"android.app.lib_name\" android:value=\"-- %%INSERT_APP_LIB_NAME%% --\"/>\n            <meta-data android:name=\"android.app.qt_sources_resource_id\" android:resource=\"@array/qt_sources\"/>\n            <meta-data android:name=\"android.app.repository\" android:value=\"default\"/>\n            <meta-data android:name=\"android.app.qt_libs_resource_id\" android:resource=\"@array/qt_libs\"/>\n            <meta-data android:name=\"android.app.bundled_libs_resource_id\" android:resource=\"@array/bundled_libs\"/>\n            <!-- Deploy Qt libs as part of package -->\n            <meta-data android:name=\"android.app.bundle_local_qt_libs\" android:value=\"-- %%BUNDLE_LOCAL_QT_LIBS%% --\"/>\n\n            <!-- Run with local libs -->\n            <meta-data android:name=\"android.app.use_local_qt_libs\" android:value=\"-- %%USE_LOCAL_QT_LIBS%% --\"/>\n            <meta-data android:name=\"android.app.libs_prefix\" android:value=\"/data/local/tmp/qt/\"/>\n            <meta-data android:name=\"android.app.load_local_libs_resource_id\" android:resource=\"@array/load_local_libs\"/>\n            <meta-data android:name=\"android.app.load_local_jars\" android:value=\"-- %%INSERT_LOCAL_JARS%% --\"/>\n            <meta-data android:name=\"android.app.static_init_classes\" android:value=\"-- %%INSERT_INIT_CLASSES%% --\"/>\n            <!-- Used to specify custom system library path to run with local system libs -->\n            <!-- <meta-data android:name=\"android.app.system_libs_prefix\" android:value=\"/system/lib/\"/> -->\n            <!--  Messages maps -->\n            <meta-data android:value=\"@string/ministro_not_found_msg\" android:name=\"android.app.ministro_not_found_msg\"/>\n            <meta-data android:value=\"@string/ministro_needed_msg\" android:name=\"android.app.ministro_needed_msg\"/>\n            <meta-data android:value=\"@string/fatal_error_msg\" android:name=\"android.app.fatal_error_msg\"/>\n            <meta-data android:value=\"@string/unsupported_android_version\" android:name=\"android.app.unsupported_android_version\"/>\n            <!--  Messages maps -->\n\n            <!-- Splash screen -->\n            <!-- Orientation-specific (portrait/landscape) data is checked first. If not available for current orientation,\n                 then android.app.splash_screen_drawable. For best results, use together with splash_screen_sticky and\n                 use hideSplashScreen() with a fade-out animation from Qt Android Extras to hide the splash screen when you\n                 are done populating your window with content. -->\n            <!-- meta-data android:name=\"android.app.splash_screen_drawable_portrait\" android:resource=\"@drawable/logo_portrait\" / -->\n            <!-- meta-data android:name=\"android.app.splash_screen_drawable_landscape\" android:resource=\"@drawable/logo_landscape\" / -->\n            <!-- meta-data android:name=\"android.app.splash_screen_drawable\" android:resource=\"@drawable/logo\"/ -->\n            <!-- meta-data android:name=\"android.app.splash_screen_sticky\" android:value=\"true\"/ -->\n            <!-- Splash screen -->\n\n            <!-- Background running -->\n            <!-- Warning: changing this value to true may cause unexpected crashes if the\n                          application still try to draw after\n                          \"applicationStateChanged(Qt::ApplicationSuspended)\"\n                          signal is sent! -->\n            <meta-data android:name=\"android.app.background_running\" android:value=\"false\"/>\n            <!-- Background running -->\n\n            <!-- auto screen scale factor -->\n            <meta-data android:name=\"android.app.auto_screen_scale_factor\" android:value=\"false\"/>\n            <!-- auto screen scale factor -->\n\n            <!-- extract android style -->\n            <!-- available android:values :\n                * default - In most cases this will be the same as \"full\", but it can also be something else if needed, e.g., for compatibility reasons\n                * full - useful QWidget & Quick Controls 1 apps\n                * minimal - useful for Quick Controls 2 apps, it is much faster than \"full\"\n                * none - useful for apps that don't use any of the above Qt modules\n                -->\n            <meta-data android:name=\"android.app.extract_android_style\" android:value=\"full\"/>\n            <!-- extract android style -->\n            <meta-data android:name=\"android.max_aspect\" android:value=\"2.4\" />\n    </activity>\n\n    <!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices -->\n\n    </application>\n\n    <uses-sdk android:minSdkVersion=\"21\" android:targetSdkVersion=\"23\"/>\n    <supports-screens android:largeScreens=\"true\" android:normalScreens=\"true\" android:anyDensity=\"true\" android:smallScreens=\"true\"/>\n\n    <!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.\n         Remove the comment if you do not require these default permissions. -->\n    <!-- %%INSERT_PERMISSIONS -->\n\n    <!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.\n         Remove the comment if you do not require these default features. -->\n    <!-- %%INSERT_FEATURES -->\n\n</manifest>\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/android/android.pri",
    "content": "\nandroid {\n    lessThan(QT_MAJOR_VERSION, 6) QT += androidextras\n    ANDROID_PACKAGE_SOURCE_DIR = $$PWD\n\n    OTHER_FILES += \\\n        $$PWD/AndroidManifest.xml \\\n        $$PWD/build.gradle \\\n        $$files($$PWD/*.png, true) \\\n        $$files($$PWD/*.xml, true)\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/android/build.gradle",
    "content": "buildscript {\n    repositories {\n        google()\n        jcenter()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.2.0'\n    }\n}\n\nrepositories {\n    google()\n    jcenter()\n}\n\napply plugin: 'com.android.application'\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])\n    implementation 'com.android.support:support-media-compat:26.+'\n    implementation 'com.android.support:appcompat-v7:27.0.0'\n    implementation 'com.android.support:design:27.0.0'\n}\n\nandroid {\n    /*******************************************************\n     * The following variables:\n     * - androidBuildToolsVersion,\n     * - androidCompileSdkVersion\n     * - qt5AndroidDir - holds the path to qt android files\n     *                   needed to build any Qt application\n     *                   on Android.\n     *\n     * are defined in gradle.properties file. This file is\n     * updated by QtCreator and androiddeployqt tools.\n     * Changing them manually might break the compilation!\n     *******************************************************/\n\n    compileSdkVersion androidCompileSdkVersion.toInteger()\n\n    buildToolsVersion androidBuildToolsVersion\n\n    sourceSets {\n        main {\n            manifest.srcFile 'AndroidManifest.xml'\n            java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java']\n            aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl']\n            res.srcDirs = [qt5AndroidDir + '/res', 'res']\n            resources.srcDirs = ['src']\n            renderscript.srcDirs = ['src']\n            assets.srcDirs = ['assets']\n            jniLibs.srcDirs = ['libs']\n       }\n    }\n\n    lintOptions {\n        abortOnError false\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/android/res/.directory",
    "content": "[Dolphin]\nGroupedSorting=true\nPreviewsShown=true\nSortRole=type\nTimestamp=2019,1,13,19,54,17\nVersion=4\nViewMode=1\nVisibleRoles=CustomizedDetails,Details_text,Details_imageSize,Details_size,Details_modificationtime\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/android/res/drawable/splash.xml",
    "content": "<bitmap xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:src=\"@drawable/splash_image\"\n        android:gravity=\"center\"\n        tools:ignore=\"ResourceCycle\"/>"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/android/res/values/style.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"splashScreenTheme\" parent=\"@android:style/Theme.DeviceDefault.Light.NoActionBar\">\n        <item name=\"android:windowBackground\">@drawable/splash</item>\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:adjustViewBounds\">true</item>\n        <item name=\"android:scaleType\">centerCrop</item>\n    </style>\n\n<!--    \n    <style name=\"AppTheme\" parent=\"@android:style/Theme.Material\">\n        <item name=\"android:colorPrimary\">#efefef</item>\n        <item name=\"android:colorPrimaryDark\">#333333</item>\n        <item name=\"android:colorAccent\">#F44336</item> \n    </style>\n-->\n</resources>\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/app.pro",
    "content": "@if \"%{UseVirtualKeyboard}\" == \"true\"\nQT += quick virtualkeyboard\n@else\nQT += quick\n@endif\n\nCONFIG += c++11\n\ninclude(ios/ios.pri)\ninclude(android/android.pri)\n\nexists ($$PWD/qml/imports): QML_IMPORT_PATH += $$PWD/qml/imports\n\nSOURCES += \\\\\n        %{MainCppFileName}\n\nRESOURCES += qml/qml.qrc\n@if %{HasTranslation}\n\nTRANSLATIONS += \\\\\n    %{TsFileName}\n@endif\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/app.qbs",
    "content": "import qbs\n\nCppApplication {\n@if \"%{UseVirtualKeyboard}\" == \"true\"\n    Depends { name: \"Qt\"; submodules: [\"quick\", \"virtualkeyboard\"] }\n@else\n    Depends { name: \"Qt.quick\" }\n@endif\n\n    // Additional import path used to resolve QML modules in Qt Creator's code model\n    property pathList qmlImportPaths: []\n\n    cpp.cxxLanguageVersion: \"c++14\"\n\n    cpp.defines: [\n        // The following define makes your compiler emit warnings if you use\n        // any Qt feature that has been marked deprecated (the exact warnings\n        // depend on your compiler). Please consult the documentation of the\n        // deprecated API in order to know how to port your code away from it.\n        \"QT_DEPRECATED_WARNINGS\",\n\n        // You can also make your code fail to compile if it uses deprecated APIs.\n        // In order to do so, uncomment the following line.\n        // You can also select to disable deprecated APIs only up to a certain version of Qt.\n        //\"QT_DISABLE_DEPRECATED_BEFORE=0x060000\" // disables all the APIs deprecated before Qt 6.0.0\n    ]\n\n    files: [\n        \"%{MainCppFileName}\",\n        \"main.qml\",\n        \"qml.qrc\",\n@if %{HasTranslation}\n        \"%{TsFileName}\",\n@endif\n    ]\n\n    Group {     // Properties for the produced executable\n        fileTagsFilter: \"application\"\n        qbs.install: true\n        qbs.installDir: \"bin\"\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/MainWindow.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Viewport 2.0\nimport QtQuick.Controls 2.3\nimport forms 1.0\nimport models 1.0\nimport \"routes\"\n\nAsemanWindow {\n    width: 500\n    height: 820\n\n    Viewport {\n        id: viewport\n        anchors.fill: parent\n        mainItem: MainForm {\n            anchors.fill: parent\n            listView.model: ExampleModel {}\n            onItemClicked: Viewport.controller.trigger(\"popup:/dialog/example\", {\"id\": id})\n        }\n    }\n\n    ViewController {\n        viewport: viewport\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/imports/forms/ErrorDialogForm.ui.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Base 2.0\nimport QtQuick.Controls 2.3\nimport QtQuick.Layouts 1.3\nimport globals 1.0\n\nItem {\n    id: element\n    width: Constants.width\n    height: columnLayout.height\n\n    property alias bodyLabel: bodyLabel\n    property alias titleLabel: titleLabel\n    property alias repeater: repeater\n\n    signal itemClicked(int index, string title)\n\n    Frame {\n        anchors.fill: parent\n        opacity: 0.7\n    }\n\n    ColumnLayout {\n        id: columnLayout\n        anchors.verticalCenter: parent.verticalCenter\n        anchors.right: parent.right\n        anchors.left: parent.left\n        spacing: 0\n\n        ColumnLayout {\n            Layout.topMargin: 12\n            Layout.fillHeight: true\n            Layout.fillWidth: true\n            Layout.margins: 10\n            spacing: 6\n\n            Label {\n                id: titleLabel\n                Layout.fillWidth: true\n                font.bold: true\n                font.pixelSize: 10 * Devices.fontDensity\n                horizontalAlignment: Devices.isAndroid ? Text.AlignLeft : Text.AlignHCenter\n                wrapMode: Text.WrapAtWordBoundaryOrAnywhere\n                text: \"Title\"\n            }\n\n            Label {\n                id: bodyLabel\n                Layout.fillWidth: true\n                Layout.fillHeight: true\n                font.pixelSize: 9 * Devices.fontDensity\n                horizontalAlignment: Devices.isAndroid ? Text.AlignLeft : Text.AlignHCenter\n                wrapMode: Text.WrapAtWordBoundaryOrAnywhere\n                text: \"Message's body\"\n            }\n        }\n\n        Rectangle {\n            Layout.topMargin: 6\n            Layout.fillWidth: true\n            Layout.preferredHeight: 1\n            color: \"#88888888\"\n            visible: !Devices.isAndroid\n            opacity: 0.4\n        }\n\n        RowLayout {\n            spacing: 0\n            Layout.fillWidth: true\n\n            Repeater {\n                id: repeater\n                model: [\"Ok\"]\n                Button {\n                    id: btn\n                    Layout.fillWidth: true\n                    topInset: 0\n                    bottomInset: 0\n                    leftInset: 0\n                    rightInset: 0\n                    highlighted: true\n                    flat: true\n                    hoverEnabled: false\n                    text: modelData\n\n                    Connections {\n                        target: btn\n                        onClicked: element.itemClicked(model.index, modelData)\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/imports/forms/MainForm.ui.qml",
    "content": "import QtQuick 2.12\nimport QtQuick.Controls 2.3\nimport QtQuick.Controls.Material 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Viewport 2.0\nimport globals 1.0\n\nPage {\n    width: Constants.width\n    height: Constants.height\n\n    property alias listView: listView\n\n    signal itemClicked(int id)\n\n    Label {\n        anchors.centerIn: parent\n        font.pixelSize: 12 * Devices.fontDensity\n        text: qsTr(\"List is empty\") + Translations.refresher\n        visible: listView.count == 0\n    }\n\n    ListView {\n        id: listView\n        anchors.top: header.bottom\n        anchors.left: parent.left\n        anchors.right: parent.right\n        anchors.bottom: parent.bottom\n        delegate: ItemDelegate {\n            id: del\n            height: 60\n            width: listView.width\n            text: model.title\n\n            Connections {\n                target: del\n                onClicked: itemClicked(model.id)\n            }\n        }\n    }\n\n    Header {\n        id: header\n        anchors.left: parent.left\n        anchors.right: parent.right\n        color: Material.primary\n        text: qsTr(\"%{ProjectName}\") + Translations.refresher\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/imports/forms/WaitDialog.ui.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Base 2.0\nimport QtQuick.Controls 2.3\nimport QtQuick.Layouts 1.3\nimport globals 1.0\n\nItem {\n    id: element\n    width: 200 * Devices.density\n    height: 150 * Devices.density\n\n    Frame {\n        id: dialogBackground\n        anchors.fill: parent\n        opacity: 0.7\n    }\n\n    ColumnLayout {\n        id: dialogLayout\n        spacing: 4 * Devices.density\n        anchors.verticalCenter: parent.verticalCenter\n        anchors.horizontalCenter: parent.horizontalCenter\n\n        BusyIndicator {\n            id: busyIndicator\n            Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter\n            running: element.visible\n        }\n\n        Label {\n            id: waitLabel\n            text: qsTr(\"Please Wait...\") + Translations.refresher\n            Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter\n            font.pixelSize: 9 * Devices.fontDensity\n        }\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/imports/forms/qmldir",
    "content": "ErrorDialogForm 1.0 ErrorDialogForm.ui.qml\nMainForm 1.0 MainForm.ui.qml\nWaitDialog 1.0 WaitDialog.ui.qml\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/imports/globals/Colors.qml",
    "content": "pragma Singleton\n\nimport QtQuick 2.10\nimport AsemanQml.Base 2.0\n\nQtObject {\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/imports/globals/Constants.qml",
    "content": "pragma Singleton\n\nimport QtQuick 2.10\nimport AsemanQml.Base 2.0\n\nQtObject {\n    readonly property int width: 480\n    readonly property int height: 800\n    \n    readonly property string cachePath: AsemanApp.homePath + \"/cache\"\n\n    Component.onCompleted: {\n        Tools.mkDir(cachePath)\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/imports/globals/Fonts.qml",
    "content": "pragma Singleton\n\nimport QtQuick 2.10\nimport AsemanQml.Base 2.0\n\nAsemanObject\n{\n    readonly property string ubuntuFont: \"Ubuntu\"\n\n    function init() {\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/imports/globals/GlobalSettings.qml",
    "content": "pragma Singleton\n\nimport QtQuick 2.7\nimport AsemanQml.Base 2.0\n\nSettings {\n        category: \"General\"\n        source: AsemanApp.homePath + \"/settings.ini\"\n\n        property bool languageInited: false\n}\n\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/imports/globals/qmldir",
    "content": "singleton Constants 1.0 Constants.qml\nsingleton GlobalSettings 1.0 GlobalSettings.qml\nsingleton Fonts 1.0 Fonts.qml\nsingleton Colors 1.0 Colors.qml\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/imports/models/ExampleModel.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Models 2.0\nimport requests 1.0\nimport globals 1.0\n\nAsemanListModel {\n    cachePath: Constants.cachePath + \"/example.cache\"\n\n    ExampleRequest {\n        id: req\n        allowGlobalBusy: true\n    }\n\n    AsemanListModelSource {\n        source: req.response\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/imports/models/qmldir",
    "content": " ExampleModel 1.0 ExampleModel.qml\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/imports/requests/BaseRequest.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Network 2.0\nimport AsemanQml.Viewport 2.0\nimport globals 1.0\n\nNetworkRequest {\n    id: req\n    contentType: 0 //NetworkRequest.TypeJson\n    ignoreKeys: [\"baseUrl\", \"refreshingState\", \"allowGlobalBusy\", \"allowShowErrors\"]\n    ignoreRegExp: /^_\\\\w+$/\n    headers: {\n        \"Content-Type\": \"application/json\"\n    }\n\n    readonly property string baseUrl: \"https://jsonplaceholder.typicode.com\"\n    readonly property bool refreshingState: req.refreshing\n    property bool allowGlobalBusy: false\n    property bool allowShowErrors: true\n\n    property alias _networkManager: networkManager\n    property bool _debug: false\n\n    signal refreshRequest()\n\n    onResponseChanged: if (_debug) console.debug(Tools.variantToJson(response))\n    onHeadersChanged: if (!refreshing) refreshRequest()\n    onRefreshingStateChanged: {\n        if (!allowGlobalBusy)\n            return;\n\n        if (refreshingState)\n            Viewport.controller.waitCount++\n        else\n            Viewport.controller.waitCount--\n    }\n\n    Component.onDestruction: if (refreshingState && allowGlobalBusy) Viewport.controller.waitCount--\n\n    onServerError: {\n        try {\n            _showError(\"Server Error\", response.message)\n        } catch (e) {}\n    }\n    onClientError: {\n        try {\n            _showError(\"Client Error\", response.message);\n        } catch (e) {}\n    }\n\n    function _showError(title, body) {\n        if (!allowShowErrors)\n            return;\n\n        Tools.jsDelayCall(500, function() {\n            Viewport.controller.trigger(\"dialog:/general/error\", {\"title\": title, \"body\": body})\n        })\n    }\n\n    NetworkRequestManager {\n        id: networkManager\n    }\n\n    Timer {\n        repeat: false\n        running: true\n        interval: 100\n        onTriggered: refreshRequest()\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/imports/requests/ExampleRequest.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport globals 1.0\n\nBaseRequest {\n    id: todoRequest\n    url: baseUrl + \"/todos\"\n\n    onRefreshRequest: refresh()\n\n    function refresh() {\n        if (refreshing)\n            return;\n\n        _networkManager.get(todoRequest);\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/imports/requests/qmldir",
    "content": "ExampleRequest 1.0 ExampleRequest.qml\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/main.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport globals 1.0\n\nAsemanApplication {\n    id: app\n    applicationAbout: \"It's %{ProjectName} app\"\n    applicationDisplayName: \"%{ProjectName}\"\n    Component.onCompleted: {\n        Fonts.init()\n\n        if (Devices.isDesktop) Devices.fontScale = 1.1\n        if (Devices.isAndroid) Devices.fontScale = 0.92\n        if (Devices.isIOS) Devices.fontScale = 1.1\n    }\n\n    MainWindow {\n        visible: true\n        font.family: Fonts.ubuntuFont\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/qml.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/\">\n        <file>qtquickcontrols2.conf</file>\n        <file>imports/forms/ErrorDialogForm.ui.qml</file>\n        <file>imports/forms/MainForm.ui.qml</file>\n        <file>imports/forms/qmldir</file>\n        <file>imports/forms/WaitDialog.ui.qml</file>\n        <file>imports/globals/Colors.qml</file>\n        <file>imports/globals/Constants.qml</file>\n        <file>imports/globals/Fonts.qml</file>\n        <file>imports/globals/GlobalSettings.qml</file>\n        <file>imports/globals/qmldir</file>\n        <file>imports/models/ExampleModel.qml</file>\n        <file>imports/models/qmldir</file>\n        <file>imports/requests/BaseRequest.qml</file>\n        <file>imports/requests/ExampleRequest.qml</file>\n        <file>imports/requests/qmldir</file>\n        <file>routes/ViewController.qml</file>\n        <file>routes/ErrorDialog.qml</file>\n        <file>routes/WaitDialog.qml</file>\n        <file>routes/ExamplePopup.qml</file>\n        <file>main.qml</file>\n        <file>MainWindow.qml</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/qtquickcontrols2.conf",
    "content": "[Controls]\nStyle=IOSStyle\n\n[Material]\nPrimary=Blue\nAccent=Teal\nTheme=Light\n\n[IOSStyle]\nPrimary=Blue\nAccent=Blue\nTheme=System\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/routes/ErrorDialog.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Base 2.0\nimport AsemanQml.Viewport 2.0\nimport forms 1.0\n\nErrorDialogForm {\n    width: Math.min(300, Viewport.viewport.width*0.8)\n\n    property variant buttons\n    property string title\n    property string body\n\n    titleLabel.text: title\n    bodyLabel.text: body\n    repeater.model: buttons? buttons : [ qsTr(\"Ok\") + Translations.refresher ]\n\n    onItemClicked: if (!buttons && index == 0) Viewport.viewport.closeLast()\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/routes/ExamplePopup.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Viewport 2.0\nimport QtQuick.Controls 2.3\nimport QtQuick.Layouts 1.3\nimport QtQuick.Controls.Material 2.0\n\nPage {\n    RowLayout {\n        anchors.centerIn: parent\n\n        Button {\n            text: qsTr(\"Popup\") + Translations.refresher\n            onClicked: Viewport.controller.trigger(\"popup:/dialog/example\")\n            highlighted: true\n        }\n\n        Button {\n            text: qsTr(\"Page\") + Translations.refresher\n            onClicked: Viewport.controller.trigger(\"page:/dialog/example\")\n        }\n    }\n\n    Header {\n        id: header\n        anchors.left: parent.left\n        anchors.right: parent.right\n        color: Material.primary\n        text: qsTr(\"App\") + Translations.refresher\n\n        HeaderMenuButton {\n            ratio: 1\n            onClicked: Viewport.viewport.closeLast()\n        }\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/routes/ViewController.qml",
    "content": "import QtQuick 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Viewport 2.0\n\nViewportController {\n    id: viewController\n\n    property int waitCount: 0\n    property variant waitObj\n\n    onWaitCountChanged: {\n        if (waitCount) {\n            if (!waitObj) waitObj = trigger(\"dialog:/wait\");\n        } else {\n            if (waitObj) waitObj.close()\n        }\n    }\n\n    ViewportControllerRoute {\n        route: /dialog\\\\:\\\\/general\\\\/error.*/\n        source: \"ErrorDialog.qml\"\n    }\n\n    ViewportControllerRoute {\n        route: /dialog\\\\:\\\\/wait/\n        source: \"WaitDialog.qml\"\n    }\n\n    ViewportControllerRoute {\n        route: /\\\\w+\\\\:\\\\/dialog\\\\/example.*/\n        source: \"ExamplePopup.qml\"\n    }\n}\n\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/qml/routes/WaitDialog.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Viewport 2.0\nimport forms 1.0\n\nWaitDialog {\n    ViewportType.touchToClose: false\n    ViewportType.blockBack: true\n\n    function close() {\n        ViewportType.open = false\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/full/wizard.json",
    "content": "{\n    \"version\": 1,\n    \"supportedProjectTypes\": [ \"CMakeProjectManager.CMakeProject\", \"Qbs.QbsProject\", \"Qt4ProjectManager.Qt4Project\" ],\n    \"id\": \"U.AsemanApplicationFull\",\n    \"category\": \"F.AsemanApp\",\n    \"trDescription\": \"Creates a Qt Quick Aseman application that contains full mechanism and design pattern of the Aseman apps.\",\n    \"trDisplayName\": \"Qt Aseman Application - Full\",\n    \"trDisplayCategory\": \"Aseman Apps\",\n    \"icon\": \"icon.png\",\n    \"featuresRequired\": [ \"QtSupport.Wizards.FeatureQt.5.6\" ],\n    \"enabled\": \"%{JS: value('Plugins').indexOf('QmakeProjectManager') >= 0 || value('Plugins').indexOf('QbsProjectManager') >= 0 || value('Plugins').indexOf('CMakeProjectManager') >= 0}\",\n\n    \"options\":\n    [\n        { \"key\": \"ProjectFile\", \"value\": \"%{JS: value('BuildSystem') === 'qmake' ? value('ProFile') : (value('BuildSystem') === 'cmake' ? value('CMakeFile') : value('QbsFile'))}\" },\n        { \"key\": \"ProFile\", \"value\": \"%{JS: Util.fileName(value('ProjectDirectory') + '/' + value('ProjectName'), 'pro')}\" },\n        { \"key\": \"QbsFile\", \"value\": \"%{JS: Util.fileName(value('ProjectDirectory') + '/' + value('ProjectName'), 'qbs')}\" },\n        { \"key\": \"CMakeFile\", \"value\": \"%{ProjectDirectory}/CMakeLists.txt\" },\n        { \"key\": \"MainCppFileName\", \"value\": \"%{JS: 'main.' + Util.preferredSuffix('text/x-c++src')}\" },\n        { \"key\": \"QtQuickVersion\", \"value\": \"%{JS: value('QtVersion').QtQuickVersion}\" },\n        { \"key\": \"QtQuickWindowVersion\", \"value\": \"%{JS: value('QtVersion').QtQuickWindowVersion}\" },\n        { \"key\": \"QtQuickVirtualKeyboardImport\", \"value\": \"%{JS: value('QtVersion').QtQuickVirtualKeyboardImport}\" },\n        { \"key\": \"QtQuickFeature\", \"value\": \"QtSupport.Wizards.FeatureQtQuick.%{QtQuickVersion}\" },\n        { \"key\": \"UseVirtualKeyboardByDefault\", \"value\": \"%{JS: value('Plugins').indexOf('Boot2Qt') >= 0 || value('Plugins').indexOf('Boot2QtQdb') >= 0}\" },\n        { \"key\": \"HasTranslation\", \"value\": \"%{JS: value('TsFileName') !== ''}\" },\n        { \"key\": \"SetQPAPhysicalSize\", \"value\": \"%{UseVirtualKeyboardByDefault}\" }\n    ],\n\n    \"pages\":\n    [\n        {\n            \"trDisplayName\": \"Project Location\",\n            \"trShortTitle\": \"Location\",\n            \"typeId\": \"Project\"\n        },\n        {\n            \"trDisplayName\": \"Define Build System\",\n            \"trShortTitle\": \"Build System\",\n            \"typeId\": \"Fields\",\n            \"enabled\": \"%{JS: !value('IsSubproject')}\",\n            \"data\":\n            [\n                {\n                    \"name\": \"BuildSystem\",\n                    \"trDisplayName\": \"Build system:\",\n                    \"type\": \"ComboBox\",\n                    \"persistenceKey\": \"BuildSystemType\",\n                    \"data\":\n                    {\n                        \"index\": 0,\n                        \"items\":\n                        [\n                            {\n                                \"trKey\": \"qmake\",\n                                \"value\": \"qmake\",\n                                \"condition\": \"%{JS: value('Plugins').indexOf('QmakeProjectManager') >= 0}\"\n                            },\n                            {\n                                \"trKey\": \"CMake\",\n                                \"value\": \"cmake\",\n                                \"condition\": \"%{JS: value('Plugins').indexOf('CMakeProjectManager') >= 0}\"\n                            },\n                            {\n                                \"trKey\": \"Qbs\",\n                                \"value\": \"qbs\",\n                                \"condition\": \"%{JS: value('Plugins').indexOf('QbsProjectManager') >= 0}\"\n                            }\n                        ]\n                    }\n                }\n            ]\n        },\n        {\n            \"trDisplayName\": \"Define Project Details\",\n            \"trShortTitle\": \"Details\",\n            \"typeId\": \"Fields\",\n            \"data\":\n            [\n                {\n                    \"name\": \"QtVersion\",\n                    \"trDisplayName\": \"Minimal required Qt version:\",\n                    \"type\": \"ComboBox\",\n                    \"persistenceKey\": \"QtQuick.minimumQtVersion\",\n                    \"data\":\n                    {\n                        \"index\": 2,\n                        \"items\":\n                        [\n                            {\n                                \"trKey\": \"Qt 5.14\",\n                                \"value\":\n                                {\n                                    \"QtQuickVersion\": \"2.14\",\n                                    \"QtQuickWindowVersion\": \"2.14\",\n                                    \"QtQuickVirtualKeyboardImport\": \"QtQuick.VirtualKeyboard 2.14\"\n                                }\n                            },\n                            {\n                                \"trKey\": \"Qt 5.13\",\n                                \"value\":\n                                {\n                                    \"QtQuickVersion\": \"2.13\",\n                                    \"QtQuickWindowVersion\": \"2.13\",\n                                    \"QtQuickVirtualKeyboardImport\": \"QtQuick.VirtualKeyboard 2.4\"\n                                }\n                            },\n                            {\n                                \"trKey\": \"Qt 5.12\",\n                                \"value\":\n                                {\n                                    \"QtQuickVersion\": \"2.12\",\n                                    \"QtQuickWindowVersion\": \"2.12\",\n                                    \"QtQuickVirtualKeyboardImport\": \"QtQuick.VirtualKeyboard 2.4\"\n                                }\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"UseVirtualKeyboard\",\n                    \"trDisplayName\": \"Use Qt Virtual Keyboard\",\n                    \"type\": \"CheckBox\",\n                    \"persistenceKey\": \"QtQuick.UseVirtualKeyboard.%{UseVirtualKeyboardByDefault}\",\n                    \"data\":\n                    {\n                        \"checked\": \"%{UseVirtualKeyboardByDefault}\"\n                    }\n                }\n            ]\n        },\n        {\n            \"trDisplayName\": \"Translation File\",\n            \"trShortTitle\": \"Translation\",\n            \"typeId\": \"QtTranslation\"\n        },\n        {\n            \"trDisplayName\": \"Kit Selection\",\n            \"trShortTitle\": \"Kits\",\n            \"typeId\": \"Kits\",\n            \"enabled\": \"%{JS: !value('IsSubproject')}\",\n            \"data\": {\n                \"projectFilePath\": \"%{ProjectFile}\",\n                \"requiredFeatures\": [ \"QtSupport.Wizards.FeatureQt\", \"%{QtQuickFeature}\" ]\n            }\n        },\n        {\n            \"trDisplayName\": \"Project Management\",\n            \"trShortTitle\": \"Summary\",\n            \"typeId\": \"Summary\"\n        }\n    ],\n    \"generators\":\n    [\n        {\n            \"typeId\": \"File\",\n            \"data\":\n            [\n                {\n                    \"source\": \"../app.pro\",\n                    \"target\": \"%{ProFile}\",\n                    \"openAsProject\": true,\n                    \"condition\": \"%{JS: value('BuildSystem') === 'qmake'}\"\n                },\n                {\n                    \"source\": \"../CMakeLists.txt\",\n                    \"target\": \"CMakeLists.txt\",\n                    \"openAsProject\": true,\n                    \"condition\": \"%{JS: value('BuildSystem') === 'cmake'}\"\n                },\n                {\n                    \"source\": \"../app.qbs\",\n                    \"target\": \"%{QbsFile}\",\n                    \"openAsProject\": true,\n                    \"condition\": \"%{JS: value('BuildSystem') === 'qbs'}\"\n                },\n                {\n                    \"source\": \"../main.cpp\",\n                    \"target\": \"%{MainCppFileName}\"\n                },\n                {\n                    \"source\": \"qml\"\n                },\n                {\n                    \"source\": \"../android/AndroidManifest.xml\",\n                    \"target\": \"android/AndroidManifest.xml\"\n                },\n                {\n                    \"source\": \"../android/build.gradle\",\n                    \"target\": \"android/build.gradle\"\n                },\n                {\n                    \"source\": \"../android/android.pri\",\n                    \"target\": \"android/android.pri\"\n                },\n                {\n                    \"source\": \"../android/res\",\n                    \"target\": \"android/res\",\n                    \"isBinary\": true\n                },\n                {\n                    \"source\": \"../ios/ios.pri\",\n                    \"target\": \"ios/ios.pri\"\n                },\n                {\n                    \"source\": \"../ios/osxviewcontroller.h\",\n                    \"target\": \"ios/osxviewcontroller.h\"\n                },\n                {\n                    \"source\": \"../ios/osxviewcontroller.mm\",\n                    \"target\": \"ios/osxviewcontroller.mm\"\n                },\n                {\n                    \"source\": \"../ios/Info.plist\",\n                    \"target\": \"ios/Info.plist\"\n                },\n                {\n                    \"source\": \"../ios/Launch.xib\",\n                    \"target\": \"ios/Launch.xib\"\n                },\n                {\n                    \"source\": \"../ios/icons\",\n                    \"target\": \"ios/icons\",\n                    \"isBinary\": true\n                },\n                {\n                    \"source\": \"../ios/splash\",\n                    \"target\": \"ios/splash\",\n                    \"isBinary\": true\n                },\n                {\n                    \"source\": \"../../git.ignore\",\n                    \"target\": \".gitignore\",\n                    \"condition\": \"%{JS: !value('IsSubproject') && value('VersionControl') === 'G.Git'}\"\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/ios/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n        <key>CFBundleDisplayName</key>\n        <string>${PRODUCT_NAME}</string>\n        <key>CFBundleExecutable</key>\n        <string>${EXECUTABLE_NAME}</string>\n        <key>CFBundleGetInfoString</key>\n        <string>Created by Qt/QMake</string>\n        <key>CFBundleIconFile</key>\n        <string>${ASSETCATALOG_COMPILER_APPICON_NAME}</string>\n        <key>CFBundleIdentifier</key>\n        <string>io.aseman.%{ProjectName}</string>\n        <key>CFBundleName</key>\n        <string>${PRODUCT_NAME}</string>\n        <key>CFBundlePackageType</key>\n        <string>APPL</string>\n        <key>CFBundleShortVersionString</key>\n        <string>1.0.0</string>\n        <key>CFBundleSignature</key>\n        <string>${QMAKE_PKGINFO_TYPEINFO}</string>\n        <key>CFBundleVersion</key>\n        <string>12</string>\n        <key>LSRequiresIPhoneOS</key>\n        <true/>\n        <key>MinimumOSVersion</key>\n        <string>${IPHONEOS_DEPLOYMENT_TARGET}</string>\n        <key>NOTE</key>\n        <string>This file was generated by Qt/QMake.</string>\n        <key>UILaunchStoryboardName</key>\n        <string>LaunchScreen</string>\n        <key>UISupportedInterfaceOrientations</key>\n        <array>\n                <string>UIInterfaceOrientationPortrait</string>\n        </array>\n        <key>CFBundleIcons</key>\n        <dict>\n                <key>CFBundlePrimaryIcon</key>\n                <dict>\n                        <key>CFBundleIconFiles</key>\n                        <array>\n                                <string>AppIcon24x24@2x.png</string>\n                                <string>Icon-Small-40.png</string>\n                                <string>AppIcon27.5x27.5@2x.png</string>\n                                <string>Icon-Small-40@2x.png</string>\n                                <string>AppIcon40x40@2x.png</string>\n                                <string>Icon-Small-50.png</string>\n                                <string>AppIcon44x44@2x.png</string>\n                                <string>Icon-Small-50@2x.png</string>\n                                <string>AppIcon86x86@2x.png</string>\n                                <string>Icon-Small.png</string>\n                                <string>AppIcon98x98@2x.png</string>\n                                <string>Icon-Small@2x.png</string>\n                        </array>\n                </dict>\n        </dict>\n        <key>UILaunchStoryboardName</key>\n        <string>Launch</string>\n        <key>UILaunchImages</key>\n        <array>\n            <dict>\n                <key>UILaunchImageMinimumOSVersion</key>\n                <string>7.0</string>\n                <key>UILaunchImageName</key>\n                <string>LaunchImage-iOS7</string>\n                <key>UILaunchImageOrientation</key>\n                <string>Portrait</string>\n                <key>UILaunchImageSize</key>\n                <string>{320, 568}</string>\n            </dict>\n            <dict>\n                <key>UILaunchImageMinimumOSVersion</key>\n                <string>7.0</string>\n                <key>UILaunchImageName</key>\n                <string>LaunchImage-iOS7</string>\n                <key>UILaunchImageOrientation</key>\n                <string>Portrait</string>\n                <key>UILaunchImageSize</key>\n                <string>{320, 480}</string>\n            </dict>\n        </array>\n</dict>\n</plist>\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/ios/Launch.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13771\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina3_5\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment version=\"4096\" identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13772\"/>\n        <capability name=\"Unknown constraint types\" minToolsVersion=\"5.1\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"510\" height=\"769\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" fixedFrame=\"YES\" image=\"LaunchImage-iOS7-Portrait.png\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kCR-A8-qWR\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"510\" height=\"769\"/>\n                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                </imageView>\n            </subviews>\n            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <constraints>\n                <constraint firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" symbolic=\"YES\" id=\"MfP-vx-nX0\"/>\n            </constraints>\n            <nil key=\"simulatedStatusBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"419\" y=\"300.5\"/>\n        </view>\n    </objects>\n    <resources>\n        <image name=\"LaunchImage-iOS7-Portrait.png\" width=\"768\" height=\"1024\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/ios/ios.pri",
    "content": "\nios {\n    HEADERS += \\\\\n        $$PWD/osxviewcontroller.h\n    SOURCES += \\\\\n        $$PWD/osxviewcontroller.mm\n\n    OTHER_FILES += \\\\\n        $$PWD/Launch.xib \\\\\n        $$PWD/Info.plist \\\\\n        $$files($$PWD/*.png, true)\n}\n\nios {\n    QMAKE_INFO_PLIST = info.plist\n\n    app_launch_images.files = $$PWD/Launch.xib $$files($$PWD/splash/LaunchImage*.png)\n    QMAKE_BUNDLE_DATA += app_launch_images\n\n    ios_icon.files = $$files($$PWD/icons/*.png)\n    QMAKE_BUNDLE_DATA += ios_icon\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/ios/osxviewcontroller.h",
    "content": "#ifndef MYVIEWCONTROLLER_H\n#define MYVIEWCONTROLLER_H\n\n#import <UIKit/UIKit.h>\n\n@interface QIOSViewController : UIViewController\n@end\n\n\n@interface QIOSViewController (MyView)\n@end\n\n#endif // MYVIEWCONTROLLER_H\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/ios/osxviewcontroller.mm",
    "content": "#import \"osxviewcontroller.h\"\n\n@implementation QIOSViewController (MyView)\n\n- (UIStatusBarStyle)preferredStatusBarStyle\n{\n    return UIStatusBarStyleLightContent;\n}\n\n@end\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/main.cpp",
    "content": "%{Cpp:LicenseTemplate}\\\n%{JS: QtSupport.qtIncludes([], [\"QtGui/QGuiApplication\", \"QtQml/QQmlApplicationEngine\"])}\nint main(int argc, char *argv[])\n{\n@if %{UseVirtualKeyboard}\n    qputenv(\"QT_IM_MODULE\", QByteArray(\"qtvirtualkeyboard\"));\n\n@endif\n@if %{SetQPAPhysicalSize}\n    if (qEnvironmentVariableIsEmpty(\"QTGLESSTREAM_DISPLAY\")) {\n        qputenv(\"QT_QPA_EGLFS_PHYSICAL_WIDTH\", QByteArray(\"213\"));\n        qputenv(\"QT_QPA_EGLFS_PHYSICAL_HEIGHT\", QByteArray(\"120\"));\n\n        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);\n    }\n@else\n    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);\n@endif\n\n    QGuiApplication app(argc, argv);\n\n    QQmlApplicationEngine engine;\n    engine.addImportPath(\":/imports/\");\n    const QUrl url(QStringLiteral(\"qrc:/main.qml\"));\n    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,\n                     &app, [url](QObject *obj, const QUrl &objUrl) {\n        if (!obj && url == objUrl)\n            QCoreApplication::exit(-1);\n    }, Qt::QueuedConnection);\n    engine.load(url);\n\n    return app.exec();\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/qtquickcontrols2.conf",
    "content": "; This file can be edited to change the style of the application\n; Read \"Qt Quick Controls 2 Configuration File\" for details:\n; http://doc.qt.io/qt-5/qtquickcontrols2-configuration.html\n\n[Controls]\nStyle=%{QtQuickControlsStyle}\n@if '%{QtQuickControlsStyle}' == 'Universal'\n\n[Universal]\nTheme=%{QtQuickControlsStyleTheme}\n;Accent=Steel\n;Foreground=Brown\n;Background=Steel\n@endif\n@if '%{QtQuickControlsStyle}' == 'Material'\n\n[Material]\nTheme=%{QtQuickControlsStyleTheme}\n;Accent=BlueGrey\n;Primary=BlueGray\n;Foreground=Brown\n;Background=Grey\n@endif\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/simple/qml/MainForm.ui.qml",
    "content": "import QtQuick 2.12\nimport QtQuick.Controls 2.3\nimport QtQuick.Controls.Material 2.0\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Viewport 2.0\n\nPage {\n\n    property alias menuButton: menuButton\n    property alias drawer: drawer\n    property alias btn: btn\n    property alias menuBtn: menuBtn\n\n    Column {\n        anchors.centerIn: parent\n\n        Button {\n            id: menuBtn\n            font.pixelSize: 12 * Devices.fontDensity\n            text: qsTr(\"Menu\") + Translations.refresher\n        }\n\n        Button {\n            id: btn\n            font.pixelSize: 12 * Devices.fontDensity\n            text: qsTr(\"Popup\") + Translations.refresher\n        }\n    }\n\n    Header {\n        id: header\n        anchors.left: parent.left\n        anchors.right: parent.right\n        color: Material.primary\n        text: qsTr(\"%{ProjectName}\") + Translations.refresher\n    }\n\n    Drawer {\n        id: drawer\n        anchors.fill: parent\n        delegate: Rectangle {\n            anchors.fill: parent\n        }\n    }\n\n    HeaderMenuButton {\n        id: menuButton\n        ratio: drawer.percent\n        buttonColor: ratio > 0.1? \"black\" : \"white\"\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/simple/qml/MainWindow.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\nimport AsemanQml.Viewport 2.0\nimport QtQuick.Controls 2.3\n\nAsemanWindow {\n    width: 500\n    height: 820\n\n    Viewport {\n        id: viewport\n        anchors.fill: parent\n        mainItem: MainForm {\n            anchors.fill: parent\n            menuButton.onClicked: drawer.percent? drawer.discard() : drawer.show()\n            btn.onClicked: Viewport.controller.trigger(\"popup:/hello/world\", {extra: \" :)\"})\n            menuBtn.onClicked: Viewport.controller.trigger(\"menu:/hello/world\", {extra: \" :)\"})\n        }\n    }\n\n    ViewportController {\n        viewport: viewport\n\n        ViewportControllerRoute {\n            route: /popup\\\\:\\\\/hello\\\\/world.*/\n            sourceComponent: Label {\n                horizontalAlignment: Text.AlignHCenter\n                verticalAlignment: Text.AlignVCenter\n                text: qsTr(\"Hello World!\") + Translations.refresher + extra\n                property string extra\n            }\n        }\n\n        ViewportControllerRoute {\n            route: /menu\\\\:\\\\/hello\\\\/world.*/\n            sourceComponent: Rectangle {\n                radius: 10\n                anchors.top: parent.verticalCenter\n                anchors.left: parent.horizontalCenter\n                width: 200\n                height: 200\n                color: \"#eee\"\n\n                MouseArea { anchors.fill: parent }\n\n                Button {\n                    anchors.centerIn: parent\n                    text: qsTr(\"Close\") + Translations.refresher\n                    onClicked: Viewport.viewport.closeLast()\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/simple/qml/main.qml",
    "content": "import QtQuick 2.12\nimport AsemanQml.Base 2.0\nimport AsemanQml.Controls 2.0\n\nAsemanApplication {\n    applicationAbout: \"It's %{ProjectName} app\"\n    applicationDisplayName: \"%{ProjectName}\"\n\n    MainWindow {\n        visible: true\n    }\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/simple/qml/qml.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/\">\n        <file>qtquickcontrols2.conf</file>\n        <file>MainForm.ui.qml</file>\n        <file>MainWindow.qml</file>\n        <file>main.qml</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/simple/qml/qtquickcontrols2.conf",
    "content": "[Controls]\nStyle=IOSStyle\n\n[Material]\nPrimary=Blue\nAccent=Teal\nTheme=Light\n\n[IOSStyle]\nPrimary=Blue\nAccent=Blue\nTheme=System\n"
  },
  {
    "path": "src/wizards/qtcreator/qtasemanapplication/simple/wizard.json",
    "content": "{\n    \"version\": 1,\n    \"supportedProjectTypes\": [ \"CMakeProjectManager.CMakeProject\", \"Qbs.QbsProject\", \"Qt4ProjectManager.Qt4Project\" ],\n    \"id\": \"U.AsemanApplicationSimple\",\n    \"category\": \"F.AsemanApp\",\n    \"trDescription\": \"Creates a Simple Qt Quick Aseman application that contains MainPage with Header and Drawer.\",\n    \"trDisplayName\": \"Qt Aseman Application - Simple\",\n    \"trDisplayCategory\": \"Aseman Apps\",\n    \"icon\": \"icon.png\",\n    \"featuresRequired\": [ \"QtSupport.Wizards.FeatureQt.5.6\" ],\n    \"enabled\": \"%{JS: value('Plugins').indexOf('QmakeProjectManager') >= 0 || value('Plugins').indexOf('QbsProjectManager') >= 0 || value('Plugins').indexOf('CMakeProjectManager') >= 0}\",\n\n    \"options\":\n    [\n        { \"key\": \"ProjectFile\", \"value\": \"%{JS: value('BuildSystem') === 'qmake' ? value('ProFile') : (value('BuildSystem') === 'cmake' ? value('CMakeFile') : value('QbsFile'))}\" },\n        { \"key\": \"ProFile\", \"value\": \"%{JS: Util.fileName(value('ProjectDirectory') + '/' + value('ProjectName'), 'pro')}\" },\n        { \"key\": \"QbsFile\", \"value\": \"%{JS: Util.fileName(value('ProjectDirectory') + '/' + value('ProjectName'), 'qbs')}\" },\n        { \"key\": \"CMakeFile\", \"value\": \"%{ProjectDirectory}/CMakeLists.txt\" },\n        { \"key\": \"MainCppFileName\", \"value\": \"%{JS: 'main.' + Util.preferredSuffix('text/x-c++src')}\" },\n        { \"key\": \"QtQuickVersion\", \"value\": \"%{JS: value('QtVersion').QtQuickVersion}\" },\n        { \"key\": \"QtQuickWindowVersion\", \"value\": \"%{JS: value('QtVersion').QtQuickWindowVersion}\" },\n        { \"key\": \"QtQuickVirtualKeyboardImport\", \"value\": \"%{JS: value('QtVersion').QtQuickVirtualKeyboardImport}\" },\n        { \"key\": \"QtQuickFeature\", \"value\": \"QtSupport.Wizards.FeatureQtQuick.%{QtQuickVersion}\" },\n        { \"key\": \"UseVirtualKeyboardByDefault\", \"value\": \"%{JS: value('Plugins').indexOf('Boot2Qt') >= 0 || value('Plugins').indexOf('Boot2QtQdb') >= 0}\" },\n        { \"key\": \"HasTranslation\", \"value\": \"%{JS: value('TsFileName') !== ''}\" },\n        { \"key\": \"SetQPAPhysicalSize\", \"value\": \"%{UseVirtualKeyboardByDefault}\" }\n    ],\n\n    \"pages\":\n    [\n        {\n            \"trDisplayName\": \"Project Location\",\n            \"trShortTitle\": \"Location\",\n            \"typeId\": \"Project\"\n        },\n        {\n            \"trDisplayName\": \"Define Build System\",\n            \"trShortTitle\": \"Build System\",\n            \"typeId\": \"Fields\",\n            \"enabled\": \"%{JS: !value('IsSubproject')}\",\n            \"data\":\n            [\n                {\n                    \"name\": \"BuildSystem\",\n                    \"trDisplayName\": \"Build system:\",\n                    \"type\": \"ComboBox\",\n                    \"persistenceKey\": \"BuildSystemType\",\n                    \"data\":\n                    {\n                        \"index\": 0,\n                        \"items\":\n                        [\n                            {\n                                \"trKey\": \"qmake\",\n                                \"value\": \"qmake\",\n                                \"condition\": \"%{JS: value('Plugins').indexOf('QmakeProjectManager') >= 0}\"\n                            },\n                            {\n                                \"trKey\": \"CMake\",\n                                \"value\": \"cmake\",\n                                \"condition\": \"%{JS: value('Plugins').indexOf('CMakeProjectManager') >= 0}\"\n                            },\n                            {\n                                \"trKey\": \"Qbs\",\n                                \"value\": \"qbs\",\n                                \"condition\": \"%{JS: value('Plugins').indexOf('QbsProjectManager') >= 0}\"\n                            }\n                        ]\n                    }\n                }\n            ]\n        },\n        {\n            \"trDisplayName\": \"Define Project Details\",\n            \"trShortTitle\": \"Details\",\n            \"typeId\": \"Fields\",\n            \"data\":\n            [\n                {\n                    \"name\": \"QtVersion\",\n                    \"trDisplayName\": \"Minimal required Qt version:\",\n                    \"type\": \"ComboBox\",\n                    \"persistenceKey\": \"QtQuick.minimumQtVersion\",\n                    \"data\":\n                    {\n                        \"index\": 2,\n                        \"items\":\n                        [\n                            {\n                                \"trKey\": \"Qt 5.14\",\n                                \"value\":\n                                {\n                                    \"QtQuickVersion\": \"2.14\",\n                                    \"QtQuickWindowVersion\": \"2.14\",\n                                    \"QtQuickVirtualKeyboardImport\": \"QtQuick.VirtualKeyboard 2.14\"\n                                }\n                            },\n                            {\n                                \"trKey\": \"Qt 5.13\",\n                                \"value\":\n                                {\n                                    \"QtQuickVersion\": \"2.13\",\n                                    \"QtQuickWindowVersion\": \"2.13\",\n                                    \"QtQuickVirtualKeyboardImport\": \"QtQuick.VirtualKeyboard 2.4\"\n                                }\n                            },\n                            {\n                                \"trKey\": \"Qt 5.12\",\n                                \"value\":\n                                {\n                                    \"QtQuickVersion\": \"2.12\",\n                                    \"QtQuickWindowVersion\": \"2.12\",\n                                    \"QtQuickVirtualKeyboardImport\": \"QtQuick.VirtualKeyboard 2.4\"\n                                }\n                            }\n                        ]\n                    }\n                },\n                {\n                    \"name\": \"UseVirtualKeyboard\",\n                    \"trDisplayName\": \"Use Qt Virtual Keyboard\",\n                    \"type\": \"CheckBox\",\n                    \"persistenceKey\": \"QtQuick.UseVirtualKeyboard.%{UseVirtualKeyboardByDefault}\",\n                    \"data\":\n                    {\n                        \"checked\": \"%{UseVirtualKeyboardByDefault}\"\n                    }\n                }\n            ]\n        },\n        {\n            \"trDisplayName\": \"Translation File\",\n            \"trShortTitle\": \"Translation\",\n            \"typeId\": \"QtTranslation\"\n        },\n        {\n            \"trDisplayName\": \"Kit Selection\",\n            \"trShortTitle\": \"Kits\",\n            \"typeId\": \"Kits\",\n            \"enabled\": \"%{JS: !value('IsSubproject')}\",\n            \"data\": {\n                \"projectFilePath\": \"%{ProjectFile}\",\n                \"requiredFeatures\": [ \"QtSupport.Wizards.FeatureQt\", \"%{QtQuickFeature}\" ]\n            }\n        },\n        {\n            \"trDisplayName\": \"Project Management\",\n            \"trShortTitle\": \"Summary\",\n            \"typeId\": \"Summary\"\n        }\n    ],\n    \"generators\":\n    [\n        {\n            \"typeId\": \"File\",\n            \"data\":\n            [\n                {\n                    \"source\": \"../app.pro\",\n                    \"target\": \"%{ProFile}\",\n                    \"openAsProject\": true,\n                    \"condition\": \"%{JS: value('BuildSystem') === 'qmake'}\"\n                },\n                {\n                    \"source\": \"../CMakeLists.txt\",\n                    \"target\": \"CMakeLists.txt\",\n                    \"openAsProject\": true,\n                    \"condition\": \"%{JS: value('BuildSystem') === 'cmake'}\"\n                },\n                {\n                    \"source\": \"../app.qbs\",\n                    \"target\": \"%{QbsFile}\",\n                    \"openAsProject\": true,\n                    \"condition\": \"%{JS: value('BuildSystem') === 'qbs'}\"\n                },\n                {\n                    \"source\": \"../main.cpp\",\n                    \"target\": \"%{MainCppFileName}\"\n                },\n                {\n                    \"source\": \"qml\"\n                },\n                {\n                    \"source\": \"../android/AndroidManifest.xml\",\n                    \"target\": \"android/AndroidManifest.xml\"\n                },\n                {\n                    \"source\": \"../android/build.gradle\",\n                    \"target\": \"android/build.gradle\"\n                },\n                {\n                    \"source\": \"../android/android.pri\",\n                    \"target\": \"android/android.pri\"\n                },\n                {\n                    \"source\": \"../android/res\",\n                    \"target\": \"android/res\",\n                    \"isBinary\": true\n                },\n                {\n                    \"source\": \"../ios/ios.pri\",\n                    \"target\": \"ios/ios.pri\"\n                },\n                {\n                    \"source\": \"../ios/osxviewcontroller.h\",\n                    \"target\": \"ios/osxviewcontroller.h\"\n                },\n                {\n                    \"source\": \"../ios/osxviewcontroller.mm\",\n                    \"target\": \"ios/osxviewcontroller.mm\"\n                },\n                {\n                    \"source\": \"../ios/Info.plist\",\n                    \"target\": \"ios/Info.plist\"\n                },\n                {\n                    \"source\": \"../ios/Launch.xib\",\n                    \"target\": \"ios/Launch.xib\"\n                },\n                {\n                    \"source\": \"../ios/icons\",\n                    \"target\": \"ios/icons\",\n                    \"isBinary\": true\n                },\n                {\n                    \"source\": \"../ios/splash\",\n                    \"target\": \"ios/splash\",\n                    \"isBinary\": true\n                },\n                {\n                    \"source\": \"../../git.ignore\",\n                    \"target\": \".gitignore\",\n                    \"condition\": \"%{JS: !value('IsSubproject') && value('VersionControl') === 'G.Git'}\"\n                }\n            ]\n        }\n    ]\n}\n"
  },
  {
    "path": "src/wizards/qtcreator/qtcreator.pro",
    "content": "TEMPLATE = aux\nCONFIG -= qt android_install\n\nwizardresources.files = \\\n    $$PWD/qtasemanapplication\n\nwizardresources.path = $$[QT_INSTALL_PREFIX]/share/qtcreator/templates/wizards/projects/\n\nINSTALLS += wizardresources\n\n!prefix_build:!equals(OUT_PWD, $$PWD) {\n    RETURN = $$escape_expand(\\\\n\\\\t)\n    equals(QMAKE_HOST.os, Windows) {\n        RETURN = $$escape_expand(\\\\r\\\\n\\\\t)\n    }\n    OUT_PATH = $$shell_path($$OUT_PWD)\n\n    QMAKE_POST_LINK += \\\n        $${QMAKE_COPY_DIR} $$shell_path($$PWD/qtasemanapplication) $$OUT_PATH\n}\n"
  },
  {
    "path": "src/wizards/wizards.pro",
    "content": "TEMPLATE = subdirs\nCONFIG   += ordered\nSUBDIRS  = qtcreator \n"
  },
  {
    "path": "sync.profile",
    "content": "%modules = (\r\n    \"QAsemanCore\" => \"$basedir/src/core\",\r\n    \"QAsemanNetwork\" => \"$basedir/src/network\",\r\n    \"QAsemanSql\" => \"$basedir/src/sql\",\r\n    \"QAsemanGui\" => \"$basedir/src/gui\",\r\n    \"QAsemanWidgets\" => \"$basedir/src/widgets\",\r\n    \"QAsemanGeo\" => \"$basedir/src/geo\",\r\n    \"QAsemanQml\" => \"$basedir/src/qml\",\r\n    \"QAsemanMultimedia\" => \"$basedir/src/multimedia\",\r\n    \"QAsemanHttpServer\" => \"$basedir/src/httpserver\",\r\n);\r\n"
  },
  {
    "path": "tests/auto/auto.pro",
    "content": "TEMPLATE = subdirs\nSUBDIRS =\nCONFIG-=create_cmake"
  },
  {
    "path": "tests/auto/cmake/cmake.pro",
    "content": "# let cmake do nothing \nTEMPLATE = subdirs\nSUBDIRS ="
  },
  {
    "path": "tests/tests.pro",
    "content": "TEMPLATE = subdirs\nSUBDIRS +=  auto\n"
  }
]