Configuration

This section includes all configurable files for the selected script. Most settings are configured automatically, but each config.lua file contains a header comment explaining the purpose and usage of every configuration type. Be sure to read the header of each file carefully to fully understand how to customize and adapt the system for QBCORE, ESX, or standalone environments, ensuring seamless integration with your server.


qs-smartphone-pro/config/config.js
/*──────────────────────────────────────────────────────────────────────────────
 *  Quasar Smartphone · NUI Configuration File
 *──────────────────────────────────────────────────────────────────────────────
 *  [INFO] This configuration defines general UI transitions, WebRTC servers,
 *         and front-end widgets used inside the smartphone interface.
 *
 *  • [EDIT]  – Safe to modify. Adjust visuals, transitions, or widget settings.
 *  • [ADV]   – Advanced configuration (change only if you understand JS behavior).
 *  • [CORE]  – Core system logic. Do not modify unless developing new features.
 *
 *  Always make a backup before editing this file. Incorrect changes may
 *  break NUI rendering or cause desync with the backend configuration.
 *──────────────────────────────────────────────────────────────────────────────*/

const Config = {}

/*──────────────────────────────────────────────────────────────────────────────
 * Screen Transitions                                                          [EDIT]
 *──────────────────────────────────────────────────────────────────────────────
 * Adjust the duration and easing types for lock screen and general transitions.
 * Use easing types compatible with anime.js or CSS transitions (e.g. easeOutQuad).
 */
Config.LockScreenTransitionTime = 450                      // [EDIT] Duration (ms)
Config.LockScreenTransitionType = 'easeOutQuad'            // [EDIT] Easing type

Config.GeneralTransitionDuration = 350                     // [EDIT] Duration (ms)
Config.GeneralTransitionType = 'easeOutQuad'               // [EDIT] Easing type

/*──────────────────────────────────────────────────────────────────────────────
 * RTC Servers (Voice / Call System)                                           [ADV]
 *──────────────────────────────────────────────────────────────────────────────
 * Configuration for WebRTC ICE/STUN/TURN servers. Modify only if hosting your
 * own signaling infrastructure. Default servers are reliable and global.
 */
Config.RTCServers = {
    iceServers: [
        {
            urls: "stun:stun.l.google.com:19302"
        },
        {
            urls: ["turn:eu-0.turn.peerjs.com:3478", "turn:us-0.turn.peerjs.com:3478"],
            username: "peerjs",
            credential: "peerjsp"
        }
    ],
    sdpSemantics: "unified-plan"
}

/*──────────────────────────────────────────────────────────────────────────────
 * Widgets                                                                     [EDIT]
 *──────────────────────────────────────────────────────────────────────────────
 * Define active widgets displayed on the phone UI. Each widget includes:
 *   • name  – internal widget ID.
 *   • scale – visual scale multiplier (1–5 recommended).
 */
Config.Widgets = [
    {
        name: "weazel-widget",
        scale: 4
    },
    {
        name: "weather-widget",
        scale: 4
    },
    {
        name: "battery-widget",
        scale: 4
    },
    {
        name: "calendar-widget",
        scale: 4
    },
    {
        name: "spotify-widget",
        scale: 8
    },
    {
        name: "reminder-widget",
        scale: 4
    },
    {
        name: "notes-widget",
        scale: 4
    },
    {
        name: 'gallery-widget',
        scale: 8
    },
    {
        name: 'map-widget',
        scale: 4
    },
    {
        name: 'crypto-widget',
        scale: 4
    }
];

/*──────────────────────────────────────────────────────────────────────────────
 * Lock Screen Widgets                                                         [EDIT]
 *──────────────────────────────────────────────────────────────────────────────
 * Define widgets displayed on the lock screen.
 * Each widget includes:
 *   • name  – widget id
 *   • scale – display scale factor
 */
Config.lockScreenWidgets = [
    { name: 'battery',  scale: 1 },
    { name: 'rain',     scale: 1 },
    { name: 'reminder', scale: 2 },
    { name: 'weazel',   scale: 2 },
    { name: 'weather',  scale: 2 },
]

/*──────────────────────────────────────────────────────────────────────────────
 * Job Theme Colors                                                            [EDIT]
 *──────────────────────────────────────────────────────────────────────────────
 * Set accent colors for state or job-based themes in UI components.
 */
Config.StateJobColors = new Map([
    ['default', '#7623c9'],
    ['police',  '#1e90ff'],
])

/*──────────────────────────────────────────────────────────────────────────────
 * UI Scaling                                                                  [EDIT]
 *──────────────────────────────────────────────────────────────────────────────
 * Adjust the global NUI scale for different resolutions or aspect ratios.
 */
Config.ScaleMultiplier = 0.65

/*──────────────────────────────────────────────────────────────────────────────
 * Anti-Injection & Exploit Protection                                          [ADV]
 *──────────────────────────────────────────────────────────────────────────────
 * Basic string filters for NUI input fields. Avoid removing items unless
 * you’re debugging a false positive.
 */
Config.ByPassSqlInjectionAndCheats = [
    'SELECT * FROM users WHERE username = ',
    'script',
    'alert',
    'prompt',
    'eval',
    'document',
    'window',
    'location',
    'location.href',
    'location.assign',
    'location.replace',
    'location.reload',
    'location.reload()'
]

/*──────────────────────────────────────────────────────────────────────────────
 * Wallpapers                                                                  [EDIT]
 *──────────────────────────────────────────────────────────────────────────────
 * Default wallpaper and available background list. 
 * Each entry key = file name, value = display name.
 */
Config.DefaultBackground = 'b2.jpg'

Config.Backgrounds = new Map([
    ['b1.jpg',  'Titanium white'],
    ['b2.jpg',  'Titanium gray'],
    ['b3.jpg',  'Titanium brown'],
    ['b4.jpg',  'Titanium black'],
    ['b5.jpg',  'Titanium Spacial'],
    ['b6.jpg',  'Titanium lila'],
    ['b7.jpg',  'Bubbles white'],
    ['b8.jpg',  'Bubbles blue'],
    ['b9.jpg',  'Bubbles lila'],
    ['b10.jpg', 'Bubbles pink'],
    ['b11.jpg', 'Bubbles green'],
    ['b12.jpg', 'Bubbles blur'],
    ['b13.jpg', 'Shock violet'],
    ['b14.jpg', 'Shock blue'],
    ['b15.jpg', 'Shock mix'],
    ['b16.jpg', 'Shock brown'],
    ['b17.jpg', 'Neon blue'],
    ['b18.jpg', 'Neon pink'],
    ['b19.jpg', 'Uniform violet'],
    ['b20.jpg', 'Uniform green'],
    ['b21.jpg', 'Uniform pink'],
    ['b22.jpg', 'Uniform red'],
    ['b23.jpg', 'Uniform blue'],
    ['b24.jpg', 'Uniform mixed'],
    ['b25.jpg', 'Planet orange'],
    ['b26.jpg', 'Planet light'],
])

/*──────────────────────────────────────────────────────────────────────────────
 * Dark Mode Applications                                                      [EDIT]
 *──────────────────────────────────────────────────────────────────────────────
 * Define which apps force dark theme rendering for better visibility.
 */
Config.DarkModeApplications = new Map([
    ['camera',         true],
    ['phone-call',     true],
    ['spotify',        true],
    ['calculator',     true],
    ['crypto',         true],
    ['weather',        true],
    ['clock',          true],
    ['garage',         true],
    ['jobcenter',      true],
    ['houses',         true],
    ['darkchat',       true],
    ['discord',        true],
    ['darkweb',        true],
    ['racing',         true],
    ['safari',         true],
    ['kingkongracing', true],
])

/*──────────────────────────────────────────────────────────────────────────────
 * Wi-Fi Required Applications                                                 [EDIT]
 *──────────────────────────────────────────────────────────────────────────────
 * Apps listed here will only function in Wi-Fi signal zones.
 */
Config.WorkWithWifiApps = new Map([
    ['settings', true],
    ['help',     true],
    ['notes',    true],
    ['camera',   true],
    ['gallery',  true],
    ['clock',    true],
    ['jump',     true],
    ['tetris',   true],
])

/*──────────────────────────────────────────────────────────────────────────────
 * Preloaded Videos                                                            [EDIT]
 *──────────────────────────────────────────────────────────────────────────────
 * Define default video URLs for embedded video apps.
 */
Config.VideosArray = [
    { 
        url: 'https://www.youtube.com/watch?v=3datr3PTN2A' 
    },
    { 
        url: 'https://www.youtube.com/watch?v=gHgv19ip-0c' 
    },
    {
        url: 'https://www.youtube.com/watch?v=CJnaPlgMn5c'
    },
    {
        url: 'https://www.youtube.com/watch?v=yUXJjIvhZz8'
    },
    {
        url: 'https://www.youtube.com/watch?v=tIxLU8WUK1Y'
    },
    {
        url: 'https://www.youtube.com/watch?v=b35RwruI8Vk'
    },
    {
        url: 'https://www.youtube.com/watch?v=Q9yn1DpZkHQ'
    },
    {
        url: 'https://www.youtube.com/watch?v=A-YlFaYVmBA'
    },
    {
        url: 'https://www.youtube.com/watch?v=Jm932Sqwf5E'
    },
    {
        url: 'https://www.youtube.com/watch?v=cUbri6sSgK4'
    },
    {
        url: 'https://www.youtube.com/watch?v=dh01eSOn9_E'
    },
    {
        url: 'https://www.youtube.com/watch?v=J0y6wM0aAgE'
    },
    {
        url: 'https://www.youtube.com/watch?v=TGRD0fJh1_Y'
    },
    {
        url: 'https://www.youtube.com/watch?v=JXq2TBAuL8o'
    },
    {
        url: 'https://www.youtube.com/watch?v=gM4xZy39kNE'
    },
    {
        url: 'https://www.youtube.com/watch?v=0fora21hSSU'
    },
    {
        url: 'https://www.youtube.com/watch?v=zcbOfVKSMkA'
    },
    {
        url: 'https://www.youtube.com/watch?v=fHhLUiRfpY4'
    },
    {
        url: 'https://www.youtube.com/watch?v=I5SkOMXLpi0'
    },
    {
        url: 'https://www.youtube.com/watch?v=KqTGdXfNmA8'
    },
];

/*──────────────────────────────────────────────────────────────────────────────
 * Spotify Default Playlists                                                   [EDIT]
 *──────────────────────────────────────────────────────────────────────────────
 * [INFO] Default categories and track lists displayed inside the Spotify app.
 *        Each playlist group includes:
 *          • name       – category title shown on UI
 *          • thumbnail  – category preview image
 *          • playlists  – list of playable tracks (URLs only)
 *
 * [TIP]  Keep the number of playlists moderate to optimize loading speed.
 *──────────────────────────────────────────────────────────────────────────────*/
Config.SpotifyDefaultPlaylists = [
    {
        name: 'Rock', // [EDIT] Category title
        thumbnail: 'https://www.photolari.com/wp-content/uploads/2019/12/foto-0-portada-nevermind-nirvana.jpg', // [EDIT] Category image
        playlists: [
            {
                url: 'https://www.youtube.com/watch?v=8SbUC-UaAxE', // [EDIT] Track or video URL
            },
            {
                url: 'https://www.youtube.com/watch?v=djV11Xbc914'
            },
            {
                url: 'https://www.youtube.com/watch?v=hTWKbfoikeg'
            },
            {
                url: "https://www.youtube.com/watch?v=1w7OgIMMRc4",
            },
            {
                url: "https://www.youtube.com/watch?v=9jK-NcRmVcw",
            },
            {
                url: "https://www.youtube.com/watch?v=OMOGaugKpzs",
            },
            {
                url: "https://www.youtube.com/watch?v=xwtdhWltSIg",
            },
            {
                url: "https://www.youtube.com/watch?v=btPJPFnesV4",
            },
            {
                url: "https://www.youtube.com/watch?v=zRIbf6JqkNc",
            },
            {
                url: "https://www.youtube.com/watch?v=Rbm6GXllBiw",
            },
            {
                url: "https://www.youtube.com/watch?v=ErvgV4P6Fzc",
            },
            {
                url: "https://www.youtube.com/watch?v=NMNgbISmF4I",
            },
            {
                url: "https://www.youtube.com/watch?v=qeMFqkcPYcg",
            },
            {
                url: "https://www.youtube.com/watch?v=UrIiLvg58SY",
            },
            {
                url: "https://www.youtube.com/watch?v=YR5ApYxkU-U",
            },
            {
                url: "https://www.youtube.com/watch?v=rY0WxgSXdEE",
            },
            {
                url: "https://www.youtube.com/watch?v=o1tj2zJ2Wvg",
            },
            {
                url: "https://www.youtube.com/watch?v=JkK8g6FMEXE",
            },
            {
                url: "https://www.youtube.com/watch?v=vabnZ9-ex7o",
            },
            {
                url: "https://www.youtube.com/watch?v=Qt2mbGP6vFI",
            },
            {
                url: "https://www.youtube.com/watch?v=xPU8OAjjS4k",
            },
            {
                url: "https://www.youtube.com/watch?v=S_E2EHVxNAE",
            },
            {
                url: "https://www.youtube.com/watch?v=qfNmyxV2Ncw",
            },
            {
                url: "https://www.youtube.com/watch?v=1Cw1ng75KP0",
            },
            {
                url: "https://www.youtube.com/watch?v=-oqAU5VxFWs",
            },
            {
                url: "https://www.youtube.com/watch?v=etAIpkdhU9Q",
            },
            {
                url: "https://www.youtube.com/watch?v=Lo2qQmj0_h4",
            },
            {
                url: "https://www.youtube.com/watch?v=zSmOvYzSeaQ",
            },
            {
                url: "https://www.youtube.com/watch?v=loWXMtjUZWM",
            },
            {
                url: "https://www.youtube.com/watch?v=a01QQZyl-_I&",
            },
            {
                url: "https://www.youtube.com/watch?v=3wxyN3z9PL4",
            },
            {
                url: "https://www.youtube.com/watch?v=l482T0yNkeo",
            },
            {
                url: "https://www.youtube.com/watch?v=dpmAY059TTY",
            },
            {
                url: "https://www.youtube.com/watch?v=KmWE9UBFwtY",
            },
            {
                url: "https://www.youtube.com/watch?v=NRtvqT_wMeY",
            },
            {
                url: "https://www.youtube.com/watch?v=yRYFKcMa_Ek",
            },
            {
                url: "https://www.youtube.com/watch?v=YgSPaXgAdzE",
            },
            {
                url: "https://www.youtube.com/watch?v=CBTOGVb_cQg",
            }
        ]
    },
    {
        name: 'Jazz',
        thumbnail: 'https://i.discogs.com/YAjlquecpjcTyB32Ps8tocCak_Mbw8XGdpZDFWi_LTQ/rs:fit/g:sm/q:90/h:595/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTQzOTQ4/OC0xMjI2MTYxODEz/LmpwZWc.jpeg',
        playlists: [
            {
                url: "https://www.youtube.com/watch?v=71Gt46aX9Z4",
            },
            {
                url: 'https://www.youtube.com/watch?v=bb1SrngIufQ'
            },
            {
                url: 'https://www.youtube.com/watch?v=H77fRz1rybs'
            },
            {
                url: 'https://www.youtube.com/watch?v=ioOzsi9aHQQ'
            },
            {
                url: 'https://www.youtube.com/watch?v=9Pes54J8PVw'
            },
            {
                url: 'https://www.youtube.com/watch?v=SgXSomPE_FY'
            },
            {
                url: 'https://www.youtube.com/watch?v=GzmS4p3jXvs'
            },
            {
                url: 'https://www.youtube.com/watch?v=0G383538qzQ'
            },
            {
                url: 'https://www.youtube.com/watch?v=zq7hltwb_yc'
            },
            {
                url: 'https://www.youtube.com/watch?v=ZVLEYerz5rc'
            },
            {
                url: 'https://www.youtube.com/watch?v=PsgAHFviYcY'
            },
            {
                url: 'https://www.youtube.com/watch?v=cEXhZ8PwM-Y'
            },
            {
                url: 'https://www.youtube.com/watch?v=WcF8Aos4XDA'
            },
            {
                url: 'https://www.youtube.com/watch?v=5ODL5_djyBI'
            },
            {
                url: 'https://www.youtube.com/watch?v=TTfVNYJxXw8'
            },
            {
                url: 'https://www.youtube.com/watch?v=bSfqNEvykv0'
            },
            {
                url: 'https://www.youtube.com/watch?v=5lrSdW8p4u4'
            },
            {
                url: 'https://www.youtube.com/watch?v=bqQKE4kkrUc'
            },
            {
                url: 'https://www.youtube.com/watch?v=S5NPriAa8so'
            },
            {
                url: 'https://www.youtube.com/watch?v=UiHmeHZAc0s'
            },
            {
                url: 'https://www.youtube.com/watch?v=gUm_VC3vBt4'
            },
            {
                url: 'https://www.youtube.com/watch?v=2A6hG6Xg6zQ'
            },
            {
                url: 'https://www.youtube.com/watch?v=-aRnzKDiIS0'
            },
            {
                url: 'https://www.youtube.com/watch?v=N-KluFB9A8M'
            },
            {
                url: 'https://www.youtube.com/watch?v=4zAThXFOy2c'
            },
            {
                url: 'https://www.youtube.com/watch?v=hC8CH0Z3L54'
            },
            {
                url: 'https://www.youtube.com/watch?v=O_5oXqvxaAk'
            },
            {
                url: 'https://www.youtube.com/watch?v=QcJ2eb3ojPM'
            },
            {
                url: 'https://www.youtube.com/watch?v=rB6OlJqV1rQ'
            },
            {
                url: 'https://www.youtube.com/watch?v=rnQzXv-bbkY'
            },
            {
                url: 'https://www.youtube.com/watch?v=QuHQfC01SKo'
            },
            {
                url: 'https://www.youtube.com/watch?v=UjZzaTo-MYI'
            }
        ]
    },
    {
        name: 'Chill',
        thumbnail: 'https://d1csarkz8obe9u.cloudfront.net/posterpreviews/summer-chillout-cd-cover-artwork-template-design-47093542f55e5139ea7173d1c2261c92_screen.jpg?ts=1589615245',
        playlists: [
            {
                url: "https://www.youtube.com/watch?v=JdqL89ZZwFw",
            },
            {
                url: 'https://www.youtube.com/watch?v=lTRiuFIWV54'
            },
            {
                url: 'https://www.youtube.com/watch?v=9FvvbVI5rYA'
            },
            {
                url: 'https://www.youtube.com/watch?v=xocnshwEbrM'
            },
            {
                url: 'https://www.youtube.com/watch?v=ROy57arUE1s'
            },
            {
                url: 'https://www.youtube.com/watch?v=QZTDZFtbrec'
            },
            {
                url: 'https://www.youtube.com/watch?v=6H-PLF2CR18'
            },
            {
                url: 'https://www.youtube.com/watch?v=LsWACxHMWBI'
            },
            {
                url: 'https://www.youtube.com/watch?v=c3suauAz0zQ'
            },
            {
                url: 'https://www.youtube.com/watch?v=c3jb-47ikqY'
            },
            {
                url: 'https://www.youtube.com/watch?v=lf6refTxQs8'
            },
            {
                url: 'https://www.youtube.com/watch?v=liHgt4CbodY'
            },
            {
                url: 'https://www.youtube.com/watch?v=YpGjaJ1ettI'
            },
            {
                url: 'https://www.youtube.com/watch?v=dTuLMnX3Vlw'
            },
            {
                url: 'https://www.youtube.com/watch?v=90QqkQNzMFk'
            },
            {
                url: 'https://www.youtube.com/watch?v=bz5q5gl2uZA'
            },
            {
                url: 'https://www.youtube.com/watch?v=FjHGZj2IjBk'
            },
            {
                url: 'https://www.youtube.com/watch?v=bP9gMpl1gyQ'
            },
            {
                url: 'https://www.youtube.com/watch?v=1fueZCTYkpA'
            },
            {
                url: 'https://www.youtube.com/watch?v=q9p0S7hGcrI'
            },
            {
                url: 'https://www.youtube.com/watch?v=PtIKsk1Qabw'
            },
            {
                url: 'https://www.youtube.com/watch?v=CfPxlb8-ZQ0'
            },
            {
                url: 'https://www.youtube.com/watch?v=r0sjCawEOKk'
            },
            {
                url: 'https://www.youtube.com/watch?v=TGan48YE9Us'
            },
            {
                url: 'https://www.youtube.com/watch?v=4mkNvBWdqFk'
            },
            {
                url: 'https://www.youtube.com/watch?v=TWTV4T3yxzs'
            },
            {
                url: 'https://www.youtube.com/watch?v=spRerxsOLXk'
            },
            {
                url: 'https://www.youtube.com/watch?v=1w9kNO4eq9U'
            },
            {
                url: 'https://www.youtube.com/watch?v=lbpCmN1IqGk'
            },
            {
                url: 'https://www.youtube.com/watch?v=5mv1T3bjq_g'
            },
            {
                url: 'https://www.youtube.com/watch?v=QKUNo8MOzQA'
            },
            {
                url: 'https://www.youtube.com/watch?v=RtWgbht6qe8'
            },
            {
                url: 'https://www.youtube.com/watch?v=2LMiz9NTzVs'
            },
            {
                url: 'https://www.youtube.com/watch?v=UliRWJE0CaI'
            },
            {
                url: 'https://www.youtube.com/watch?v=LhSKG9EeFg8'
            },
            {
                url: 'https://www.youtube.com/watch?v=NJuSStkIZBg'
            }
        ]
    },
    {
        name: 'Electronic / Dance',
        thumbnail: 'https://d2n9ha3hrkss16.cloudfront.net/uploads/stage/stage_image/62032/optimized_large_thumb_stage.jpg',
        playlists: [
            {
                url: 'https://www.youtube.com/watch?v=k3DBmAlUh1A'
            },
            {
                url: 'https://www.youtube.com/watch?v=3pL08H3WFrM'
            },
            {
                url: 'https://www.youtube.com/watch?v=EfWmWlW2PvM'
            },
            {
                url: 'https://www.youtube.com/watch?v=3ztSQh7jh_Q'
            },
            {
                url: 'https://www.youtube.com/watch?v=BtU2xhK5PZo'
            },
            {
                url: 'https://www.youtube.com/watch?v=ssKWFlclNFg'
            },
            {
                url: 'https://www.youtube.com/watch?v=IIUTf007y_w'
            },
            {
                url: 'https://www.youtube.com/watch?v=961v0E3b01g'
            },
            {
                url: 'https://www.youtube.com/watch?v=HvvECHLHKrM'
            },
            {
                url: 'https://www.youtube.com/watch?v=Q22MCFC0CP0'
            },
            {
                url: 'https://www.youtube.com/watch?v=0OKqK8Fr72k'
            },
            {
                url: 'https://www.youtube.com/watch?v=90RLzVUuXe4'
            },
            {
                url: 'https://www.youtube.com/watch?v=S83AQhEWmPY'
            },
            {
                url: 'https://www.youtube.com/watch?v=xkejbXejA-0'
            },
            {
                url: 'https://www.youtube.com/watch?v=BX0lKSa_PTk'
            },
            {
                url: 'https://www.youtube.com/watch?v=ELXuZBD6D_g'
            },
            {
                url: 'https://www.youtube.com/watch?v=T-jNkwesjpk'
            },
            {
                url: 'https://www.youtube.com/watch?v=EXIWlRrkjKE'
            },
            {
                url: 'https://www.youtube.com/watch?v=w8mBplMtwJ8'
            },
            {
                url: 'https://www.youtube.com/watch?v=vdzHlbFItlw'
            },
            {
                url: 'https://www.youtube.com/watch?v=l4UkYBr1NnA'
            },
            {
                url: 'https://www.youtube.com/watch?v=iqVLISbFZPc'
            },
            {
                url: 'https://www.youtube.com/watch?v=1VcFFvqQV8g'
            },
            {
                url: 'https://www.youtube.com/watch?v=MveDLwDIZiI'
            },
            {
                url: 'https://www.youtube.com/watch?v=R4kRgIkpTxQ'
            },
            {
                url: 'https://www.youtube.com/watch?v=Rvc7ZsurcSY'
            },
            {
                url: 'https://www.youtube.com/watch?v=TfbK_sCRapM'
            },
            {
                url: 'https://www.youtube.com/watch?v=r0bhF7SJLYQ'
            },
            {
                url: 'https://www.youtube.com/watch?v=e7HBypw4lhY'
            },
            {
                url: 'https://www.youtube.com/watch?v=PoP2Sa7wYNQ'
            },
            {
                url: 'https://www.youtube.com/watch?v=NkrkAsRVLEA'
            },
            {
                url: 'https://www.youtube.com/watch?v=1_4ELAxKrDc'
            }
        ]
    },
    {
        name: 'Metal',
        thumbnail: 'https://cdn.pixabay.com/photo/2023/08/29/21/16/ai-generated-8222174_640.jpg',
        playlists: [
            {
                url: 'https://www.youtube.com/watch?v=l9VFg44H2z8'
            },
            {
                url: 'https://www.youtube.com/watch?v=AkFqg5wAuFk'
            },
            {
                url: 'https://www.youtube.com/watch?v=CSvFpBOe8eY'
            },
            {
                url: 'https://www.youtube.com/watch?v=6fVE8kSM43I'
            },
            {
                url: 'https://www.youtube.com/watch?v=DelhLppPSxY'
            },
            {
                url: 'https://www.youtube.com/watch?v=CD-E-LDc384'
            },
            {
                url: 'https://www.youtube.com/watch?v=HCBPmxiVMKk'
            },
            {
                url: 'https://www.youtube.com/watch?v=X4bgXH3sJ2Q'
            },
            {
                url: 'https://www.youtube.com/watch?v=3nb7DD7vdQ0'
            },
            {
                url: 'https://www.youtube.com/watch?v=W3q8Od5qJio'
            },
            {
                url: 'https://www.youtube.com/watch?v=iywaBOMvYLI'
            },
            {
                url: 'https://www.youtube.com/watch?v=Nco_kh8xJDs'
            },
            {
                url: 'https://www.youtube.com/watch?v=F_6IjeprfEs'
            },
            {
                url: 'https://www.youtube.com/watch?v=94bGzWyHbu0'
            },
            {
                url: 'https://www.youtube.com/watch?v=jRGrNDV2mKc'
            },
            {
                url: 'https://www.youtube.com/watch?v=RFc-2aNZ6VY'
            },
            {
                url: 'https://www.youtube.com/watch?v=UNEDa3Hqnic'
            },
            {
                url: 'https://www.youtube.com/watch?v=JiDnB-CrrNs'
            },
            {
                url: 'https://www.youtube.com/watch?v=6rL4em-Xv5o'
            },
            {
                url: 'https://www.youtube.com/watch?v=Ps0MfBG5-Uo'
            },
            {
                url: 'https://www.youtube.com/watch?v=5ItHNdrPEh0'
            },
            {
                url: 'https://www.youtube.com/watch?v=GurkREc-q4I'
            },
            {
                url: 'https://www.youtube.com/watch?v=IHS3qJdxefY'
            },
            {
                url: 'https://www.youtube.com/watch?v=FNdC_3LR2AI'
            },
            {
                url: 'https://www.youtube.com/watch?v=uhBHL3v4d3I'
            },
            {
                url: 'https://www.youtube.com/watch?v=qw2LU1yS7aw'
            },
            {
                url: 'https://www.youtube.com/watch?v=Fwr1Z7uyXz4'
            },
            {
                url: 'https://www.youtube.com/watch?v=yPNFVj-pISU'
            },
            {
                url: 'https://www.youtube.com/watch?v=-0Ao4t_fe0I'
            },
            {
                url: 'https://www.youtube.com/watch?v=iPW9AbRMwFU'
            },
            {
                url: 'https://www.youtube.com/watch?v=XOzs1FehYOA'
            },
            {
                url: 'https://www.youtube.com/watch?v=viD6JMRGbbM'
            },
            {
                url: 'https://www.youtube.com/watch?v=2s3iGpDqQpQ'
            },
            {
                url: 'https://www.youtube.com/watch?v=labytsb3gfI'
            },
            {
                url: 'https://www.youtube.com/watch?v=vfpgpf6QVnI'
            }
        ]
    },
    {
        name: 'Hip Hop',
        thumbnail: 'https://d1csarkz8obe9u.cloudfront.net/posterpreviews/hip-hop-modern-album-cover-video-design-template-feff1ee7028b6c491f3382b8b8932c11_screen.jpg?ts=1649518691',
        playlists: [
            {
                url: 'https://www.youtube.com/watch?v=-jEShhcnxIM'
            },
            {
                url: 'https://www.youtube.com/watch?v=hpK16l6fDsg'
            },
            {
                url: 'https://www.youtube.com/watch?v=NSCZ5awmH1U'
            },
            {
                url: 'https://www.youtube.com/watch?v=Xrk6JQNqM0g'
            },
            {
                url: 'https://www.youtube.com/watch?v=kC8YEw9h2-Q'
            },
            {
                url: 'https://www.youtube.com/watch?v=9dosj6p1DqY'
            },
            {
                url: 'https://www.youtube.com/watch?v=LuKm4L9ryB0'
            },
            {
                url: 'https://www.youtube.com/watch?v=IAJnDmMN5VU'
            },
            {
                url: 'https://www.youtube.com/watch?v=a90gzeTH9MI'
            },
            {
                url: 'https://www.youtube.com/watch?v=a90gzeTH9MI'
            },
            {
                url: 'https://www.youtube.com/watch?v=EgPaU9EBpls'
            },
            {
                url: 'https://www.youtube.com/watch?v=JCf7jrglH6A'
            },
            {
                url: 'https://www.youtube.com/watch?v=m4_9TFeMfJE'
            },
            {
                url: 'https://www.youtube.com/watch?v=tGTKY1dpo_E'
            },
            {
                url: 'https://www.youtube.com/watch?v=GHVDVz5Kcqg'
            },
            {
                url: 'https://www.youtube.com/watch?v=yedPuhzfVGE'
            },
            {
                url: 'https://www.youtube.com/watch?v=_yBh_I5BLRM'
            },
            {
                url: 'https://www.youtube.com/watch?v=Z4N8lzKNfy4'
            },
            {
                url: 'https://www.youtube.com/watch?v=IyDnzuFf9xk'
            },
            {
                url: 'https://www.youtube.com/watch?v=DbjDJLcNvdU'
            },
            {
                url: 'https://www.youtube.com/watch?v=l21wGxlWwPw'
            },
            {
                url: 'https://www.youtube.com/watch?v=t-ibVnD9A7I'
            },
            {
                url: 'https://www.youtube.com/watch?v=CUj2AWEJnwQ'
            },
            {
                url: 'https://www.youtube.com/watch?v=pDFHyA7KgDw'
            },
            {
                url: 'https://www.youtube.com/watch?v=n7rE-Wlo5wg'
            },
            {
                url: 'https://www.youtube.com/watch?v=fUYKSIWKbEQ'
            },
            {
                url: 'https://www.youtube.com/watch?v=vq4hRDnGbDY'
            },
            {
                url: 'https://www.youtube.com/watch?v=UqmUxkRPBS0'
            },
            {
                url: 'https://www.youtube.com/watch?v=_f0ftiBSvRs'
            },
            {
                url: 'https://www.youtube.com/watch?v=pjXdDjUWkjk'
            },
            {
                url: 'https://www.youtube.com/watch?v=qwtyEKTGGQ8'
            },
            {
                url: 'https://www.youtube.com/watch?v=6gUiQ8CqLcY'
            },
            {
                url: 'https://www.youtube.com/watch?v=zLC-7Il-uYg'
            },
            {
                url: 'https://www.youtube.com/watch?v=pSY3i5XHHXo'
            },
            {
                url: 'https://www.youtube.com/watch?v=MtV0aeGEEYk'
            },
            {
                url: 'https://www.youtube.com/watch?v=K0hDSlWGhTE'
            }
        ]
    }
];

/*──────────────────────────────────────────────────────────────────────────────
 * RenderPinnedChatRooms                                                       [CORE]
 *──────────────────────────────────────────────────────────────────────────────
 * [INFO] Renders all pinned chat rooms dynamically into the UI.
 *        This function loops through every room object received and generates
 *        an interactive element inside the #pinned-rooms-list container.
 *
 * [PARAMS]
 *   • PinnedChatRooms – Object containing all pinned rooms with their data.
 *
 * [NOTES]
 *   - Ignores masked rooms (Room.is_masked = true).
 *   - Adds custom icons based on the room name.
 *   - Extensible: Add more "case" blocks for additional custom rooms.
 *──────────────────────────────────────────────────────────────────────────────*/
RenderPinnedChatRooms = (PinnedChatRooms) => {
    let container = $("#pinned-rooms-list");

    if (!$.isEmptyObject(PinnedChatRooms)) {
        $.each(PinnedChatRooms, function (i, Room) {
            if (!Room.is_masked) {
                let icon = ""; // [ADV] Default empty icon placeholder

                switch (Room.room_name) {
                    case "Events":
                        icon = '<i class="far fa-calendar-alt"></i>'; // [INFO] Events icon
                        break;
                    case "411":
                        icon = '<i class="fas fa-hands-helping"></i>'; // [INFO] Help/Support icon
                        break;
                    case "The Lounge":
                        icon = '<i class="fas fa-couch"></i>'; // [INFO] Lounge icon
                        break;
                    default:
                        icon = '<i class="fas fa-comments"></i>'; // [EDIT] Default fallback icon
                        break;
                }

                let element = `
                    <div class="pinned-chat-listing" data-roomID="${Room.id}">
                        <div class="pinned-chat-name">${Room.room_name}</div>
                        <div class="pinned-chat-icon">${icon}</div>
                    </div>
                `;

                container.append(element);
            }
        });
    }
};
qs-smartphone-pro/config/config.lua
--──────────────────────────────────────────────────────────────────────────────
--  Quasar Store · Configuration Guidelines
--──────────────────────────────────────────────────────────────────────────────
--  This configuration file defines all adjustable parameters for the script.
--  Comments are standardized to help you identify which sections you can safely edit.
--
--  • [EDIT] – Safe for users to modify. Adjust these values as needed.
--  • [INFO] – Informational note describing what the variable or block does.
--  • [ADV]  – Advanced settings. Change only if you understand the logic behind it.
--  • [CORE] – Core functionality. Do not modify unless you are a developer.
--  • [AUTO] – Automatically handled by the system. Never edit manually.
--
--  Always make a backup before editing configuration files.
--  Incorrect changes in [CORE] or [AUTO] sections can break the resource.
--──────────────────────────────────────────────────────────────────────────────

PHONE_PATH = 'https://cfx-nui-qs-smartphone-pro/' -- [CORE] Absolute NUI path to phone assets (HTML/JS/CSS). Do not modify.

Config  = Config or {} -- [CORE] Main configuration table (preserved across imports).
Locales = Locales or {} -- [CORE] Multilanguage container; populated by the selected locale file.

--──────────────────────────────────────────────────────────────────────────────
-- Language Selection                                                          [EDIT]
-- [INFO] Pick the primary language loaded from locales/*. Add your own file if missing.
-- [INFO] Available: 'ar','bg','ca','cs','da','de','el','en','es','fr','he','hu','it','ja','ko',
--                  'nl','no','pl','pt','ro','ru','sl','sv','tr','zh-CN','zh-TW'
--──────────────────────────────────────────────────────────────────────────────
Config.Language = 'en' -- [EDIT] Two-letter (or zh-*) code of the language to load.

--──────────────────────────────────────────────────────────────────────────────
-- Fetch Limits                                                                [EDIT]
-- [INFO] Max items requested from server (posts, messages…). Higher = more SQL load.
-- [INFO] UI uses virtualization for Instagram/Messages; others will be added later.
--──────────────────────────────────────────────────────────────────────────────
Config.FetchLimit = 200 -- [EDIT] Safe range: 100–500 depending on DB performance.

--──────────────────────────────────────────────────────────────────────────────
-- Framework & Dependency Autodetection                                        [AUTO]
-- [INFO] Detects running framework/billing/inventory/housing by resource name.
-- [ADV]  If you’ve renamed resources, add your mapping below instead of editing core code.
--──────────────────────────────────────────────────────────────────────────────

---[CORE] Generic detector: returns mapped alias of the first dependency found.
---@param data table<string,string> -- resourceName -> alias
---@return string|false
local function dependencyCheck(data)
    for k, v in pairs(data) do
        if GetResourceState(k) == 'started' then
            return v
        end
    end
    return false
end

-- Frameworks -----------------------------------------------------------------
local frameworks = {                 -- [CORE] resourceName -> internal alias
    ['es_extended'] = 'esx',
    ['qbx-core']    = 'qb',
    ['qb-core']     = 'qb',
    ['l2s-core']    = 'qb'
}
Config.Framework = dependencyCheck(frameworks) or 'standalone' -- [AUTO]

-- Billing Systems -------------------------------------------------------------
local billing = {                    -- [CORE]
    ['qs-billing']      = 'qs',
    ['okokBilling']     = 'okok',
    ['esx_billing']     = 'esx_billing',
    ['codem-billingv2'] = 'codemv2',
    ['RxBilling']       = 'RxBilling'
}
Config.Billing = dependencyCheck(billing) or 'standalone' -- [AUTO]

-- Inventories (metadata support) ---------------------------------------------
-- [INFO] Non-metadata inventories force UniquePhone off (item won’t carry phone data).
local inventories = {               -- [CORE]
    ['qs-inventory']      = 'qs-inventory',
    ['qb-inventory']      = 'qb-inventory',
    ['l2s-inventory']     = 'qb-inventory',
    ['origen_inventory']  = 'origen_inventory',
    ['ps-inventory']      = 'ps-inventory',
    ['ox_inventory']      = 'ox_inventory',
    ['core_inventory']    = 'core_inventory',
    ['codem-inventory']   = 'codem-inventory',
    ['tgiann-inventory']  = 'tgiann-inventory',
    ['ak47_inventory']    = 'ak47_inventory',
    ['ak47_qb_inventory'] = 'ak47_qb_inventory'
}
Config.Inventory   = dependencyCheck(inventories) or 'default'                                 -- [AUTO]
Config.Inventory   = Config.Framework == 'standalone' and 'default' or Config.Inventory        -- [AUTO]
Config.UniquePhone = (Config.Inventory ~= 'default') and (Config.Framework ~= 'standalone')    -- [AUTO]
Config.SoundAsset  = 'demo'  -- [EDIT] Interact-sound asset bank. Use string name or false to disable.

-- Housing (integration hints) -------------------------------------------------
local houses = {                     -- [CORE]
    ['qs-housing'] = 'qs-housing',
    ['qb-houses']  = 'qb-houses'
}
Config.Houses = dependencyCheck(houses) or 'default' -- [AUTO]

--──────────────────────────────────────────────────────────────────────────────
-- Phone Access & Ownership                                                    [EDIT]
-- [INFO] Control how the phone is opened and whether only the owner can open via keybind.
--──────────────────────────────────────────────────────────────────────────────
Config.OpenPhoneByPress       = true -- [EDIT] true: enable RegisterKeyMapping to open.
Config.KeyOpenOnlyOwnedPhone  = true -- [EDIT] true: F1 only opens if you own the item/metadata.

--──────────────────────────────────────────────────────────────────────────────
-- Default Item Metadata                                                        [EDIT]
-- [INFO] Per-phone default flags saved to item metadata (if metadata inventory is used).
--──────────────────────────────────────────────────────────────────────────────
Config.DefaultMetaData = {
    blur_disabled = true, -- [EDIT] true: less visual blur (better for low-end PCs).
    lockscreen    = true  -- [EDIT] true: enable lockscreen by default for new phones.
}

--──────────────────────────────────────────────────────────────────────────────
-- Numbering & Mail                                                             [EDIT]
-- [INFO] Phone number composition and default mail domain.
--──────────────────────────────────────────────────────────────────────────────
Config.Prefix       = '376'             -- [EDIT] Number prefix (string).
Config.NumberDigits = 6                 -- [EDIT] Digits after prefix (int).
Config.MailDomain   = '@qcloud.com'     -- [EDIT] Default email domain suffix.

--──────────────────────────────────────────────────────────────────────────────
-- Auto Backup                                                                  [EDIT]
-- [INFO] If enabled, backs up phone data automatically when the device is turned off.
--──────────────────────────────────────────────────────────────────────────────
Config.AutoBackup = false -- [EDIT] true | false

--──────────────────────────────────────────────────────────────────────────────
-- UI Menus & Targeting                                                         [EDIT]
-- [INFO] Choose context menu provider and targeting system usage.
--──────────────────────────────────────────────────────────────────────────────
Config.Menu      = 'ox_lib' -- [EDIT] 'ox_lib' | 'nh-context'
Config.UseTarget = false    -- [EDIT] true to use ox_target/qb-target when available.

-- Keybind (RegisterKeyMapping) -----------------------------------------------
-- [INFO] Key used to open the phone from keyboard/controller.
Config.OpenPhone = 'F1' -- [EDIT] Must match a valid FiveM key mapping string.

--──────────────────────────────────────────────────────────────────────────────
-- Voice System Selection                                                       [EDIT]
-- [INFO] Pick your in-server voice solution. Custom adapters live in client/server/custom/voice.
--──────────────────────────────────────────────────────────────────────────────
Config.Voice        = 'pma'   -- [EDIT] Options: 'pma' | 'mumble' | 'toko' | 'salty'
Config.RepeatTimeout = 2000   -- [ADV]  Min ms between repeated actions to avoid spam.
Config.CallRepeats    = 999999 -- [ADV]  Max ring repeats before auto-stop.

--──────────────────────────────────────────────────────────────────────────────
-- Ringtones                                                                    [EDIT]
-- [INFO] Default ringtone and list. Add as many as you want (ensure copyright safety).
--──────────────────────────────────────────────────────────────────────────────
local ringtone_path = PHONE_PATH .. '/html/sounds/ringtones/' -- [CORE]
Config.Ringtones = {                          -- [EDIT]
    defaultRingtone = ringtone_path .. 'default.mp3',
    ringtones = {
        { url = ringtone_path .. 'default.mp3',   name = 'Pear' },
        { url = ringtone_path .. 'classic.mp3',   name = 'Classic' },
        { url = ringtone_path .. 'XianNomi.mp3',  name = 'XianNomi' },
        { url = ringtone_path .. 'yourphone.mp3', name = 'Your Phone Linging' },
        { url = ringtone_path .. 'osito.mp3',     name = 'Osito Gominola' },
        { url = ringtone_path .. 'faded.mp3',     name = 'Faded' },
        { url = ringtone_path .. 'missyou.mp3',   name = 'Miss You' },
        { url = ringtone_path .. 'brainrot.mp3',  name = 'Brainrot' },
        { url = ringtone_path .. 'lifegoes.mp3',  name = 'Life Goes On' }
    }
}

--──────────────────────────────────────────────────────────────────────────────
-- Audio Backend Integration                                                    [AUTO]
-- [INFO] Works out of the box with xsound. If 'mx-surround' is running, 3D panner is used.
--──────────────────────────────────────────────────────────────────────────────
Config.MXSurround = GetResourceState('mx-surround') == 'started' -- [AUTO]
Config.MXSurroundPanner = {        -- [ADV] Custom 3D panner (mx-surround only).
    panningModel  = 'HRTF',        -- [INFO] Spatialization model.
    refDistance   = 1.5,           -- [INFO] Start distance for volume falloff.
    rolloffFactor = 3.0,           -- [INFO] Falloff curve intensity (avoid 0.1).
    distanceModel = 'exponential', -- [INFO] 'linear' | 'inverse' | 'exponential'
}

--──────────────────────────────────────────────────────────────────────────────
-- Phone Catalog (Styles, Wallpapers, Props)                                    [EDIT]
-- [INFO] Visual CSS presets, default wallpapers and world props for each model.
--──────────────────────────────────────────────────────────────────────────────
Config.Phones = {                   -- [EDIT] CSS shadow + button gradient per model.
    ['phone'] = {
        phone   = 'rgb(57, 51, 77) 0px 0px 0.1em 0.25em, rgb(211, 205, 228) 0px 0px 0px 0.4em',
        buttons = 'linear-gradient(90deg, #fff, #2a2a35)'
    },
    ['white_phone'] = {
        phone   = 'rgb(202, 201, 207) 0px 0px 0.1em 0.25em, rgb(128, 127, 131) 0px 0px 0px 0.4em',
        buttons = 'linear-gradient(90deg, #fff, #2a2a35)'
    },
    ['yellow_phone'] = {
        phone   = 'rgb(202, 199, 166) 0px 0px 0.1em 0.25em, rgb(114, 107, 97) 0px 0px 0px 0.4em',
        buttons = 'linear-gradient(90deg, #fff, #2a2a35)'
    },
    ['red_phone'] = {
        phone   = 'rgb(194, 84, 84) 0px 0px 0.1em 0.25em, rgb(87, 31, 31) 0px 0px 0px 0.4em',
        buttons = 'linear-gradient(90deg, #fff, #b14040)'
    },
    ['green_phone'] = {
        phone   = 'rgb(73, 129, 70) 0px 0px 0.1em 0.25em, rgb(40, 90, 39) 0px 0px 0px 0.4em',
        buttons = 'linear-gradient(90deg, #d5f1cc, #57a865)'
    },
    ['black_phone'] = {
        phone   = 'rgb(82, 82, 82) 0px 0px 0.1em 0.25em, rgb(51, 51, 51) 0px 0px 0px 0.4em',
        buttons = 'linear-gradient(90deg, #747474, #424242)'
    },
}

Config.PhonesCustomWallpaper = {    -- [EDIT] Default wallpaper file per model (html/assets/img/wallpapers).
    ['phone']       = 'b2.jpg',
    ['white_phone'] = 'b1.jpg',
    ['yellow_phone'] = 'b3.jpg',
    ['red_phone']   = 'b4.jpg',
    ['green_phone'] = 'b6.jpg',
    ['black_phone'] = 'b5.jpg',
}

Config.PhonesProps = {              -- [EDIT] World prop model hashes for each phone.
    ['phone']        = `ks_qsphone_01`,
    ['white_phone']  = `ks_qsphone_02`,
    ['yellow_phone'] = `ks_qsphone_03`,
    ['red_phone']    = `ks_qsphone_04`,
    ['green_phone']  = `ks_qsphone_05`,
    ['black_phone']  = `ks_qsphone_06`,
}

--──────────────────────────────────────────────────────────────────────────────
-- Signal Blackout Zones (Low/No Coverage)                                     [EDIT]
-- [INFO] Areas that simulate weak cell signal using ox_lib zones. Inside these
--        zones, specific apps (configured in UI config.js → Config.WorkWithWifiApps)
--        require Wi-Fi or are blocked. Tweak boxes to match your map/MLOs.
-- [ADV]  Each entry is a box zone: center coords, XYZ size, rotation (degrees),
--        and a friendly name for debugging/logs. Names need not be unique but it helps.
--──────────────────────────────────────────────────────────────────────────────
Config.Mountains = {
    { -- Chiliad Ridge
        coords   = vec3(1849.0, 362.0, 113.0),  -- [EDIT] Box center
        size     = vec3(1081.0, 1994.0, 2023.0),-- [EDIT] Box size (X/Y/Z)
        rotation = 0.0,                         -- [EDIT] Heading rotation of the box
        name     = 'Mount Chiliad 1',           -- [EDIT] Debug label
    },
    { -- East Chiliad Cliffs
        coords   = vec3(1954.219727, -1600.285767, 380.278320),
        size     = vec3(581.0, 1394.0, 2023.0),
        rotation = 0.0,
        name     = 'Mount Chiliad 2',
    },
    { -- Raton Canyon Peaks
        coords   = vec3(747.758240, 1232.281372, 512.465088),
        size     = vec3(900.0, 900.0, 2023.0),
        rotation = 0.0,
        name     = 'Mount Chiliad 3',
    },
    { -- Banham Highlands
        coords   = vec3(-890.030762, 1260.052734, 490.257080),
        size     = vec3(1900.0, 700.0, 2023.0),
        rotation = 0.0,
        name     = 'Mount Chiliad 4',
    },
    { -- Zancudo Ridge
        coords   = vec3(-697.740662, 2372.030762, 340.428589),
        size     = vec3(1500.0, 1520.0, 2023.0),
        rotation = 0.0,
        name     = 'Mount Chiliad 5',
    },
    { -- Tongva Wilderness West
        coords   = vec3(-2601.098877, 1386.118652, 340.428589),
        size     = vec3(800.0, 2520.0, 2023.0),
        rotation = 0.0,
        name     = 'Mount Chiliad 6',
    },
    { -- Procopio Foothills
        coords   = vec3(-960.778015, 4467.547363, 560.807373),
        size     = vec3(1800.0, 2300.0, 2023.0),
        rotation = 0.0,
        name     = 'Mount Chiliad 7',
    },
    { -- North San Chianski
        coords   = vec3(758.518677, 5517.468262, 856.268799),
        size     = vec3(1800.0, 1800.0, 2023.0),
        rotation = 0.0,
        name     = 'Mount Chiliad 8',
    },
    { -- Cape Catfish Ridge
        coords   = vec3(3204.184570, 4860.448242, 504.562744),
        size     = vec3(700.0, 4000.0, 2023.0),
        rotation = 15.0,
        name     = 'Mount Chiliad 9',
    },
    { -- Alamo Sea East
        coords   = vec3(1560.158203, 3230.914307, 181.113525),
        size     = vec3(2500.0, 500.0, 2023.0),
        rotation = 20.0,
        name     = 'Mount Chiliad 10',
    }
}

--──────────────────────────────────────────────────────────────────────────────
-- Battery & Charging System                                                    [EDIT]
-- [INFO] Global battery drain/charge behavior. Each app may consume extra
--        battery while in foreground. Players can recharge via powerbanks
--        (item: 'powerbank') or world charge points. qs-housing chargers supported.
--──────────────────────────────────────────────────────────────────────────────

-- Powerbank behavior ----------------------------------------------------------
Config.PowerbankSpeed   = 1.0   -- [EDIT] Charge units gained every 3 seconds while using a powerbank (e.g., 1.0 = +1/3s).
Config.HousingChargers  = false -- [EDIT] true: enable wall/room chargers integrated with qs-housing.
Config.ReturnPowerbank  = false -- [EDIT] true: return the 'powerbank' item to inventory after use; false: consume it.

-- Battery drain profile -------------------------------------------------------
Config.Battery = {
    enabled  = true,  -- [EDIT] Master toggle for battery system.
    interval = 1000,  -- [ADV]  Tick interval in ms (how often drain/charge applies).
    default  = 0.001, -- [EDIT] Base drain applied regardless of app focus.
    apps     = {      -- [EDIT] Foreground app extra drain. Increase for heavier apps.
        ['phone']       = 0.002,
        ['whatsapp']    = 0.002,
        ['twitter']     = 0.002,
        ['settings']    = 0.002,
        ['mail']        = 0.002,
        ['state']       = 0.002,
        ['weather']     = 0.002,
        ['spotify']     = 0.002,
        ['gallery']     = 0.002,
        ['camera']      = 0.002,
        ['notes']       = 0.002,
        ['calculator']  = 0.002,
        ['youtube']     = 0.002,
        ['store']       = 0.002,
        ['crypto']      = 0.002,
        ['bank']        = 0.002,
        ['help']        = 0.002,
        ['messages']    = 0.002,
        ['tinder']      = 0.002,
        ['clock']       = 0.002,
        ['houses']      = 0.002,
        ['yellowpages'] = 0.002,
        ['rentel']      = 0.002,
        ['tetris']      = 0.002,
        ['uber']        = 0.002,
        ['darkweb']     = 0.002,
        ['racing']      = 0.002,
        ['darkchat']    = 0.002,
        ['uberRider']   = 0.002,
        ['tiktok']      = 0.002,
        ['market']      = 0.002
    }
}

-- Safe defaulting (if battery disabled) --------------------------------------
-- [AUTO] Ensures arrays are normalized if someone toggles battery off elsewhere.
if not Config.Battery.enabled then
    Config.Battery.enabled = true   -- [AUTO]
    Config.Battery.default = 0.0    -- [AUTO]
    for k in pairs(Config.Battery.apps) do
        Config.Battery.apps[k] = 0.0 -- [AUTO]
    end
end

--──────────────────────────────────────────────────────────────────────────────
-- Charging Stations (World)                                                  [EDIT]
-- [INFO] Marker style and per-location charge points. Players near these coords
--        gain battery periodically based on chargeSpeed (units per 3 seconds).
--──────────────────────────────────────────────────────────────────────────────
Config.ChargeCoordsMarker = {
    marker = 2,                     -- [EDIT] Marker type (native id).
    color  = { 255, 255, 255, 255 } -- [EDIT] RGBA color (0–255).
}

Config.ChargeCoords = {
    {
        coords      = vec3(25.882116, -1341.416138, 29.397023), -- [EDIT] Charger position.
        isAvailable = true,                                      -- [EDIT] Toggle this station on/off.
        chargeSpeed = 3.0                                        -- [EDIT] +3 every 3s while charging.
    },
    {
        coords      = vec3(-42.846802, -1755.070435, 29.34313),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(1129.596680, -981.305786, 46.315859),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(19.335779, -1103.538940, 29.697037),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(-666.523926, -934.613037, 21.729231),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(-704.892212, -908.886719, 19.115588),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(-1220.993774, -912.881836, 12.226359),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(1164.968506, -317.935669, 69.10504),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(255.742645, -47.225620, 69.841032),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(-1302.567993, -391.261780, 36.595755),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(-1481.958374, -376.235596, 40.063452),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(375.456482, 331.734283, 103.466353),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(2571.713379, 291.965973, 108.634848),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(2551.379639, 382.528137, 108.522986),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(2673.661621, 3283.618896, 55.141119),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(1701.339600, 4919.229980, 41.96369),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(1731.790039, 6419.871582, 34.937209),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(-334.757660, 6082.848633, 31.35476),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(-3175.626709, 1085.157104, 20.738764),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(-3248.010742, 1002.042542, 12.730703),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(-3044.983887, 584.189758, 7.808927),
        isAvailable = true,
        chargeSpeed = 3.0
    },
    {
        coords      = vec3(-2962.195801, 388.839691, 14.943318),
        isAvailable = true,
        chargeSpeed = 3.0
    },
}

--──────────────────────────────────────────────────────────────────────────────
-- Public Phone Booths                                                         [EDIT]
-- [INFO] Players can place paid calls from booths. Includes cinematic use and blips.
--──────────────────────────────────────────────────────────────────────────────
Config.PhoneBoothBlip = {
    active = true,      -- [EDIT] Show blips for booths on the map.
    sprite = 459,       -- [EDIT] Blip sprite id.
    color  = 2,         -- [EDIT] Blip color id.
    scale  = 0.8,       -- [EDIT] Blip scale.
    name   = 'Phone Booth', -- [EDIT] Blip label.
}

Config.ShowNearestBooths = true -- [EDIT] true: show helper for nearest booths.

Config.PhoneBooths = {          -- [EDIT] World positions/headings of phone booths.
    { coords = vec4(128.940659, -2009.749390, 17.013823, 75.118103) },
    { coords = vec4(461.042816, -1852.384643, 26.57, 223.70495605) },
    { coords = vec4(252.936264, -2076.553955, 16.012837, 138.645660) },
    { coords = vec4(378.593414, -2147.301025, 14.601123, 29.094498) },
    { coords = vec4(406.918671, -1613.696655, 27.99307, 141.732285) },
    { coords = vec4(313.621979, -1691.129639, 28.044136, 141.732285) },
    { coords = vec4(38.676926, -1698.527466, 27.999007, 192.755920) },
    { coords = vec4(12.606594, -1532.162598, 27.989907, 48.188972) },
    { coords = vec4(209.723083, -1408.984619, 27.989907, 150.236221) },
    { coords = vec4(48.052750, -1379.274780, 27.979907, 2.834646) },
    { coords = vec4(-342.356049, -1471.872559, 29.465728, 87.874016) },
    { coords = vec4(-37.753845, -1115.314331, 25.132251, 246.614166) },
    { coords = vec4(-227.169220, -943.239563, 27.981307, 68.031494) },
    { coords = vec4(197.261536, -846.659363, 29.513232, 340.157471) },
    { coords = vec4(-53.419781, -721.846130, 42.959399, 153.070862) },
    { coords = vec4(-282.817566, -646.008789, 31.905811, 192.755920) },
    { coords = vec4(168.131866, -427.846161, 39.757861, 73.700790) },
    { coords = vec4(-359.419769, -267.929657, 32.343921, 51.023624) },
    { coords = vec4(-0.079117, -152.334061, 55.057544, 342.992126) },
    { coords = vec4(322.628571, -236.795593, 52.698535, 342.992126) },
    { coords = vec4(549.613159, 85.674728, 94.721973, 155.905502) },
    { coords = vec4(93.652756, 252.118683, 107.190845, 161.574799) },
    { coords = vec4(-64.602196, 180.949448, 86.044360, 221.102371) },
    { coords = vec4(240.342865, 83.947258, 91.149829, 158.740158) },
    { coords = vec4(-35.723076, -243.652740, 44.711719, 158.740158) },
    { coords = vec4(478.562653, 263.274719, 101.815723, 161.574799) },
    { coords = vec4(466.720886, -665.670349, 25.823047, 0.000000) },
    { coords = vec4(418.958252, -990.751648, 28.013599, 269.291351) },
    { coords = vec4(378.593414, -1125.257202, 28.097827, 175.748032) },
    { coords = vec4(759.599976, -889.107666, 23.852766, 90.708656) },
    { coords = vec4(809.789001, -1417.134033, 25.907275, 90.708656) },
    { coords = vec4(812.492310, -1968.909912, 27.912402, 257.952759) },
    { coords = vec4(723.626404, -2377.186768, 20.700732, 266.456696) },
    { coords = vec4(-1026.250488, -2743.833008, 18.864062, 240.944885) },
    { coords = vec4(-1205.103271, -1394.334106, 2.772510, 294.803162) },
    { coords = vec4(-1288.008789, -1092.514282, 5.805469, 204.094498) },
    { coords = vec4(-940.193420, -1199.314331, 3.817188, 212.598419) },
    { coords = vec4(-1099.846191, -806.043945, 16.9293823, 223.937012) },
    { coords = vec4(-687.032959, -675.336243, 29.631152, 181.417328) },
    { coords = vec4(-885.665955, -848.861511, 17.819385, 102.047249) },
    { coords = vec4(-1047.665894, -2084.070312, 12.157886, 229.606293) },
    { coords = vec4(1036.839600, -2249.960449, 30.574756, 87.874016) },
    { coords = vec4(1705.028564, -1639.424194, 111.167407, 99.212593) },
    { coords = vec4(948.3318481, -1740.544189, 29.8673049, 81.908905029) },
    { coords = vec4(1210.639404, -1282.588989, 34.0762893, 355.61618041) },
    { coords = vec4(-161.025924, -2632.566405, 4.73147220, 180.7557830) },
    { coords = vec4(1174.21386, -420.926635, 65.8176223, 73.64119720459) },
    { coords = vec4(1074.07434, -776.59481, 56.946246, 180.815017) },
    { coords = vec4(-694.045105, -278.991913, 34.991885, 122.858719) },
    { coords = vec4(-501.531799, -179.227325, 36.470996, 299.185577) },
    { coords = vec4(-616.994324, -420.016479, 33.463351, 85.884285) },
    { coords = vec4(-1002.513611, -391.252991, 36.660812, 115.867989) },
    { coords = vec4(-1252.519287, -538.408691, 29.098666, 131.531464) },
    { coords = vec4(-1470.224731, -708.601074, 24.366431, 139.815094) },
    { coords = vec4(-1541.711182, -467.244110, 34.132556, 31.676353) },
    { coords = vec4(553.173401, -2974.109619, 4.744457, 266.889771) },
    { coords = vec4(565.620667, -2722.715332, 4.75601, 2.830631) },
    { coords = vec4(754.894714, -3048.252197, 4.859356, 93.493866) },
    { coords = vec4(-1432.962769, -262.947510, 44.964626, 308.605591) },
    { coords = vec4(-1683.513306, -384.245758, 46.872443, 50.254704) },
    { coords = vec4(-1103.391113, -143.627167, 36.973937, 152.198273) },
    { coords = vec4(-464.103973, 144.347794, 63.170215, 2.164905) },
    { coords = vec4(811.837402, -173.348846, 71.396304, 336.024445) },
    { coords = vec4(-2289.707764, 419.038330, 173.301517, 153.477661) },
    { coords = vec4(-2958.663086, 447.199615, 13.995901, 359.032166) },
    { coords = vec4(-3037.492920, 587.248047, 6.511921, 111.270958) },
    { coords = vec4(-3146.152344, 1119.066895, 19.544858, 61.374123) },
    { coords = vec4(-1515.575806, 1499.105347, 113.837917, 78.183487) },
    { coords = vec4(2588.658447, 431.040131, 107.313152, 270.350830) },
    { coords = vec4(936.932983, 102.091782, 78.268443, 53.319496) },
    { coords = vec4(2745.979980, 3458.693115, 54.52346, 68.488243) },
    { coords = vec4(1692.605713, 3740.936035, 32.642169, 33.795506) },
    { coords = vec4(1937.438965, 3897.668213, 31.172103, 116.251793) },
    { coords = vec4(903.353943, 3656.837891, 31.289413, 275.263306) },
    { coords = vec4(595.806091, 2745.105957, 40.721877, 6.903358) },
    { coords = vec4(-1129.925537, 2677.800781, 17.0526, 311.245636) },
    { coords = vec4(-112.213196, 6306.829590, 30.204498, 134.958008) },
    { coords = vec4(1692.239746, 6432.220215, 31.462497, 334.389343) },
    { coords = vec4(1654.029785, 4888.356445, 40.742793, 102.488831) },
    { coords = vec4(2465.498047, 4949.440430, 43.957549, 183.070557) },
    { coords = vec4(-1878.619507, 2091.767334, 139.693729, 345.417999) },
}

--──────────────────────────────────────────────────────────────────────────────
-- Password Reset Service                                                      [EDIT]
-- [INFO] NPC service that resets a phone’s lock password for a fee.
--──────────────────────────────────────────────────────────────────────────────
Config.ResetPassword = {
    active = true,                            -- [EDIT] Enable/disable service.
    coords = vec3(1000.32, -103.89, 73.95),   -- [EDIT] Service location (blip/interaction).
    ped = {                                   -- [EDIT] NPC definition.
        coords = vec4(1000.32, -103.89, 73.95, 121.65),
        model  = `a_m_m_afriamer_01`
    },
    blip = {                                  -- [EDIT] Map marker for the service.
        coords = vec3(1000.32, -103.89, 73.95),
        name   = 'Technical',
        sprite = 89,
        color  = 1,
        scale  = 0.5,
        active = true
    },
    money = 500                               -- [EDIT] Price to reset password.
}

--──────────────────────────────────────────────────────────────────────────────
-- Phone Plans (“Recipe”)                                                      [EDIT]
-- [INFO] Optional balance/plan requirement to place calls. Two plan types:
--        daily (renews/charges per day) and moment (single-use/temporary).
--──────────────────────────────────────────────────────────────────────────────
Config.EnableRecipe = false -- [EDIT] true: require an active plan to make calls.

Config.BuyRecipe = {
    coords = { vec3(324.93, -229.56, 54.22) }, -- [EDIT] Plan purchase locations.
    prices = {
        daily  = 100000, -- [EDIT] Price of daily plan.
        moment = 1000,   -- [EDIT] Price of one-time plan.
    },
    blip = {
        sprite = 52,     -- [EDIT] Blip sprite id.
        color  = 2,      -- [EDIT] Blip color id.
        scale  = 0.8,    -- [EDIT] Blip scale.
        name   = 'Recipe Shop', -- [EDIT] Blip label.
    }
}

--──────────────────────────────────────────────────────────────────────────────
-- Job Integrations                                                            [EDIT]
-- [INFO] Define which jobs can post news, issue bills, receive SOS, appear in
--        duty systems, and their public phone numbers/labels.
--──────────────────────────────────────────────────────────────────────────────

-- News app: jobs allowed to publish posts.
Config.WeazelJob = { 'police', 'weazel' } -- [EDIT]

-- Billing: jobs allowed to use /sendbill.
Config.BillJobs = { 'police', 'ambulance' } -- [EDIT]

-- SOS: automatic distress message under health threshold.
Config.SOSMessage = true          -- [EDIT] Toggle SOS.
Config.SOSJob     = 'ambulance'   -- [EDIT] Job receiving SOS messages.
Config.SOSHealth  = 25            -- [EDIT] Health threshold (0–200 depending on framework).

-- Duty-capable jobs (Settings app → Duty).
Config.Jobs = { 'police', 'ambulance', 'mechanic', 'taxi' } -- [EDIT]

-- Public service numbers shown in contacts/calls.
Config.jobNumbers = {             -- [EDIT] Job → phone number mapping.
    ['police']    = '911',
    ['ambulance'] = '912',
    ['mechanic']  = '913',
}

-- Display labels used in UI lists.
Config.JobLabels = {              -- [EDIT] Job → label mapping.
    ['police']    = 'Police',
    ['ambulance'] = 'Ambulance',
    ['mechanic']  = 'Mechanic',
    ['taxi']      = 'Taxi'
}

-- Job Center listings (players can apply here).
Config.JobCenter = {              -- [EDIT] id-indexed list of available jobs and map coords.
    [1] = { job = 'trucker',  label = 'Trucker',        Coords = { 141.18,  -3204.59 } },
    [2] = { job = 'taxi',     label = 'Taxi Driver',    Coords = { 909.49,  -177.24 } },
    [3] = { job = 'tow',      label = 'Towing',         Coords = { 489.67,  -1331.82 } },
    [4] = { job = 'reporter', label = 'News Reporter',  Coords = { -552.29, -925.59 } },
    [5] = { job = 'garbage',  label = 'Trash Collector',Coords = { -313.85, -1522.82 } },
    [6] = { job = 'bus',      label = 'Bus Driver',     Coords = { 462.22,  -641.15 } },
}

--──────────────────────────────────────────────────────────────────────────────
-- Vehicle / Keys / Valet / iCar / Colors                                     [EDIT]
-- [INFO] Settings used by Uber & Garages apps. Keys are auto-detected; if none
--        is found, system falls back to 'none' (no key checks).
--──────────────────────────────────────────────────────────────────────────────

-- Garage detection ------------------------------------------------------------ [AUTO]
-- [INFO] Detects a supported garage script by resource name. If none is running,
--        'default' disables deep integration and uses basic fallbacks.
local garages = { -- [CORE] resourceName -> alias
    ['qs-advancedgarages'] = 'qs-advancedgarages',
    ['jg-advancedgarages'] = 'jg-advancedgarages',
    ['cd_garage']          = 'cd_garage',
    ['loaf_garage']        = 'loaf_garage',
    ['okokGarage']         = 'okokGarage',
    ['codem-garage']       = 'codem-garage',
    ['vms_garagesv2']      = 'vms_garagesv2',
    ['lunar_garage']       = 'lunar_garage',
    ['RxGarages']          = 'RxGarages'
}
Config.Garage = dependencyCheck(garages) or 'default' -- [AUTO]

-- Vehicle keys detection ------------------------------------------------------ [AUTO]
-- [INFO] Integrates with common vehicle key/lock scripts. If none is running,
--        value becomes 'none' and lock checks are skipped.
local keys = { -- [CORE]
    ['mono_carkeys']    = 'mono_carkeys',
    ['qb-vehiclekeys']  = 'qb-vehiclekeys',
    ['qs-vehiclekeys']  = 'qs-vehiclekeys',
    ['vehicle_keys']    = 'vehicle_keys',
    ['wasabi_carlock']  = 'wasabi_carlock',
    ['mk_vehiclekeys']  = 'mk_vehiclekeys',
    ['okokGarage']      = 'okokGarage'
}
Config.Vehiclekeys = dependencyCheck(keys) or 'none' -- [AUTO]

-- Valet service --------------------------------------------------------------- [EDIT]
-- [INFO] Simple valet spawn/delivery service billed to the player.
Config.Valet      = false -- [EDIT] true: enable valet UI/button & service.
Config.ValetPrice = 1000  -- [EDIT] Cost per valet request (framework currency).

-- iCar / Vehicleshop waypoint ------------------------------------------------- [EDIT]
-- [INFO] Map location used by the iCar app button (SetWaypoint). Use vec2 (x,y) only.
Config.VehicleShopLocation = vec2(-33.784615, -1102.021973) -- [EDIT]

-- Color names (UI palette) ---------------------------------------------------- [EDIT]
-- [INFO] Index → display name used in color pickers/lists. Extend as needed.
Config.Colors = {
    [0] = 'Metallic Black',
    [1] = 'Metallic Graphite Black',
    [2] = 'Metallic Black Steel',
    [3] = 'Metallic Dark Silver',
    [4] = 'Metallic Silver',
    [5] = 'Metallic Blue Silver',
    [6] = 'Metallic Steel Grey',
    [7] = 'Metallic Shadow Silver',
    [8] = 'Metallic Stone Silver',
    [9] = 'Metallic Midnight Silver',
    [10] = 'Metallic Weapon Metal',
    [11] = 'Metallic Anthracite Grey',
    [12] = 'Matte Black',
    [13] = 'Matte Grey',
    [14] = 'Matte Light Grey',
    [15] = 'Util Black',
    [16] = 'Util Black Poly',
    [17] = 'Util Dark silver',
    [18] = 'Util Silver',
    [19] = 'Util Gun Metal',
    [20] = 'Util Shadow Silver',
    [21] = 'Worn Black',
    [22] = 'Worn Graphite',
    [23] = 'Worn Silver Grey',
    [24] = 'Worn Silver',
    [25] = 'Worn Blue Silver',
    [26] = 'Worn Shadow Silver',
    [27] = 'Metallic Red',
    [28] = 'Turin Red Metallic',
    [29] = 'Metallic Formula Red',
    [30] = 'Metallic Blaze Red',
    [31] = 'Metallic Elegant Red',
    [32] = 'Metallic Garnet Red',
    [33] = 'Metallic Desert Red',
    [34] = 'Cabernet Red Metallic',
    [35] = 'Metallic Candy Red',
    [36] = 'Metallic Sunrise Orange',
    [37] = 'Metallic Classic Gold',
    [38] = 'Metallic Orange',
    [39] = 'Matte Red',
    [40] = 'Matte Dark Red',
    [41] = 'Matte Orange',
    [42] = 'Matte Yellow',
    [43] = 'Util Red',
    [44] = 'Util Brilliant Red',
    [45] = 'Util Garnet Red',
    [46] = 'Worn Red',
    [47] = 'Golden Red Worn',
    [48] = 'Dark Red Worn',
    [49] = 'Metallic Dark Green',
    [50] = 'Race Green Metallic',
    [51] = 'Metallic Sea Green',
    [52] = 'Metallic Olive Green',
    [53] = 'Metallic Green',
    [54] = 'Metallic Petrol Blue Green',
    [55] = 'Matte Lime Green',
    [56] = 'Util Dark Green',
    [57] = 'Util Green',
    [58] = 'Dark Worn Green',
    [59] = 'Weathered Green',
    [60] = 'Worn Sea Wash',
    [61] = 'Metallic Midnight Blue',
    [62] = 'Metallic Dark Blue',
    [63] = 'Saxon Blue Metallic',
    [64] = 'Metallic Blue',
    [65] = 'Metallic Marine Blue',
    [66] = 'Port Metallic Blue',
    [67] = 'Metallic Diamond Blue',
    [68] = 'Metallic Surf Blue',
    [69] = 'Metallic Teal',
    [70] = 'Metallic Brilliant Blue',
    [71] = 'Metallic Purple Blue',
    [72] = 'Metallic Spinnaker Blue',
    [73] = 'Metallic Ultra Blue',
    [74] = 'Metallic Brilliant Blue',
    [75] = 'Util Dark Blue',
    [76] = 'Util Midnight Blue',
    [77] = 'Util Blue',
    [78] = 'Util Sea Foam Blue',
    [79] = 'Util Light blue',
    [80] = 'Util Maui Blue Poly',
    [81] = 'Util Brilliant Blue',
    [82] = 'Matte Dark Blue',
    [83] = 'Matte Blue',
    [84] = 'Matte Midnight Blue',
    [85] = 'Worn Dark blue',
    [86] = 'Worn Blue',
    [87] = 'Worn Light blue',
    [88] = 'Metallic Taxi Yellow',
    [89] = 'Race Metallic Yellow',
    [90] = 'Metallic Bronze',
    [91] = 'Metallic Yellow Bird',
    [92] = 'Metallic Lime',
    [93] = 'Metallic Champagne',
    [94] = 'Metallic Pueblo Beige',
    [95] = 'Metallic Dark Ivory',
    [96] = 'Metallic Choco Brown',
    [97] = 'Metallic Gold Brown',
    [98] = 'Metallic Light Brown',
    [99] = 'Metallic Mesh Beige',
    [100] = 'Metallic Moss Brown',
    [101] = 'Metallic Biston Brown',
    [102] = 'Metallic Beech Wood',
    [103] = 'Metallic Dark Beech',
    [104] = 'Metallic Choco Orange',
    [105] = 'Metallic Beach Sand',
    [106] = 'Metallic Sun Bleeched Sand',
    [107] = 'Metallic Cream',
    [108] = 'Util Coffee',
    [109] = 'Util Medium Brown',
    [110] = 'Util Light Brown',
    [111] = 'Metallic White',
    [112] = 'Metallic Frost White',
    [113] = 'Weathered Honey Beige',
    [114] = 'Worn Brown',
    [115] = 'Worn Dark Brown',
    [116] = 'Worn straw beige',
    [117] = 'Brushed Steel',
    [118] = 'Brushed Black steel',
    [119] = 'Brushed Aluminum',
    [120] = 'Chrome',
    [121] = 'Worn White',
    [122] = 'Util Off-White',
    [123] = 'Worn Orange',
    [124] = 'Worn Light Orange',
    [125] = 'Metallic Securicor Green',
    [126] = 'Worn Taxi Yellow',
    [127] = 'police car blue',
    [128] = 'Matte Green',
    [129] = 'Matte Brown',
    [130] = 'Worn Orange',
    [131] = 'Matte White',
    [132] = 'Worn White',
    [133] = 'Worn Olive Army Green',
    [134] = 'Pure White',
    [135] = 'Hot Pink',
    [136] = 'Salmon pink',
    [137] = 'Metallic Vermillion Pink',
    [138] = 'Orange',
    [139] = 'Green',
    [140] = 'Blue',
    [141] = 'Metallic Black Blue',
    [142] = 'Metallic Black Purple',
    [143] = 'Metallic Black Red',
    [144] = 'hunter green',
    [145] = 'Metallic Purple',
    [146] = 'Metallic V Dark Blue',
    [147] = 'MODSHOP BLACK',
    [148] = 'Matte Purple',
    [149] = 'Matte Dark Purple',
    [150] = 'Metallic Lava Red',
    [151] = 'Matte Forest Green',
    [152] = 'Matte Olive Green',
    [153] = 'Matte Desert Brown',
    [154] = 'Matte Desert Tan',
    [155] = 'Matte Foilage Green',
    [156] = 'DEFAULT ALLOY COLOR',
    [157] = 'Epsilon Blue',
    [158] = 'Pure Gold',
    [159] = 'Brushed Gold',
    [160] = 'Red',
    [161] = 'Anod Red',
    [162] = 'Anod Wine',
    [163] = 'Anod Purple',
    [164] = 'Anod Blue',
    [165] = 'Anod Green',
    [166] = 'Anod Lime',
    [167] = 'Anod Copper',
    [168] = 'Anod Bronze',
    [169] = 'Anod Champagne',
    [170] = 'Anod Gold',
    [171] = 'Green Blue Flip',
    [172] = 'Green Red Flip',
    [173] = 'Green Brow Flip',
    [174] = 'Green Turq Flip',
    [175] = 'Green Purp Flip',
    [176] = 'Teal Red Flip',
    [177] = 'Turq Red Flip',
    [178] = 'Turq Purp Flip',
    [179] = 'Cyan Puro Flip',
    [180] = 'Blue Pink Flip',
    [181] = 'Blue Green Flip',
    [182] = 'Purp Red Flip',
    [183] = 'Purp Green Flip',
    [184] = 'Magen Gree Flip',
    [185] = 'Magen Yell Flip',
    [186] = 'Burg Green Flip',
    [187] = 'Magen Cyan Flip',
    [188] = 'Coppe Purp Flip',
    [189] = 'Magen Orange Flip',
    [190] = 'Red Orange Flip',
    [191] = 'Orange Purp Flip',
    [192] = 'Orange Blue Flip',
    [193] = 'White Purp Flip',
    [194] = 'Red Rainbow Flip',
    [195] = 'Blue Rainbow Flip',
    [196] = 'Dark Green Pearl',
    [197] = 'Dark Teal Pearl',
    [198] = 'Dark Blue Pearl',
    [199] = 'Dar Purple Pearl',
    [200] = 'Oil Slick Pearl',
    [201] = 'Lit Green Pearl',
    [202] = 'Lit Blue Pearl',
    [203] = 'Lit Purp Pearl',
    [204] = 'Lit Pink Pearl',
    [205] = 'Offwhite Prisma',
    [206] = 'Pink Pearl',
    [207] = 'Yellow Pearl',
    [208] = 'Green Pearl',
    [209] = 'Blue Pearl',
    [210] = 'Cream Pearl',
    [211] = 'White Prisma',
    [212] = 'Graphite Prisma',
    [213] = 'Dark Blue Prisma',
    [214] = 'Dark Purple Prisma',
    [215] = 'Hot Pink Prisma',
    [216] = 'Red Prisma',
    [217] = 'Green Prisma',
    [218] = 'Black Prisma',
    [219] = 'Oil Slic Prisma',
    [220] = 'Rainbow Prisma',
    [221] = 'Black Holo',
    [222] = 'White Holo',
}

--──────────────────────────────────────────────────────────────────────────────
-- Vehicle Classes                                                             [EDIT]
-- [INFO] UI/logic class labels indexed by GTA class id. Used in filters/lists.
--──────────────────────────────────────────────────────────────────────────────
Config.Classes = {
    [0] = 'COMPACT',       -- [INFO] Compacts
    [1] = 'SEDAN',         -- [INFO] Sedans
    [2] = 'SUV',           -- [INFO] SUVs
    [3] = 'COUPE',         -- [INFO] Coupes
    [4] = 'MUSCLE',        -- [INFO] Muscle
    [5] = 'SPORT CLASSIC', -- [INFO] Sports Classics
    [6] = 'SPORT',         -- [INFO] Sports
    [7] = 'SUPER',         -- [INFO] Super
    [8] = 'MOTOR',         -- [INFO] Motorcycles
    [9] = 'OFFROAD',       -- [INFO] Off-road
}

--──────────────────────────────────────────────────────────────────────────────
-- Uber / Uber Eats                                                            [EDIT]
-- [INFO] Pricing & tips for ride/delivery services used by Uber apps.
--──────────────────────────────────────────────────────────────────────────────
Config.UberTipMin          = 30    -- [EDIT] Minimum tip a client may give.
Config.UberTipMax          = 50    -- [EDIT] Maximum tip a client may give.
Config.UberPriceMultiplier = 1.5   -- [EDIT] Fare multiplier applied to base distance/time.

-- [INFO] Security deposit required to request an Uber.
--        If the customer cancels a pending trip, driver receives this amount.
Config.RequestSecureUber   = 5000  -- [EDIT] Currency units (framework money).

--──────────────────────────────────────────────────────────────────────────────
-- Uber Delivery Drop Points                                                    [EDIT]
-- [INFO] World positions for delivery endpoints. Keep z roughly at ground level.
--──────────────────────────────────────────────────────────────────────────────
Config.UberDelivery = {
    [1]  = { x = 8.69,     y = -243.09,   z = 47.66 },
    [2]  = { x = 113.74,   y = -277.95,   z = 54.51 },
    [3]  = { x = 201.56,   y = -148.76,   z = 61.47 },
    [4]  = { x = -206.84,  y = 159.49,    z = 74.08 },
    [5]  = { x = 38.83,    y = -71.64,    z = 63.83 },
    [6]  = { x = 47.84,    y = -29.16,    z = 73.71 },
    [7]  = { x = -264.41,  y = 98.82,     z = 69.27 },
    [8]  = { x = -419.34,  y = 221.12,    z = 83.60 },
    [9]  = { x = -998.43,  y = 158.42,    z = 62.31 },
    [10] = { x = -1026.57, y = 360.64,    z = 71.36 },
    [11] = { x = -967.06,  y = 510.76,    z = 82.07 },
    [12] = { x = -1009.64, y = 478.93,    z = 79.41 },
    [13] = { x = -1308.05, y = 448.59,    z = 100.86 },
    [14] = { x = 557.39,   y = -1759.57,  z = 29.31 },
    [15] = { x = 325.10,   y = -229.59,   z = 54.22 },
    [16] = { x = 414.82,   y = -217.57,   z = 59.91 },
    [17] = { x = 430.85,   y = -941.91,   z = 29.19 },
    [18] = { x = -587.79,  y = -783.53,   z = 25.40 },
    [19] = { x = -741.54,  y = -982.28,   z = 17.44 },
    [20] = { x = -668.23,  y = -971.58,   z = 22.34 },
    [21] = { x = -664.21,  y = -1218.25,  z = 11.81 },
    [22] = { x = 249.99,   y = -1730.79,  z = 29.67 },
    [23] = { x = 405.77,   y = -1751.18,  z = 29.71 },
    [24] = { x = 454.96,   y = -1580.25,  z = 32.82 },
    [25] = { x = 278.81,   y = -1117.96,  z = 29.42 },
    [26] = { x = 101.82,   y = -819.49,   z = 31.31 },
    [27] = { x = -416.72,  y = -186.79,   z = 37.45 },
}

--──────────────────────────────────────────────────────────────────────────────
-- Uber Shop Items                                                              [EDIT]
-- [INFO] Items purchasable via Uber Eats. Integrate with your inventory items.
--──────────────────────────────────────────────────────────────────────────────
Config.UberItems = {
    [1] = { item = 'phone',        name = 'Phone',        price = 300 },
    [2] = { item = 'sandwich',     name = 'Sandwich',     price = 200 },
    [3] = { item = 'water_bottle', name = 'Water Bottle', price = 120 },
    [4] = { item = 'repairkit',    name = 'Repair kit',   price = 200 },
}

--──────────────────────────────────────────────────────────────────────────────
-- Marketplace                                                                  [EDIT]
-- [INFO] App that lets orgs/companies manage clients, staff, and finances.
--──────────────────────────────────────────────────────────────────────────────
Config.Market = { Management = {} } -- [CORE] Container

-- Management capabilities ----------------------------------------------------- [EDIT]
Config.Market.Management.Deposit  = true -- [INFO] Allow org funds deposit.
Config.Market.Management.Withdraw = true -- [INFO] Allow org funds withdrawal.
Config.Market.Management.Hire     = true -- [INFO] Allow hiring via app.
Config.Market.Management.Fire     = true -- [INFO] Allow firing via app.
Config.Market.Management.Promote  = true -- [INFO] Allow promotions/demotions.

-- Organizations listing ------------------------------------------------------- [EDIT]
-- [INFO] Each market defines: id, name, image, description, allowed jobs, boss ranks, and HQ coords.
Config.Markets = {
    {
        id = 1,
        name = 'Los Santos Police Department',
        image = 'https://static.wikia.nocookie.net/gtawiki/images/d/dc/MissionRowPoliceStation-GTAV.png',
        description = 'The city police, always willing to help you, let us know if you have any problems in Los Santos.',
        job = { 'police', 'sheriff' },
        bossRanks = { 'boss', 'lieutenant' },
        coords = vec3(452.12, -980.55, 30.69)
    },
    {
        id = 2,
        name = 'Pillbox Medical Center',
        image = 'https://static.wikia.nocookie.net/esgta/images/e/e7/PillboxHillMedicalCenterGTAV.png',
        description = 'If you need a doctor, contact the Los Santos Emergency Center!',
        job = { 'ambulance' },
        bossRanks = { 'boss', 'lieutenant' },
        coords = vec3(335.12, -584.55, 43.69)
    },
    {
        id = 3,
        name = 'Bean Machine',
        image = 'https://cdnb.artstation.com/p/assets/images/images/062/724/785/large/synced3d-unbenannt.jpg',
        description = 'The best coffee shop in the city now with home delivery—order your coffee, cappuccino, with milk, or whatever you want!',
        job = { 'beanmachine', 'deliver' },
        bossRanks = { 'boss', 'lieutenant' },
        coords = vec3(280.799988, -963.982422, 29.414673)
    },
    {
        id = 4,
        name = 'Jamaican Roast',
        image = 'https://pbs.twimg.com/media/D3KNTUcW4AAQwRQ.jpg',
        description = 'Home delivery and in-store sales. Try the best cappuccino in Los Santos—toast, meals, grill!',
        job = { 'jamaican', 'deliver' },
        bossRanks = { 'boss', 'lieutenant' },
        coords = vec3(273.468140, -832.971436, 29.397827)
    },
    {
        id = 5,
        name = 'Pizza This',
        image = 'https://img.gta5-mods.com/q95/images/foodworks-food-delivery-pack/20d2bc-7.jpg',
        description = 'Since 1988 bringing the best Italian pizza to LS. Choose your flavor and contact us!',
        job = { 'pizzajob', 'deliver' },
        bossRanks = { 'boss', 'lieutenant' },
        coords = vec3(287.736267, -963.969238, 29.414673)
    },
    {
        id = 6,
        name = 'Bennys Original Motor Works',
        image = 'https://static.wikia.nocookie.net/esgta/images/6/64/GTAOnlineLowrider5.jpg',
        description = 'Top mechanic company with home orders or direct contact through Marketplace—repairs and tuning.',
        job = { 'mechanic' },
        bossRanks = { 'boss', 'lieutenant' },
        coords = vec3(-206.004395, -1310.281372, 31.285034)
    },
    {
        id = 7,
        name = 'Premium Deluxe Motorsport',
        image = 'https://i.ytimg.com/vi/M6ZNvc7dpR4/maxresdefault.jpg',
        description = 'Order your new car, ask for prices, and schedule delivery—your next sports car awaits!',
        job = { 'dealership' },
        bossRanks = { 'boss', 'lieutenant' },
        coords = vec3(-45.362637, -1107.309937, 26.432251)
    },
    {
        id = 8,
        name = 'Vanilla Unicorn',
        image = 'https://static.wikia.nocookie.net/esgta/images/a/ae/VanillaUnicornfrente.png',
        description = 'Drinks, shows, and reservations. Place your order or book your favorite performer.',
        job = { 'unicornjob' },
        bossRanks = { 'boss', 'lieutenant' },
        coords = vec3(128.795609, -1297.265869, 29.145020)
    },
    -- [EDIT] Add more markets here following the same structure.
}

--──────────────────────────────────────────────────────────────────────────────
-- Darkweb                                                                     [EDIT]
-- [INFO] Seller NPC, access points, and catalog. deliveryTime in ms per item.
--──────────────────────────────────────────────────────────────────────────────
Config.ChatSeller    = 'csb_sol'                                -- [EDIT] Ped model used as seller in chat/cinematics.
Config.SellerLocation = vector4(328.14, -940.16, 29.41, 182.57) -- [EDIT] Seller position/heading (or set to false to disable static seller).

-- Entry points where the Darkweb app becomes available / stronger signal, etc.
Config.DarkWebCoords = {
    vec3(93.45, -1928.67, 20.79),
    vec3(1134.81, -416.30, 67.05),
}

-- Catalog -------------------------------------------------------------------- [EDIT]
-- [INFO] isWeapon toggles special handling (license, metadata). Note: one label has a typo (“Sticky Bomd”) preserved intentionally.
Config.Darkweb = {
    List = {
        [1]  = { item = 'weapon_snspistol',     label = 'SNS Pistol',        price = 2500,  isWeapon = true,  deliveryTime = 1 * 60 * 1000 },
        [2]  = { item = 'weapon_minismg',       label = 'Mini SMG',          price = 2800,  isWeapon = true,  deliveryTime = 1 * 60 * 1000 },
        [3]  = { item = 'weapon_microsmg',      label = 'Micro SMG',         price = 3000,  isWeapon = true,  deliveryTime = 1 * 60 * 1000 },
        [4]  = { item = 'weapon_bullpuprifle',  label = 'Bullpup Rifle',     price = 4000,  isWeapon = true,  deliveryTime = 1 * 60 * 1000 },
        [5]  = { item = 'weapon_carbinerifle',  label = 'Carbine Rifle',     price = 9000,  isWeapon = true,  deliveryTime = 1 * 60 * 1000 },
        [6]  = { item = 'weapon_sawnoffshotgun',label = 'Shotgun',           price = 12000, isWeapon = true,  deliveryTime = 1 * 60 * 1000 },
        [7]  = { item = 'weapon_sniperrifle',   label = 'Sniper Rifle',      price = 28000, isWeapon = true,  deliveryTime = 1 * 60 * 1000 },
        [8]  = { item = 'url_weapontint',       label = 'Custom Weapon Tint',price = 2000,  isWeapon = false, deliveryTime = 1 * 60 * 1000 },
        [9]  = { item = 'weapon_molotov',       label = 'Molotov',           price = 500,   isWeapon = false, deliveryTime = 1 * 60 * 1000 },
        [10] = { item = 'weapon_stickybomb',    label = 'Sticky Bomd',       price = 900,   isWeapon = false, deliveryTime = 1 * 60 * 1000 }, -- [INFO] label typo kept
    },
}

--──────────────────────────────────────────────────────────────────────────────
-- Default Phone Map Blips                                                     [EDIT]
-- [INFO] Predefined waypoints for the Map app. Add as many as you want.
--──────────────────────────────────────────────────────────────────────────────
Config.DefaultPhoneMapBlips = {
    {
        name = 'Hell Yeah',                                -- [EDIT] Display name.
        x = 0, y = 0,                                     -- [EDIT] Map coordinates (Z not required).
        icon = 'https://cdn-icons-png.flaticon.com/512/0/619.png', -- [EDIT] URL to icon used in UI.
    }
}

--──────────────────────────────────────────────────────────────────────────────
-- Vehicle Rental                                                               [EDIT]
-- [INFO] Rent points, vehicles and blip settings for the Rentel system.
--        Key name “Rentel” is intentional for backward compatibility.
--──────────────────────────────────────────────────────────────────────────────
Config.FixedBlipName = true -- [EDIT] true: all rental spots use Config.RentelBlips.name; false: each spot uses its own key name.

Config.RentelBlips = {      -- [EDIT] Global blip style for rental spots (used when FixedBlipName = true).
    name    = 'Vehicle Rental',
    sprite  = 379,
    display = 4,
    scale   = 0.65,
    color   = 3,
}

Config.RentelVehicles = {   -- [EDIT] Spawnable rental vehicles with price per session.
    ['tribike3'] = { model = 'tribike3', label = 'Classic ARO 26',      price = 100 },
    ['bmx']      = { model = 'bmx',      label = 'BMX Zprinter Myland',  price = 120 },
    ['panto']    = { model = 'panto',    label = 'Smark Fortwo',         price = 250 },
    ['felon']    = { model = 'felon',    label = 'Merced Benz E',        price = 400 },
}

-- [INFO] Rental kiosks/terminals. Name keys are used when FixedBlipName = false.
Config.RentelLocations = {
    ['Courthouse Paystation'] = { coords = vector4(129.93887,  -898.53260, 30.148599, 166.04177) },
    ['Train Station']         = { coords = vector4(-213.40040, -1003.3420, 29.144016, 345.36584) },
    ['Bus Station']           = { coords = vector4(416.98699,  -641.60240, 28.500173, 90.011344) },
    ['Morningwood Blvd']      = { coords = vector4(-1274.6310, -419.16560, 34.215377, 209.44560) },
    ['South Rockford Drive']  = { coords = vector4(-682.92620, -1112.9280, 14.525076, 37.729667) },
    ['Tinsel Towers Street']  = { coords = vector4(-716.93380, -58.314390, 37.472839, 297.83691) },
}

--──────────────────────────────────────────────────────────────────────────────
-- Crypto App                                                                  [EDIT]
-- [INFO] Simulated crypto market with periodic price changes. Adjust bounds,
--        volatility, and timers carefully to avoid destabilizing your economy.
--──────────────────────────────────────────────────────────────────────────────
Crypto = {
    Lower = 500,                   -- [EDIT] Absolute lower bound for coin value.
    Upper = 5000,                  -- [EDIT] Absolute upper bound for coin value.

    History = {                    -- [CORE] Runtime price history buffer per coin.
        ['btc'] = {}
    },

    Worth = {                      -- [EDIT] Initial price per coin.
        ['btc'] = 1000
    },

    Labels = {                     -- [EDIT] Display labels per coin.
        ['btc'] = 'BTC'
    },

    Exchange = {                   -- [EDIT] In-world exchange terminal coordinates.
        coords = vector3(1276.21, -1709.88, 54.57),
        RebootInfo = {             -- [ADV] Simulated maintenance/reboot state.
            state = false,
            percentage = 0
        },
    },

    -- Auto update controls ---------------------------------------------------- [EDIT]
    Coin = 'btc',                  -- [EDIT] Ticker symbol to auto-refresh.
    RefreshTimer = 10,             -- [EDIT] Minutes between updates.

    -- Event chances (crash/luck spikes) -------------------------------------- [EDIT]
    ChanceOfCrashOrLuck = 2,       -- [EDIT] % chance any tick triggers a spike.
    Crash = { 20, 80 },            -- [EDIT] If crash: % drop range.
    Luck  = { 20, 45 },            -- [EDIT] If luck: % rise range.

    -- Normal drift probabilities --------------------------------------------- [EDIT]
    -- [INFO] If no spike, decide down/up by these thresholds (out of 100).
    ChanceOfDown = 30,             -- [EDIT] ≤ this → price goes down.
    ChanceOfUp   = 60,             -- [EDIT] ≥ this → price goes up.
    CasualDown   = { 1, 10 },      -- [EDIT] % drop range when drifting down.
    CasualUp     = { 1, 10 },      -- [EDIT] % rise range when drifting up.
}

--──────────────────────────────────────────────────────────────────────────────
-- SIM Card Vendor                                                              [EDIT]
-- [INFO] Enable SIM card purchases to change phone numbers/metadata.
--──────────────────────────────────────────────────────────────────────────────
Config.EnableSimCard = true

Config.SimCardLocations = {        -- [EDIT] Vendor(s) that sell SIMs.
    {
        coords = vec4(461.31878662109375, -1457.707763671875, 29.30237960815429, 23.81533050537109),
        model  = 'a_m_m_beach_01', -- [EDIT] Ped model string.
        price  = 5000,             -- [EDIT] Price per SIM.
        blip   = {                 -- [EDIT] Map marker config.
            sprite = 89,
            color  = 1,
            scale  = 0.5,
            name   = 'Sim Card',
        }
    }
}

--──────────────────────────────────────────────────────────────────────────────
-- Real-World Price Ticker (Optional)                                           [EDIT]
-- [INFO] Pulls live crypto price from CryptoCompare. Keep interval ≥ 2 minutes
--        to avoid rate-limits. Add an API key to stabilize requests.
--──────────────────────────────────────────────────────────────────────────────
Ticker = {
    Enabled   = false,                -- [EDIT] true: show real-world price ticker.
    coin      = 'BTC',                -- [EDIT] Symbol to fetch (e.g., BTC).
    currency  = 'USD',                -- [EDIT] Fiat (USD/EUR/…).
    tick_time = 2,                    -- [EDIT] Minutes between fetches (min 2).
    Api_key   = 'add_your_key_here',  -- [EDIT] Get one: https://min-api.cryptocompare.com/pricing

    --- Error handle (do not touch) ------------------------------------------- [CORE]
    Error_handle = {
        ['fsym is a required param.']  = 'Config error: Invalid / Missing coin name',
        ['tsyms is a required param.'] = 'Config error: Invalid / Missing currency',
        ['cccagg_or_exchange']         = 'Config error: Invalid currency / coin combination',
    },
}

--──────────────────────────────────────────────────────────────────────────────
-- Racing App Whitelist                                                         [EDIT]
-- [INFO] Admins or whitelisted identifiers can create races.
--──────────────────────────────────────────────────────────────────────────────
Config.RaceSetupAllowed = true
Config.WhitelistedCreators = {
    'PUTCID', -- [EDIT] Add license/identifier strings here.
}

--──────────────────────────────────────────────────────────────────────────────
-- Instagram Privacy                                                            [EDIT]
-- [INFO] Toggle global visibility of posts.
--──────────────────────────────────────────────────────────────────────────────
Config.InstagramShowAllPostsEveryone = true -- [EDIT] true: public feed; false: followers-only.

--──────────────────────────────────────────────────────────────────────────────
-- App Store · “Today” Panels                                                   [EDIT]
-- [INFO] Featured banners on the App Store home.
--──────────────────────────────────────────────────────────────────────────────
Config.StoreAppToday = {
    {
        header = 'Arcade Games',
        head   = 'Download and play the most bizarre games you will find!',
        image  = 'https://media.istockphoto.com/id/1196066633/vector/retro-arcade-slot-machine-with-pixel-game.jpg?s=612x612&w=0&k=20&c=eOvAvSLE88KimO3y5qYH78OZhmKZRDTMnN-VPRBiJVU=',
        footer = 'Discover our new games in the App Store, play with your friends but dont forget to enjoy Roleplay!'
    },
    {
        header = 'Music everywhere',
        head   = 'With Soundfy you can enjoy your favorite music everywhere!',
        image  = 'https://images-om.imgix.net/9wut1wqkxjto/music-sheet-mockup-dark.jpg?auto=format&fit=max&q=90&w=1500&s=0d71895e030dbde00e0a333395074ee8',
        footer = 'Search for your favorite hits, create playlists and show your friends the real music, enjoy all this with Soundfy'
    }
}

--──────────────────────────────────────────────────────────────────────────────
-- App Store · Catalog                                                          [EDIT]
-- [INFO] Register apps/games. `label` is the display name. `job` restricts by job,
--        `blockedJobs` excludes jobs, `timeout` is mock download time (ms).
--──────────────────────────────────────────────────────────────────────────────
Config.StoreApps = {
    {
        app           = 'instagram',                  -- [CORE] Internal app id.
        image         = 'img/apps/instagram.png',     -- [EDIT] App icon path (NUI).
        label         = 'Instagraph',                 -- [EDIT] Display name.
        job           = false,                        -- [EDIT] false or { 'ambulance', ... }
        blockedJobs   = {},                           -- [EDIT] Jobs that cannot use.
        timeout       = 10000,                        -- [EDIT] Download/install time (ms).
        creator       = 'Instagraph, Inc',            -- [EDIT] Publisher.
        category      = 'Social',                     -- [EDIT] Category name.
        isGame        = false,                        -- [EDIT] true for games.
        description   = 'Photo and video application',-- [EDIT] Short description.
        age           = '16+',                        -- [EDIT] Age rating string.
        extraDescription = {                          -- [EDIT] Extra panels inside detail page.
            {
                header = 'Instagraph',
                head   = 'Share unique images and stories with Instagraph',
                image  = 'https://i.ibb.co/0DWsBDf/instagram.webp',
                footer = 'Connect with friends, share what you do, or check out whats new from people around the world'
            },
        }
    },
    {
        app = 'garage',
        image = 'img/apps/garage.png',
        label = 'iCar',
        job = false,      -- or { 'ambulance' }
        timeout = 15000,
        blockedJobs = {}, -- or { 'ambulance' }
        creator = 'Los Santos',
        category = 'Other',
        isGame = false,
        description = 'Check and manage the garages of all Los Santos!',
        age = '16+',
        extraDescription = {
            {
                header = 'Los Santos Garages',
                head = 'Specialized application to control your vehicles or garages for all saints',
                image = 'https://i.ibb.co/4t8q7M1/garage.webp',
                footer = 'What are you waiting for to manage all your vehicles in the most comfortable way?'
            },
        }
    },
    {
        app = 'twitter',
        image = 'img/apps/twitter.png',
        label = 'Tweedle',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 15000,
        creator = 'X Corp',
        category = 'social',
        isGame = false,
        description = 'Post about your day and enjoy with your friends',
        age = '16+',
        extraDescription = {
            {
                header = 'Tweedle',
                head = 'The Tweedle app is the trusted global digital marketplace for everyone',
                image = 'https://i.ibb.co/bK1jp0q/twitter.webp',
                footer = 'Post content for everyone to see and participate in public conversations'
            }
        }
    },
    {
        app = 'bank',
        image = 'img/apps/bank.png',
        label = 'C. Banking',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 15000,
        creator = 'C. Banking',
        category = 'Productivity & Finance',
        isGame = false,
        description = 'Post about your day and enjoy with your friends',
        age = '18+',
        extraDescription = {
            {
                header = 'Central Banking',
                head = 'Manage your money through Central Banking',
                image = 'https://i.ibb.co/sQRx7Yb/bank.webp',
                footer = 'Your money is always safe, we know you, we love you at Central Banking'
            }
        }
    },
    {
        app = 'whatsapp',
        image = 'img/apps/whatsapp.png',
        label = 'ChitChat',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 17000,
        creator = 'ChitChat Inc',
        category = 'social',
        isGame = false,
        description = 'Chat with your friends now!',
        age = '16+',
        extraDescription = {
            {
                header = 'ChitChat',
                head = 'Enjoy group chats and calls with your friends!',
                image = 'https://i.ibb.co/dcPPG7h/whatsapp.webp',
                footer = 'Contact your friends through your contacts and talk to them at any time'
            }
        }
    },
    {
        app = 'state',
        image = 'img/apps/state.png',
        label = 'State',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 14000,
        creator = 'Los Santos',
        category = 'Information & Reading',
        isGame = false,
        description = 'Search for workers online',
        age = '9+',
        extraDescription = {
            {
                header = 'State',
                head = 'Are you looking to communicate with a specific worker?',
                image = 'https://i.ibb.co/sKFvrmW/state.webp',
                footer = 'Call the most sought-after workers with the best reputation in Los Santos'
            }
        }
    },
    {
        app = 'spotify',
        image = 'img/apps/spotify.png',
        label = 'Soundfy',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 14000,
        creator = 'Soundfy Inc',
        category = 'Entertainment',
        isGame = false,
        description = 'Listen and play albums',
        age = '3+',
        extraDescription = {
            {
                header = 'Soundfy',
                head = 'With Soundfy, listening to the radio or songs from your artists with their lyrics or downloading music and podcasts is very simple',
                image = 'https://i.ibb.co/bztwrsJ/spotify.webp',
                footer = 'Soundfy is the perfect platform to listen to your favorite music, radio and podcasts on your mobile, tablet, computer and more'
            }
        }
    },
    {
        app = 'youtube',
        image = 'img/apps/youtube.png',
        label = 'YouLink',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 19000,
        creator = 'Link Inc',
        category = 'Entertainment',
        isGame = false,
        description = 'Watch videos online',
        age = '8+',
        extraDescription = {
            {
                header = 'YouLink',
                head = 'Get the official YouLink application on your Phone',
                image = 'https://i.ibb.co/rm1cz8Y/youtube.webp',
                footer = 'Discover what topics are sweeping the world!'
            }
        }
    },
    {
        app = 'tinder',
        image = 'img/apps/tinder.png',
        label = 'Finder',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 19000,
        creator = '4Love',
        category = 'Social',
        isGame = false,
        description = 'Find a partner and meet people',
        age = '18+',
        extraDescription = {
            {
                header = 'Finder',
                head = 'Are you looking for a partner? An open relationship?',
                image = 'https://i.ibb.co/yh8F0GS/tinder.webp',
                footer = 'With over 70 billion matches to date, Finder is the number one free dating app and the best place to meet people'
            }
        }
    },
    {
        app = 'yellowpages',
        image = 'img/apps/yellowpages.png',
        label = 'Yellow Posts',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 11000,
        creator = 'Los Santos',
        category = 'Information & Reading',
        isGame = false,
        description = 'Buying and selling items online',
        age = '18+',
        extraDescription = {
            {
                header = 'Yellow Posts',
                head = 'Find and sell items online',
                image = 'https://i.ibb.co/RvLkNJK/yellowpages.webp',
                footer = 'Find your favorite product or sell your belongings at Yellow Posts Los Santos'
            }
        }
    },
    {
        app = 'rentel',
        image = 'img/apps/rentel.png',
        label = 'Aventon',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 12000,
        creator = 'Aventon Tech',
        category = 'Other',
        isGame = false,
        description = 'Rent a car now!',
        age = '16+',
        extraDescription = {
            {
                header = 'Aventon',
                head = 'Find your ideal vehicle and rent it',
                image = 'https://i.ibb.co/bPgfgd4/rental.webp',
                footer = 'Rent vehicles and pick them up at the Aventon spot in Los Santos'
            }
        }
    },
    {
        app = 'uber',
        image = 'img/apps/uber.png',
        label = 'Door Run',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 18000,
        creator = 'doorRun SLU',
        category = 'Other',
        isGame = false,
        description = 'Work with us by placing orders',
        age = '6+',
        extraDescription = {
            {
                header = 'Door Run',
                head = 'Work at Door Run with just one click!',
                image = 'https://i.ibb.co/sy9PGfR/ubereats.webp',
                footer = 'Visit the most hidden places in Los Santos delivering orders for Door Run'
            }
        }
    },
    {
        app = 'darkweb',
        image = 'img/apps/darkweb.png',
        label = 'Onion Browser',
        job = false,                -- or { 'ambulance' }
        blockedJobs = { 'police' }, -- or { 'ambulance' }
        timeout = 12000,
        creator = 'Thor',
        category = 'Other',
        isGame = false,
        description = 'The deepest of the internet',
        age = '18+',
        extraDescription = {
            {
                header = 'Onion Browser',
                head = 'Discover the darkest stores on the internet',
                image = 'https://i.ibb.co/J2v1nnZ/darkweb.webp',
                footer = 'Buying and selling anonymous weapons with unique serial numbers'
            }
        }
    },
    {
        app = 'racing',
        image = 'img/apps/racing.png',
        label = 'Racing',
        job = false,                -- or { 'ambulance' }
        blockedJobs = { 'police' }, -- or { 'ambulance' }
        timeout = 21000,
        creator = 'Insane Team',
        category = 'Other',
        isGame = false,
        description = 'Urban racing in a single app',
        age = '18+',
        extraDescription = {
            {
                header = 'Racing',
                head = 'Join street racing in Los Santos',
                image = 'https://i.ibb.co/2cynM0k/racing.webp',
                footer = 'Compete for the prize, participate in races and appear at the top of Los Santos Racing'
            }
        }
    },
    {
        app = 'darkchat',
        image = 'img/apps/darkchat.png',
        label = 'D-Chat',
        job = false,                -- or { 'ambulance' }
        blockedJobs = { 'police' }, -- or { 'ambulance' }
        timeout = 12000,
        creator = 'Thor',
        category = 'Other',
        isGame = false,
        description = 'Private chats without registrations',
        age = '18+',
        extraDescription = {
            {
                header = 'D-Chat',
                head = 'Create your forum and chat with other people without any fear of data disclosure',
                image = 'https://i.ibb.co/K2qznvW/darkchat.png',
                footer = 'D-Chat works hosted by each user, so there is no way to recover or track messages'
            }
        }
    },
    {
        app = 'uberRider',
        image = 'img/apps/uberRider.png',
        label = 'Drive Now',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 22000,
        creator = 'Drive Tech',
        category = 'Other',
        isGame = false,
        description = 'Tax-free travel',
        age = '18+',
        extraDescription = {
            {
                header = 'Drive Now',
                head = 'Request your trips or even sign up among our drivers',
                image = 'https://i.ibb.co/wd5BPJ4/uber.webp',
                footer = 'The safest website for your trips in all Los Santos'
            }
        }
    },
    {
        app = 'tiktok',
        image = 'img/apps/tiktok.png',
        label = 'TickTock',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 29000,
        creator = 'TickTock Inc',
        category = 'Social',
        isGame = false,
        description = 'Upload videos with your friends',
        age = '12+',
        extraDescription = {
            {
                header = 'TickTock',
                head = 'Be number one by posting the funniest videos',
                image = 'https://i.ibb.co/kKJqbyn/tiktok.webp',
                footer = 'Upload videos, listen to music, compete with your friends for the best post'
            }
        }
    },
    {
        app = 'market',
        image = 'img/apps/market.png',
        label = 'Marketplace',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 29000,
        creator = 'Los Santos',
        category = 'Other',
        isGame = false,
        description = 'Your favorite shops',
        age = '9+',
        extraDescription = {
            {
                header = 'Marketplace',
                head = 'The best shops in Los Santos have arrived',
                image = 'https://i.ibb.co/cJ1yPjL/market.webp',
                footer = 'Place your orders or even manage your business with Marketplace'
            }
        }
    },
    {
        app = 'discord',
        image = 'img/apps/discord.png',
        label = 'Catcord',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 13000,
        creator = 'Catcord Inc',
        category = 'Social',
        isGame = false,
        description = 'Channels to chat',
        age = '12+',
        extraDescription = {
            {
                header = 'Catcord',
                head = 'Channels to chat with your friends',
                image = 'https://i.ibb.co/vmtL0MK/discord.webp',
                footer = 'Create and manage your own channels with Catcord!'
            }
        }
    },
    {
        app = 'jobcenter',
        image = 'img/apps/jobcenter.png',
        label = 'Job Center',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 16000,
        creator = 'Jobs SLU',
        category = 'Other',
        isGame = false,
        description = 'Find a job quickly',
        age = '18+',
        extraDescription = {
            {
                header = 'Job Center',
                head = 'Search for jobs online with Likedin',
                image = 'https://i.ibb.co/dMmQJqS/jobcenter.webp',
                footer = 'Get hired by the best companies in Los Santos with Likedin!'
            }
        }
    },

    -- Games
    {
        app = 'fruitchop',
        image = 'https://cdn.jim-nielsen.com/ios/512/fruit-ninja-2020-08-31.png',
        label = 'Fruit Chop',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 28000,
        creator = 'Gamezop Inc',
        category = 'Games',
        description = 'Slide cutting fruits',
        age = '3+',
        isGame = true,
        game = {
            name = 'fruitchop',
            iframe = 'https://cdn-factory.marketjs.com/en/fruit-slice-frenzy/index.html',
            css = {
                -- If you make it with css, you can use it like this .fruitchop-app iframe { css values },
                width = '215%',
                height = '50%',
                transform = 'rotate(90deg)', -- Required for rotate
                border = 'none',
                position = 'absolute',
                left = '-60%',
                top = '25%',
            },
            rotate = true
        },
        extraDescription = {
            {
                header = 'Fruit Chop',
                head = 'Cut the fruits in time to win!',
                image = 'https://assets1.ignimgs.com/2016/05/20/fruit-ninjajpg-6da9b1_160w.jpg?width=1280',
                footer = 'Intuitive game that allows you to cut fruits and earn many rewards'
            }
        }
    },
    {
        app = 'chikenblast',
        image = 'https://i.ibb.co/tBbDWqL/3.webp',
        label = 'Chiken Blast',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 28000,
        creator = 'Gamezop Inc',
        category = 'Games',
        description = 'Collect colorful chickens and complete the game',
        age = '16+',
        isGame = true,
        game = {
            name = 'chikenblast',
            iframe = 'https://cdn-factory.marketjs.com/en/chicken-blast/index.html',
            css = {
                -- If you make it with css, you can use it like this .chikenblast-app iframe { css values },
                width = '215%',
                height = '50%',
                transform = 'rotate(90deg)', -- Required for rotate
                border = 'none',
                position = 'absolute',
                left = '-60%',
                top = '25%',
            },
            rotate = true
        },
        extraDescription = {
            {
                header = 'Chiken Blast',
                head = 'Collect colorful chickens and complete the game',
                image = 'https://www.marketjs.com/item/chicken-blast/chicken-blast.jpg',
                footer = 'The most played chicken game this 2024'
            }
        }
    },
    {
        app = 'kingkongracing',
        image = 'https://i.ibb.co/p0Xp9DS/2.webp',
        label = 'Kong Kong Racing',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 28000,
        creator = 'Gamezop Inc',
        category = 'Games',
        description = 'Epic monkey races',
        age = '3+',
        isGame = true,
        game = {
            name = 'kingkongracing',
            iframe = 'https://cdn-factory.marketjs.com/en/king-kong-kart-racing/index.html',
            css = {
                -- If you make it with css, you can use it like this .kingkongracing-app iframe { css values },
                width = '215%',
                height = '50%',
                transform = 'rotate(90deg)', -- Required for rotate
                border = 'none',
                position = 'absolute',
                left = '-60%',
                top = '25%',
            },
            rotate = true
        },
        extraDescription = {
            {
                header = 'Kong Kong Racing',
                head = 'Epic monkey races',
                image = 'https://a.silvergames.com/screenshots/king-kong-kart-racing/2_kart-race.jpg',
                footer = 'Be the champion of the world of monkeys!'
            }
        }
    },
    {
        app = 'mmacitybrawl',
        image = 'https://i.ibb.co/pvQpJHp/1.webp',
        label = 'MMA City Brawl',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        timeout = 28000,  --28000,
        creator = 'Gamezop Inc',
        category = 'Games',
        description = 'Online street fights!',
        age = '18+',
        isGame = true,
        game = {
            name = 'mmacitybrawl',
            iframe = 'https://cdn-factory.marketjs.com/en/mma-city-brawl/index.html',
            css = {
                -- If you make it with css, you can use it like this .mmacitybrawl-app iframe { css values },
                width = '215%',
                height = '50%',
                transform = 'rotate(90deg)', -- Required for rotate
                border = 'none',
                position = 'absolute',
                left = '-60%',
                top = '25%',
            },
            rotate = true
        },
        extraDescription = {
            {
                header = 'MMA City Brawl',
                head = 'Online street fights!',
                image = 'https://www.marketjs.com/item/mma-city-brawl/mma-city-brawl.jpg',
                footer = 'Fight with other players to be the champion!'
            }
        }
    },
}

Config.CustomApplications = {}

--──────────────────────────────────────────────────────────────────────────────
-- Auto-append custom apps into the App Store                                   [AUTO]
-- [INFO] Everything you place in Config.CustomApplications will appear in the
--        App Store (Config.StoreApps) without touching core code.
for _, v in pairs(Config.CustomApplications) do
    table.insert(Config.StoreApps, v)
end

--──────────────────────────────────────────────────────────────────────────────
-- Installed Phone Applications                                                 [EDIT]
-- [INFO] Defines which apps are installed/visible on the device by default.
--        Fields:
--          • app   [CORE] Internal id (must match the app implementation name)
--          • image [EDIT] NUI icon path
--          • label [EDIT] Display name (translatable)
--          • job   [EDIT] false or { 'job1','job2',... } to restrict access
--          • blockedJobs [EDIT] jobs that cannot use/open app
--          • category [EDIT] Grouping for App Store / UI
--          • hideInSettingsNotifications [EDIT] hide this app from Notification Settings UI
--          • notificationSound [EDIT] override sound ('' or nil → default)
--──────────────────────────────────────────────────────────────────────────────
Config.PhoneApplications = {
    {
        app  = 'phone',                         -- [CORE]
        image = 'img/apps/phone.png',           -- [EDIT]
        label = 'Phone',                        -- [EDIT]
        job = false,                            -- [EDIT] or { 'ambulance' }
        blockedJobs = {},                       -- [EDIT] or { 'ambulance' }
        category = 'Social',                    -- [EDIT]
        hideInSettingsNotifications = true,     -- [EDIT] true: not listed in Settings → Notifications
        notificationSound = '',                 -- [EDIT] set to '' or remove line to use default sound
    },
    {
        app = 'messages',
        image = 'img/apps/messages.png',
        label = 'Messages',
        job = false,      -- or { 'ambulance' }
        category = 'Social',
        blockedJobs = {}, -- or { 'ambulance' }
    },
    {
        app = 'settings',
        image = 'img/apps/settings.png',
        label = 'Settings',
        job = false,      -- or { 'ambulance' }
        category = 'Utilities',
        blockedJobs = {}, -- or { 'ambulance' }
        blockBadge = true
    },
    {
        app = 'camera',
        image = 'img/apps/camera.png',
        label = 'Camera',
        category = 'Creativity',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
    },
    {
        app = 'contacts',
        image = 'img/apps/contacts.png',
        label = 'Contacts',
        job = false,      -- or { 'ambulance' }
        category = 'Social',
        blockedJobs = {}, -- or { 'ambulance' }
    },
    {
        app = 'mail',
        image = 'img/apps/mail.png',
        label = 'Mail',
        category = 'Productivity & Finance',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
    },
    {
        app = 'weather',
        image = 'img/apps/weather.png',
        label = 'Weather',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        category = 'Information & Reading',
    },
    {
        app = 'calendar',
        image = 'img/apps/calendar.png',
        label = 'Calendar',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        category = 'Productivity & Finance',
    },
    {
        app = 'reminder',
        image = 'img/apps/reminders.png',
        label = 'Reminders',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        category = 'Productivity & Finance',
    },
    {
        app = 'gallery',
        image = 'img/apps/gallery.png',
        label = 'Gallery',
        job = false,      -- or { 'ambulance' }
        category = 'Creativity',
        blockedJobs = {}, -- or { 'ambulance' }
    },
    {
        app = 'health',
        image = 'img/apps/health.png',
        label = 'Health',
        job = false,      -- or { 'ambulance' }
        category = 'Creativity',
        blockedJobs = {}, -- or { 'ambulance' }
    },
    {
        app = 'notes',
        image = 'img/apps/notes.png',
        label = 'Notes',
        category = 'Productivity & Finance',
        job = false,      -- or { 'ambulance' }
        blockedJobs = {}, -- or { 'ambulance' }
        hideInSettingsNotifications = true
    },
    {
        app = 'calculator',
        image = 'img/apps/calculator.png',
        label = 'Calculator',
        job = false,      -- or { 'ambulance' }
        category = 'Utilities',
        blockedJobs = {}, -- or { 'ambulance' }
        hideInSettingsNotifications = true
    },
    {
        app = 'store',
        image = 'img/apps/store.png',
        label = 'App Store',
        job = false,      -- or { 'ambulance' }
        category = 'Utilities',
        blockedJobs = {}, -- or { 'ambulance' }
    },
    {
        app = 'crypto',
        image = 'img/apps/stock.png',
        label = 'Stock',
        job = false,      -- or { 'ambulance' }
        category = 'Productivity & Finance',
        blockedJobs = {}, -- or { 'ambulance' }
    },
    {
        app = 'clock',
        image = 'img/apps/clock.png',
        label = 'Clock',
        job = false,      -- or { 'ambulance' }
        category = 'Utilities',
        blockedJobs = {}, -- or { 'ambulance' }
    },
    {
        app = 'houses',
        image = 'img/apps/houses.png',
        label = 'Home',
        job = false,      -- or { 'ambulance' }
        category = 'Utilities',
        blockedJobs = {}, -- or { 'ambulance' }
    },
    {
        app = 'weazel',
        image = 'img/apps/news.png',
        label = 'News',
        job = false,      -- or { 'ambulance' }
        category = 'Other',
        blockedJobs = {}, -- or { 'ambulance' }
    },
    {
        app = 'map',
        image = 'img/apps/maps.png',
        label = 'Maps',
        category = 'Utilities',
        job = nil,
        blockedJobs = {}, -- or { 'ambulance' }
    },
    {
        app = 'safari',
        category = 'Utilities',
        label = 'Safari',
        game = {
            iframe = 'https://yep.com',
            rotate = false,
            name = 'safari',
            css = {
                top = '0',
                border = 'none',
                height = '100%',
                position = 'absolute',
                width = '100%'
            }
        },
        image = 'img/apps/safari.png',
        blockedJobs = {}
    },
    {
        app = 'facetime',
        image = 'img/apps/facetime.png',
        label = 'FaceTime',
        category = 'Social',
        job = false, -- or { 'ambulance' }
        blockedJobs = {}
    },
}

--──────────────────────────────────────────────────────────────────────────────
-- Debug & Developer Tools                                                     [ADV]
-- [INFO] Use only during testing or development. Enabling these options will
--        generate frequent console logs, performance data, and internal info.
--        Avoid enabling on production servers to prevent spam and overhead.
--──────────────────────────────────────────────────────────────────────────────
Config.Debug                       = false  -- [EDIT] Enables global debug mode (prints/logs most events).
Config.ZoneDebug                   = false  -- [EDIT] Shows zone/region checks (e.g., signal zones).
Config.DeleteStoriesAndNotifies    = false  -- [EDIT] Deletes all stories and notifications upon script reload/start.
Config.DeleteNotificationsAutomatically = false -- [EDIT] Automatically deletes notifications after timeout (set false to disable).

-- [INFO] Safety override: if phones are not unique (shared metadata),
--        ownership restriction on F1 open is disabled automatically.
if not Config.UniquePhone then
    Config.KeyOpenOnlyOwnedPhone = false
end