importPackage(java.awt);
importPackage(java.awt.geom);
include(Resources.id('mtrsteamloco:scripts/display_helper.js'));

// Внешние дисплеи (из 490_6.js)

let slotHeadRouteCfg = {							// ЭМУ МАРШРУТ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [256, 128],
    slots: [
        {
            name: 'head-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [-0.616636, 2.63633, 10.2882],		// Левый Верхний Угол XYZ
                    [-0.616636, 2.39368, 10.2882],		// Левый Нижний Угол XYZ
                    [-0.336138, 2.39368, 10.2882],	    // Правый Нижний Угол XYZ
                    [-0.336138, 2.63633, 10.2882],	    // Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotHeadRoute2Cfg = {							// ЭМУ МАРШРУТ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [256, 128],
    slots: [
        {
            name: 'head-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [-0.616636, 2.63633, 10.2882],		// Левый Верхний Угол XYZ
                    [-0.616636, 2.39368, 10.2882],		// Левый Нижний Угол XYZ
                    [-0.336138, 2.39368, 10.2882],	    // Правый Нижний Угол XYZ
                    [-0.336138, 2.63633, 10.2882],	    // Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotHeadDestCfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'head-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-0.336138, 2.63633, 10.2882],		// Левый Верхний Угол XYZ
                    [-0.336138, 2.39368, 10.2882],	// Левый Нижний Угол XYZ
                    [0.616636, 2.39368, 10.2882],	    // Правый Нижний Угол XYZ
                    [0.616636, 2.63633, 10.2882],				// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotHeadDest2Cfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'head-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-0.336138, 2.63633, 10.2882],		// Левый Верхний Угол XYZ
                    [-0.336138, 2.39368, 10.2882],	// Левый Нижний Угол XYZ
                    [0.616636, 2.39368, 10.2882],	    // Правый Нижний Угол XYZ
                    [0.616636, 2.63633, 10.2882],				// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotHeadSideDestCfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'head-right-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.46467, 2.24052, 6.19509],		// Левый Верхний Угол XYZ
                    [-1.46467, 2.00841, 6.19509],		// Левый Нижний Угол XYZ
                    [-1.46467, 2.00841, 7.18519],		// Правый Нижний Угол XYZ
                    [-1.46467, 2.24052, 7.18519],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-left-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46476, 2.24613, 6.87583],		// Левый Верхний Угол XYZ
                    [1.46476, 2.00841, 6.87583],	// Левый Нижний Угол XYZ
                    [1.46476, 2.00841, 5.90477],		// Правый Нижний Угол XYZ
                    [1.46476, 2.24613, 5.90477],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotSideRouteCfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [256, 128],
    slots: [
        {
            name: 'right-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [-1.46467, 2.24052, 5.90477],		// Левый Верхний Угол XYZ
                    [-1.46467, 2.00841, 5.90477],	// Левый Нижний Угол XYZ
                    [-1.46467, 2.00841, 6.19509],		// Правый Нижний Угол XYZ
                    [-1.46467, 2.24052, 6.19509],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'left-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [1.46476, 2.24613, 7.18519],		// Левый Верхний Угол XYZ
                    [1.46476, 2.00841, 7.18519],	// Левый Нижний Угол XYZ
                    [1.46476, 2.00841, 6.87583],		// Правый Нижний Угол XYZ
                    [1.46476, 2.24613, 6.87583],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotHeadSideDest2Cfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'head-right-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.46443, 2.24613, 8.65402],		// Левый Верхний Угол XYZ
                    [-1.46443, 2.0121, 8.65402],	// Левый Нижний Угол XYZ
                    [-1.46443, 2.0121, 9.61346],		// Правый Нижний Угол XYZ
                    [-1.46443, 2.24613, 9.61346],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-right-dest2',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.46443, 2.24613, -9.388],		// Левый Верхний Угол XYZ
                    [-1.46443, 2.0121, -9.388],	// Левый Нижний Угол XYZ
                    [-1.46443, 2.0121, -8.43795],		// Правый Нижний Угол XYZ
                    [-1.46443, 2.24613, -8.43795],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-left-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46523, 2.2412, 9.29939],		
                    [1.46523, 2.00909, 9.29939],		
                    [1.46523, 2.00909, 8.32613],		
                    [1.46523, 2.2412, 8.32613],		
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-left-dest2',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46523, 2.2412, -8.76098],		
                    [1.46523, 2.00909, -8.76098],		
                    [1.46523, 2.00909, -9.72729],		
                    [1.46523, 2.2412, -9.72729],		
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotSideRoute2Cfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [256, 128],
    slots: [
        {
            name: 'right-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [-1.46443, 2.24052, 8.33304],	// Левый Верхний Угол XYZ
                    [-1.46443, 2.0121, 8.33304],	// Левый Нижний Угол XYZ
                    [-1.46443, 2.0121, 8.65402],		// Правый Нижний Угол XYZ
                    [-1.46443, 2.24052, 8.65402],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
         {
            name: 'right-route2',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [-1.46443, 2.24052, -9.71838],	// Левый Верхний Угол XYZ
                    [-1.46443, 2.0121, -9.71838],	// Левый Нижний Угол XYZ
                    [-1.46443, 2.0121, -9.388],		// Правый Нижний Угол XYZ
                    [-1.46443, 2.24052, -9.388],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'left-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [1.46523, 2.2412, 9.62037],		// Левый Верхний Угол XYZ
                    [1.46523, 2.00909, 9.62037],	// Левый Нижний Угол XYZ
                    [1.46523, 2.00909, 9.29939],		// Правый Нижний Угол XYZ
                    [1.46523, 2.2412, 9.29939],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'left-route2',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [1.46523, 2.2412, -8.43795],		// Левый Верхний Угол XYZ
                    [1.46523, 2.00909, -8.43795],	// Левый Нижний Угол XYZ
                    [1.46523, 2.00909, -8.76098],		// Правый Нижний Угол XYZ
                    [1.46523, 2.2412, -8.76098],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotHeadSideDest3Cfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'head-right-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.46467, 2.24613, -6.85779],		// Левый Верхний Угол XYZ
                    [-1.46467, 2.00841, -6.85779],		// Левый Нижний Угол XYZ
                    [-1.46467, 2.00841, -5.90477],		// Правый Нижний Угол XYZ
                    [-1.46467, 2.24613, -5.90477],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-left-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46476, 2.24613, -6.22864],		// Левый Верхний Угол XYZ
                    [1.46476, 2.00841, -6.22864],	// Левый Нижний Угол XYZ
                    [1.46476, 2.00841, -7.18519],		// Правый Нижний Угол XYZ
                    [1.46476, 2.24613, -7.18519],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotSideRoute3Cfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [256, 128],
    slots: [
        {
            name: 'right-route',
            texArea: [0, 0, 256, 128],
            pos: [  
                [
                    [-1.46467, 2.24613, -7.18519],		// Левый Верхний Угол XYZ
                    [-1.46467, 2.00841, -7.18519],	// Левый Нижний Угол XYZ
                    [-1.46467, 2.00841, -6.85779],		// Правый Нижний Угол XYZ
                    [-1.46467, 2.24613, -6.85779],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'left-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [1.46476, 2.24613, -5.90477],		// Левый Верхний Угол XYZ
                    [1.46476, 2.00841, -5.90477],	// Левый Нижний Угол XYZ
                    [1.46476, 2.00841, -6.22864],		// Правый Нижний Угол XYZ
                    [1.46476, 2.24613, -6.22864],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotHeadSideDest4Cfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
         {
            name: 'head-right-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.46467, 2.24052, 6.19509],		// Левый Верхний Угол XYZ
                    [-1.46467, 2.00841, 6.19509],		// Левый Нижний Угол XYZ
                    [-1.46467, 2.00841, 7.18519],		// Правый Нижний Угол XYZ
                    [-1.46467, 2.24052, 7.18519],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-left-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46476, 2.24613, 6.87583],		// Левый Верхний Угол XYZ
                    [1.46476, 2.00841, 6.87583],	// Левый Нижний Угол XYZ
                    [1.46476, 2.00841, 5.90477],		// Правый Нижний Угол XYZ
                    [1.46476, 2.24613, 5.90477],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotSideRoute4Cfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [256, 128],
    slots: [
        {
            name: 'right-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [-1.46467, 2.24052, 5.90477],		// Левый Верхний Угол XYZ
                    [-1.46467, 2.00841, 5.90477],	// Левый Нижний Угол XYZ
                    [-1.46467, 2.00841, 6.19509],		// Правый Нижний Угол XYZ
                    [-1.46467, 2.24052, 6.19509],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'left-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [1.46476, 2.24613, 7.18519],		// Левый Верхний Угол XYZ
                    [1.46476, 2.00841, 7.18519],	// Левый Нижний Угол XYZ
                    [1.46476, 2.00841, 6.87583],		// Правый Нижний Угол XYZ
                    [1.46476, 2.24613, 6.87583],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotHeadSideDest5Cfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'head-right-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.46443, 2.24613, 8.65402],		// Левый Верхний Угол XYZ
                    [-1.46443, 2.0121, 8.65402],	// Левый Нижний Угол XYZ
                    [-1.46443, 2.0121, 9.61346],		// Правый Нижний Угол XYZ
                    [-1.46443, 2.24613, 9.61346],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-right-dest2',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.46443, 2.24613, -9.388],		// Левый Верхний Угол XYZ
                    [-1.46443, 2.0121, -9.388],	// Левый Нижний Угол XYZ
                    [-1.46443, 2.0121, -8.43795],		// Правый Нижний Угол XYZ
                    [-1.46443, 2.24613, -8.43795],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-left-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46523, 2.2412, 9.29939],		
                    [1.46523, 2.00909, 9.29939],		
                    [1.46523, 2.00909, 8.32613],		
                    [1.46523, 2.2412, 8.32613],		
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-left-dest2',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46523, 2.2412, -8.76098],		
                    [1.46523, 2.00909, -8.76098],		
                    [1.46523, 2.00909, -9.72729],		
                    [1.46523, 2.2412, -9.72729],		
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotSideRoute5Cfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [256, 128],
    slots: [
        {
            name: 'right-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [-1.46443, 2.24052, 8.33304],	// Левый Верхний Угол XYZ
                    [-1.46443, 2.0121, 8.33304],	// Левый Нижний Угол XYZ
                    [-1.46443, 2.0121, 8.65402],		// Правый Нижний Угол XYZ
                    [-1.46443, 2.24052, 8.65402],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
         {
            name: 'right-route2',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [-1.46443, 2.24052, -9.71838],	// Левый Верхний Угол XYZ
                    [-1.46443, 2.0121, -9.71838],	// Левый Нижний Угол XYZ
                    [-1.46443, 2.0121, -9.388],		// Правый Нижний Угол XYZ
                    [-1.46443, 2.24052, -9.388],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'left-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [1.46523, 2.2412, 9.62037],		// Левый Верхний Угол XYZ
                    [1.46523, 2.00909, 9.62037],	// Левый Нижний Угол XYZ
                    [1.46523, 2.00909, 9.29939],		// Правый Нижний Угол XYZ
                    [1.46523, 2.2412, 9.29939],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'left-route2',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [1.46523, 2.2412, -8.43795],		// Левый Верхний Угол XYZ
                    [1.46523, 2.00909, -8.43795],	// Левый Нижний Угол XYZ
                    [1.46523, 2.00909, -8.76098],		// Правый Нижний Угол XYZ
                    [1.46523, 2.2412, -8.76098],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotHeadSideDest6Cfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'head-right-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.46467, 2.24613, -6.85779],		// Левый Верхний Угол XYZ
                    [-1.46467, 2.00841, -6.85779],		// Левый Нижний Угол XYZ
                    [-1.46467, 2.00841, -5.90477],		// Правый Нижний Угол XYZ
                    [-1.46467, 2.24613, -5.90477],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-left-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46476, 2.24613, -6.22864],		// Левый Верхний Угол XYZ
                    [1.46476, 2.00841, -6.22864],	// Левый Нижний Угол XYZ
                    [1.46476, 2.00841, -7.18519],		// Правый Нижний Угол XYZ
                    [1.46476, 2.24613, -7.18519],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotSideRoute6Cfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [256, 128],
    slots: [
        {
            name: 'right-route',
            texArea: [0, 0, 256, 128],
            pos: [  
                [
                    [-1.46467, 2.24613, -7.18519],		// Левый Верхний Угол XYZ
                    [-1.46467, 2.00841, -7.18519],	// Левый Нижний Угол XYZ
                    [-1.46467, 2.00841, -6.85779],		// Правый Нижний Угол XYZ
                    [-1.46467, 2.24613, -6.85779],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'left-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [1.46476, 2.24613, -5.90477],		// Левый Верхний Угол XYZ
                    [1.46476, 2.00841, -5.90477],	// Левый Нижний Угол XYZ
                    [1.46476, 2.00841, -6.22864],		// Правый Нижний Угол XYZ
                    [1.46476, 2.24613, -6.22864],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotMidTailSideDestCfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
       {
            name: 'mid-tail-right-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.43533, 2.05035, 1.41127],		// Левый Верхний Угол XYZ
                    [-1.43533, 1.79522, 1.41127],	// Левый Нижний Угол XYZ
                    [-1.43533, 1.79522, 2.48781],		// Правый Нижний Угол XYZ
                    [-1.43533, 2.05035, 2.48781],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'mid-tail-left-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.43619, 2.04992, 5.79218],		// Левый Верхний Угол XYZ
                    [1.43619, 1.79565, 5.79218],	// Левый Нижний Угол XYZ
                    [1.43619, 1.79565, 4.71565],		// Правый Нижний Угол XYZ
                    [1.43619, 2.04992, 4.71565],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotTailRouteCfg = {						    // ЭМУ МАРШРУТ ХВОСТОВОЙ (КРАСНЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [256, 128],
    slots: [
        {
            name: 'tail-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [0.616635, 2.63633, -10.2882],     // Левый Верхний Угол XYZ
                    [0.616635, 2.39368, -10.2882],     // Левый Нижний Угол XYZ
                    [0.336137, 2.39368, -10.2882],     // Правый Нижний Угол XYZ
                    [0.336137, 2.63633, -10.2882],     // Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotTailRoute2Cfg = {						    // ЭМУ МАРШРУТ ХВОСТОВОЙ (КРАСНЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [256, 128],
    slots: [
        {
            name: 'tail-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [0.616635, 2.63633, -10.2882],     // Левый Верхний Угол XYZ
                    [0.616635, 2.39368, -10.2882],     // Левый Нижний Угол XYZ
                    [0.336137, 2.39368, -10.2882],     // Правый Нижний Угол XYZ
                    [0.336137, 2.63633, -10.2882],     // Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotTailDestCfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'tail-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [0.336137,  2.63633, -10.2882],		// Левый Верхний Угол XYZ
                    [0.336137, 2.39368, -10.2882],	// Левый Нижний Угол XYZ
                    [-0.616636, 2.39368, -10.2882],		// Правый Нижний Угол XYZ
                    [-0.616636,  2.63633, -10.2882],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};  

let slotTailDest2Cfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'tail-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [0.336137,  2.63633, -10.2882],		// Левый Верхний Угол XYZ
                    [0.336137, 2.39368, -10.2882],	// Левый Нижний Угол XYZ
                    [-0.616636, 2.39368, -10.2882],		// Правый Нижний Угол XYZ
                    [-0.616636,  2.63633, -10.2882],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

// Внутренние дисплеи (из inside.js)

let slotInsideDestCfg1 = {
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'inside-dest1',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.12497, 2.36267, 7.56487],
                    [1.12497, 2.25747, 7.56487],
                    [0.389271, 2.25747, 7.56487],
                    [0.389271, 2.36267, 7.56487]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest2',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [0.353072, 2.69207, 3.79161],
                    [0.353072, 2.61882, 3.79161],
                    [-0.353072, 2.61882, 3.79161],
                    [-0.353072, 2.69207, 3.79161]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest3',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-0.353072, 2.69207, -3.5229],
                    [-0.353072, 2.61882, -3.5229],
                    [0.353072, 2.61882, -3.5229],
                    [0.353072, 2.69207, -3.5229]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest3',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-0.353072, 2.69207, -3.5229],
                    [-0.353072, 2.61882, -3.5229],
                    [0.353072, 2.61882, -3.5229],
                    [0.353072, 2.69207, -3.5229]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest4',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-0.353072, 2.69207, -9.00971],
                    [-0.353072, 2.61882, -9.00971],
                    [0.353072, 2.61882, -9.00971],
                    [0.353072, 2.69207, -9.00971]
                ]
            ],
            offsets: [[0, 0, 0]]
        }
    ]
};

let slotInsideDestCfg2 = {
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'inside-dest1',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [0.353074, 2.69207, 6.34874],
                    [0.353074, 2.61882, 6.34874],
                    [-0.353073, 2.61882, 6.34874],
                    [-0.353073, 2.69207, 6.34874]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest2',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-0.353074, 2.69207, -6.45357],
                    [-0.353074, 2.61882, -6.45357],
                    [0.353074, 2.61882, -6.45357],
                    [0.353074, 2.69207, -6.45357]
                ]
            ],
            offsets: [[0, 0, 0]]
        }
    ]
};

let slotInsideDestCfg3 = {
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'inside-dest1',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [0.353075, 2.69207, 9.01066],
                    [0.353075, 2.61882, 9.01066],
                    [-0.353069, 2.61882, 9.01066],
                    [-0.353069, 2.69207, 9.01066]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest2',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [0.353073, 2.69207, 3.52275],
                    [0.353073, 2.61882, 3.52275],
                    [-0.353071, 2.61882, 3.52275],
                    [-0.353071, 2.69207, 3.52275]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest3',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-0.353073, 2.69207, -3.79131],
                    [-0.353073, 2.61882, -3.79131],
                    [0.353071, 2.61882, -3.79131],
                    [0.353071, 2.69207, -3.79131]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest4',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.12497, 2.36267, -7.56207],
                    [-1.12497, 2.25747, -7.56207],
                    [-0.389273, 2.25747, -7.56207],
                    [-0.389273, 2.36267, -7.56207]
                ]
            ],
            offsets: [[0, 0, 0]]
        }
    ]
};

let slotInsideDestCfg4 = {
    version: 1,
    texSize: [1024, 128],
    slots: [
         {
            name: 'inside-dest1',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.12497, 2.36267, 7.56487],
                    [1.12497, 2.25747, 7.56487],
                    [0.389271, 2.25747, 7.56487],
                    [0.389271, 2.36267, 7.56487]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest2',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [0.353072, 2.69207, 3.79161],
                    [0.353072, 2.61882, 3.79161],
                    [-0.353072, 2.61882, 3.79161],
                    [-0.353072, 2.69207, 3.79161]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest3',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-0.353072, 2.69207, -3.5229],
                    [-0.353072, 2.61882, -3.5229],
                    [0.353072, 2.61882, -3.5229],
                    [0.353072, 2.69207, -3.5229]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest3',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-0.353072, 2.69207, -3.5229],
                    [-0.353072, 2.61882, -3.5229],
                    [0.353072, 2.61882, -3.5229],
                    [0.353072, 2.69207, -3.5229]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest4',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-0.353072, 2.69207, -9.00971],
                    [-0.353072, 2.61882, -9.00971],
                    [0.353072, 2.61882, -9.00971],
                    [0.353072, 2.69207, -9.00971]
                ]
            ],
            offsets: [[0, 0, 0]]
        }
    ]
};

let slotInsideDestCfg5 = {
    version: 1,
    texSize: [1024, 128],
    slots: [
         {
            name: 'inside-dest1',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [0.353074, 2.69207, 6.34874],
                    [0.353074, 2.61882, 6.34874],
                    [-0.353073, 2.61882, 6.34874],
                    [-0.353073, 2.69207, 6.34874]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest2',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-0.353074, 2.69207, -6.45357],
                    [-0.353074, 2.61882, -6.45357],
                    [0.353074, 2.61882, -6.45357],
                    [0.353074, 2.69207, -6.45357]
                ]
            ],
            offsets: [[0, 0, 0]]
        }
    ]
};

let slotInsideDestCfg6 = {
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'inside-dest1',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [0.353075, 2.69207, 9.01066],
                    [0.353075, 2.61882, 9.01066],
                    [-0.353069, 2.61882, 9.01066],
                    [-0.353069, 2.69207, 9.01066]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest2',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [0.353073, 2.69207, 3.52275],
                    [0.353073, 2.61882, 3.52275],
                    [-0.353071, 2.61882, 3.52275],
                    [-0.353071, 2.69207, 3.52275]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest3',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-0.353073, 2.69207, -3.79131],
                    [-0.353073, 2.61882, -3.79131],
                    [0.353071, 2.61882, -3.79131],
                    [0.353071, 2.69207, -3.79131]
                ]
            ],
            offsets: [[0, 0, 0]]
        },
        {
            name: 'inside-dest4',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.12497, 2.36267, -7.56207],
                    [-1.12497, 2.25747, -7.56207],
                    [-0.389273, 2.25747, -7.56207],
                    [-0.389273, 2.36267, -7.56207]
                ]
            ],
            offsets: [[0, 0, 0]]
        }
    ]
};

// Создание помощников отображения для внешних дисплеев
let dhHeadBaseDest = new DisplayHelper(slotHeadDestCfg);
let dhHeadBaseDest2 = new DisplayHelper(slotHeadDest2Cfg);
let dhHeadSideBaseDest = new DisplayHelper(slotHeadSideDestCfg);
let dhHeadSideBaseDest2 = new DisplayHelper(slotHeadSideDest2Cfg);
let dhHeadSideBaseDest3 = new DisplayHelper(slotHeadSideDest3Cfg);
let dhHeadSideBaseDest4 = new DisplayHelper(slotHeadSideDest4Cfg);
let dhHeadSideBaseDest5 = new DisplayHelper(slotHeadSideDest5Cfg);
let dhHeadSideBaseDest6 = new DisplayHelper(slotHeadSideDest6Cfg);
let dhMidTailSideDest = new DisplayHelper(slotMidTailSideDestCfg);

let dhHeadBaseRoute = new DisplayHelper(slotHeadRouteCfg);
let dhHeadBaseRoute2 = new DisplayHelper(slotHeadRoute2Cfg);
let dhSideBaseRoute = new DisplayHelper(slotSideRouteCfg);
let dhSideBaseRoute2 = new DisplayHelper(slotSideRoute2Cfg);
let dhSideBaseRoute3 = new DisplayHelper(slotSideRoute3Cfg);
let dhSideBaseRoute4 = new DisplayHelper(slotSideRoute4Cfg);
let dhSideBaseRoute5 = new DisplayHelper(slotSideRoute5Cfg);
let dhSideBaseRoute6 = new DisplayHelper(slotSideRoute6Cfg);

let dhTailBaseRoute = new DisplayHelper(slotTailRouteCfg);
let dhTailBaseRoute2 = new DisplayHelper(slotTailRoute2Cfg);
let dhTailBaseDest = new DisplayHelper(slotTailDestCfg);
let dhTailBaseDest2 = new DisplayHelper(slotTailDest2Cfg);

// Создание помощников отображения для внутренних дисплеев
let dhInsideBaseDest1 = new DisplayHelper(slotInsideDestCfg1);
let dhInsideBaseDest2 = new DisplayHelper(slotInsideDestCfg2);
let dhInsideBaseDest3 = new DisplayHelper(slotInsideDestCfg3);
let dhInsideBaseDest4 = new DisplayHelper(slotInsideDestCfg4);
let dhInsideBaseDest5 = new DisplayHelper(slotInsideDestCfg5);
let dhInsideBaseDest6 = new DisplayHelper(slotInsideDestCfg6);

// Общий шрифт
var EMUFont = Resources.readFont(Resources.idRelative('mtr:fronts/timessquare.ttf'));

function create(ctx, state, train) {
    // Инициализация внешних дисплеев
    state.pisRateLimit = new RateLimit(0.05);
    state.pisRateLimitNextStation = new RateLimit(0.07);
    
    state.dhHeadDest = dhHeadBaseDest.create();
    state.dhHeadDest2 = dhHeadBaseDest2.create();
    state.dhHeadSideDest = dhHeadSideBaseDest.create();
    state.dhHeadSideDest2 = dhHeadSideBaseDest2.create();
    state.dhHeadSideDest3 = dhHeadSideBaseDest3.create();
    state.dhHeadSideDest4 = dhHeadSideBaseDest4.create();
    state.dhHeadSideDest5 = dhHeadSideBaseDest5.create();
    state.dhHeadSideDest6 = dhHeadSideBaseDest6.create();
    state.dhMidTailSideDest = dhMidTailSideDest.create();

    state.dhHeadRoute = dhHeadBaseRoute.create();
    state.dhHeadRoute2 = dhHeadBaseRoute2.create();
    state.dhSideRoute = dhSideBaseRoute.create();
    state.dhSideRoute2 = dhSideBaseRoute2.create();
    state.dhSideRoute3 = dhSideBaseRoute3.create();
    state.dhSideRoute4 = dhSideBaseRoute4.create();
    state.dhSideRoute5 = dhSideBaseRoute5.create();
    state.dhSideRoute6 = dhSideBaseRoute6.create();
    
    state.dhTailRoute = dhTailBaseRoute.create();
    state.dhTailRoute2 = dhTailBaseRoute2.create();
    state.dhTailDest = dhTailBaseDest.create();
    state.dhTailDest2 = dhTailBaseDest2.create();
    
    // Инициализация внутренних дисплеев
    state.dhInsideDest1 = dhInsideBaseDest1.create();
    state.dhInsideDest2 = dhInsideBaseDest2.create();
    state.dhInsideDest3 = dhInsideBaseDest3.create();
    state.dhInsideDest4 = dhInsideBaseDest4.create();
    state.dhInsideDest5 = dhInsideBaseDest5.create();
    state.dhInsideDest6 = dhInsideBaseDest6.create();
    
    // Общие параметры
    state.routeIDmath = Math.floor(1 + (Math.random() * 59));
    state.routeID = state.routeIDmath;
    state.lastStationName = "";
    state.scrollOffset = 0;
    state.fullText = "";
    state.textWidth = 0;
    
    return state.routeID;
}

function dispose(ctx, state, train) {
    // Закрытие внешних дисплеев
    state.dhHeadDest.close();
    state.dhHeadDest2.close();
    state.dhHeadSideDest.close();
    state.dhHeadSideDest2.close();
    state.dhHeadSideDest3.close();
    state.dhHeadSideDest4.close();
    state.dhHeadSideDest5.close();
    state.dhHeadSideDest6.close();
    state.dhMidTailSideDest.close();
    state.dhHeadRoute.close();
    state.dhHeadRoute2.close();
    state.dhSideRoute.close();
    state.dhSideRoute2.close();
    state.dhSideRoute3.close();
    state.dhSideRoute4.close();
    state.dhSideRoute5.close();
    state.dhSideRoute6.close();
    state.dhTailRoute.close();
    state.dhTailRoute2.close();
    state.dhTailDest.close();
    state.dhTailDest2.close();
    
    // Закрытие внутренних дисплеев
    state.dhInsideDest1.close();
    state.dhInsideDest2.close();
    state.dhInsideDest3.close();
    state.dhInsideDest4.close();
    state.dhInsideDest5.close();
    state.dhInsideDest6.close();
}

function render(ctx, state, train) {
    // Обработка внешних дисплеев
    if (state.pisRateLimit.shouldUpdate()) {
        let endStation = getEndStation(train);
        let stationList = train.getThisRoutePlatforms();
        let allStations = [];
        
        // Получаем список всех станций
        for (let i = 0; i < stationList.size(); i++) {
            let stationName = stationList[i].station ? stationList[i].station.name : "";
            if (stationName && stationName.trim() !== "") {
                allStations.push(stationName);
            }
        }

        // Формируем текст для прокрутки
        let scrollText = "";
        if (allStations.length >= 1) {
            const middleIndex = Math.floor(allStations.length / 2);
            scrollText = "via " + allStations[middleIndex];
            
            if (middleIndex + 1 < allStations.length) {
                scrollText += ", " + allStations[middleIndex + 1];
            }
        }

        // Рендеринг боковых дисплеев
        [
            { dh: state.dhHeadSideDest, graphicsName: 'head-right-dest' },
            { dh: state.dhHeadSideDest, graphicsName: 'head-left-dest' },
            { dh: state.dhHeadSideDest2, graphicsName: 'head-right-dest' },
            { dh: state.dhHeadSideDest2, graphicsName: 'head-left-dest' },
            { dh: state.dhHeadSideDest2, graphicsName: 'head-right-dest2' },
            { dh: state.dhHeadSideDest2, graphicsName: 'head-left-dest2' },
            { dh: state.dhHeadSideDest3, graphicsName: 'head-right-dest' },
            { dh: state.dhHeadSideDest3, graphicsName: 'head-left-dest' },
            { dh: state.dhHeadSideDest4, graphicsName: 'head-right-dest' },
            { dh: state.dhHeadSideDest4, graphicsName: 'head-left-dest' },
            { dh: state.dhHeadSideDest5, graphicsName: 'head-right-dest' },
            { dh: state.dhHeadSideDest5, graphicsName: 'head-left-dest' },
            { dh: state.dhHeadSideDest6, graphicsName: 'head-right-dest' },
            { dh: state.dhHeadSideDest6, graphicsName: 'head-left-dest' },
        ].forEach((element) => {
            let dh = element.dh;
            let g = dh.graphicsFor(element.graphicsName);
            
            // Очистка дисплея
            g.setColor(Color.BLACK);
            g.fillRect(0, 0, 1024, 128);
            g.setColor(Color.ORANGE);

            let endStation = getEndStation(train).trim();
            
            if (endStation === "NICHT EINSTEIGEN") {
                // Центрируем с небольшим смещением вправо (можно изменить 50 на нужное значение)
                g.setFont(EMUFont.deriveFont(Font.PLAIN, 100));
                let textWidth = g.getFontMetrics().stringWidth(endStation);
                let xOffset = -50; // Смещение в пикселях (настройте по необходимости)
                g.drawString(endStation, (1024 - textWidth) / 2 + xOffset, 95);
            } else {
                // Стандартное отображение для нормальных станций
                // Верхняя строка - конечная станция
                g.setFont(EMUFont.deriveFont(Font.PLAIN, 90));
                let textWidth = g.getFontMetrics().stringWidth(endStation);
                g.drawString(endStation, (1024 - textWidth) / 2, 55);
                
                // Нижняя строка - прокрутка промежуточных станций
                let scrollText = "";
                let stationList = train.getThisRoutePlatforms();
                let allStations = [];
                
                for (let i = 0; i < stationList.size(); i++) {
                    let stationName = stationList[i].station ? stationList[i].station.name : "";
                    if (stationName && stationName.trim() !== "") {
                        allStations.push(stationName);
                    }
                }

                if (allStations.length >= 1) {
                    const middleIndex = Math.floor(allStations.length / 2);
                    scrollText = "via " + allStations[middleIndex];
                    
                    if (middleIndex + 1 < allStations.length) {
                        scrollText += ", " + allStations[middleIndex + 1];
                    }
                }

                if (scrollText) {
                    g.setFont(EMUFont.deriveFont(Font.PLAIN, 50));
                    textWidth = g.getFontMetrics().stringWidth(scrollText);
                    
                    if (state.scrollPos === undefined) state.scrollPos = 0;
                    state.scrollPos += 2;
                    state.scrollPos = state.scrollPos % (textWidth + 1024);
                    
                    g.drawString(scrollText, 1024 - state.scrollPos, 110);
                    g.drawString(scrollText, 1024 - state.scrollPos + textWidth + 1024, 110);
                }
            }

            dh.upload();
        });

        // Рендеринг ЛИЦЕВЫХ дисплеев (исправлено - теперь показывает конечную станцию)
        [
            { dh: state.dhHeadDest, graphicsName: 'head-dest' },
            { dh: state.dhHeadDest2, graphicsName: 'head-dest' },
            { dh: state.dhTailDest, graphicsName: 'tail-dest' },
            { dh: state.dhTailDest2, graphicsName: 'tail-dest' }
        ].forEach((element) => {
            let dh = element.dh;
            let g = dh.graphicsFor(element.graphicsName);
            g.setColor(Color.BLACK);
            g.fillRect(0, 0, 1024, 128);
            g.setColor(Color.ORANGE);
            g.setFont(EMUFont.deriveFont(Font.PLAIN, 120)); // Уменьшили размер шрифта
            let textWidth = g.getFontMetrics().stringWidth(endStation);
            g.drawString(endStation, (1024 - textWidth) / 2, 100); // Подправили позиционирование
            dh.upload();
        });

        // Рендеринг дисплеев с номером маршрута (боковые)
        [
            { dh: state.dhHeadRoute, graphicsName: 'head-route' },
            { dh: state.dhHeadRoute2, graphicsName: 'head-route' },
            { dh: state.dhTailRoute, graphicsName: 'tail-route' },
            { dh: state.dhTailRoute2, graphicsName: 'tail-route' }
        ].forEach((element) => {
            let dh = element.dh;
            let g = dh.graphicsFor(element.graphicsName);
            g.setColor(Color.BLACK);
            g.fillRect(0, 0, 256, 128);
            g.setColor(Color.ORANGE);
            g.setFont(EMUFont.deriveFont(Font.PLAIN, 110));
            let routeNum = getRouteNum(train);
            let textWidth = g.getFontMetrics().stringWidth(routeNum);
            g.drawString(routeNum, (256 - textWidth) / 2, 100);
            dh.upload();
        });

        // Рендеринг боковых дисплеев с цветом маршрута
        [
            { dh: state.dhSideRoute, graphicsName: 'right-route' },
            { dh: state.dhSideRoute, graphicsName: 'left-route' },
            { dh: state.dhSideRoute2, graphicsName: 'right-route' },
            { dh: state.dhSideRoute2, graphicsName: 'left-route' },
            { dh: state.dhSideRoute2, graphicsName: 'right-route2' },
            { dh: state.dhSideRoute2, graphicsName: 'left-route2' },
            { dh: state.dhSideRoute3, graphicsName: 'right-route' },
            { dh: state.dhSideRoute3, graphicsName: 'left-route' },
            { dh: state.dhSideRoute4, graphicsName: 'right-route' },
            { dh: state.dhSideRoute4, graphicsName: 'left-route' },
            { dh: state.dhSideRoute5, graphicsName: 'right-route' },
            { dh: state.dhSideRoute5, graphicsName: 'left-route' },
            { dh: state.dhSideRoute6, graphicsName: 'right-route' },
            { dh: state.dhSideRoute6, graphicsName: 'left-route' },
        ].forEach((element) => {
            let dh = element.dh;
            let g = dh.graphicsFor(element.graphicsName);
            
            let routeColor = getRouteColor(train);
            try {
                g.setColor(new Color(routeColor.r / 255, routeColor.g / 255, routeColor.b / 255));
            } catch (e) {
                g.setColor(new Color(0, 0, 1));
            }
            
            g.fillRect(0, 0, 256, 128);
            
            let brightness = (routeColor.r * 299 + routeColor.g * 587 + routeColor.b * 114) / 1000;
            g.setColor(brightness > 128 ? Color.BLACK : Color.WHITE);
            
            g.setFont(EMUFont.deriveFont(Font.PLAIN, 110));
            let routeNum = getRouteNum(train);
            let textWidth = g.getFontMetrics().stringWidth(routeNum);
            g.drawString(routeNum, (256 - textWidth) / 2, 100);
            dh.upload();
        });
    }

    // Обработка внутренних дисплеев
    let platformList = train.getThisRoutePlatforms();
    if (platformList.size() === 0) return;

    let currentPlatform = platformList[0];
    if (!currentPlatform || !currentPlatform.station) return;

    let currentStationName = currentPlatform.station.name;

    if (currentStationName !== state.lastStationName) {
        state.lastStationName = currentStationName;
        let nextStation = getNextStation(train);
        let destination = getDestinationStation(train);
        
        // Получаем список всех станций маршрута
        let allStations = [];
        for (let i = 0; i < platformList.size(); i++) {
            allStations.push(platformList[i].station.name);
        }
        
        // Определяем центральные станции для отображения
        let stationCount = allStations.length;
        let centralIndex = Math.floor(stationCount / 2);
        let prevCentral = centralIndex > 0 ? allStations[centralIndex - 1] : "";
        let central = stationCount > 0 ? allStations[centralIndex] : "";
        let nextCentral = centralIndex < stationCount - 1 ? allStations[centralIndex + 1] : "";
        
        // Формируем текст для бегущей строки с номером маршрута из функции getRouteNum
        let routeNum = getRouteNum(train);
        state.fullText = `${routeNum} bis ${destination}. Nächste Stationen: ${prevCentral}, ${central}, ${nextCentral}          `;
        state.scrollOffset = 0;
        
        // Предварительно вычисляем ширину текста
        let testG = state.dhInsideDest1.graphicsFor('inside-dest1');
        testG.setFont(EMUFont.deriveFont(Font.PLAIN, 90));
        state.textWidth = testG.getFontMetrics().stringWidth(state.fullText);
    }

    if (state.pisRateLimitNextStation.shouldUpdate() && train.shouldRenderDetail()) {
        state.scrollOffset -= 15; // Скорость прокрутки
        if (state.scrollOffset < -state.textWidth) {
           state.scrollOffset += state.textWidth; // Возвращаем текст за правый край
        }
        updateNextStationDisplay(state, train);
    }

    // Отрисовка моделей внешних дисплеев
    ctx.drawCarModel(state.dhHeadDest.model, 0, null);
    ctx.drawCarModel(state.dhHeadSideDest.model, 0, null);
    ctx.drawCarModel(state.dhHeadSideDest2.model, 1, null);
    ctx.drawCarModel(state.dhHeadSideDest3.model, 2, null);
    ctx.drawCarModel(state.dhHeadSideDest4.model, 3, null);
    ctx.drawCarModel(state.dhHeadSideDest5.model, 4, null);
    ctx.drawCarModel(state.dhHeadSideDest6.model, 5, null);
    ctx.drawCarModel(state.dhHeadRoute.model, 0, null);
    ctx.drawCarModel(state.dhSideRoute.model, 0, null);
    ctx.drawCarModel(state.dhSideRoute2.model, 1, null);
    ctx.drawCarModel(state.dhSideRoute3.model, 2, null);
    ctx.drawCarModel(state.dhSideRoute4.model, 3, null);
    ctx.drawCarModel(state.dhSideRoute5.model, 4, null);
    ctx.drawCarModel(state.dhSideRoute6.model, 5, null);
    ctx.drawCarModel(state.dhHeadRoute.model, 3, null);
    ctx.drawCarModel(state.dhHeadDest.model, 3, null);
    ctx.drawCarModel(state.dhMidTailSideDest.model, 3, null);
    ctx.drawCarModel(state.dhTailRoute2.model, 2, null);
    ctx.drawCarModel(state.dhTailDest.model, 2, null);
    ctx.drawCarModel(state.dhTailRoute.model, train.trainCars() - 1, null);
    ctx.drawCarModel(state.dhTailDest.model, train.trainCars() - 1, null);
    
    // Отрисовка моделей внутренних дисплеев
    ctx.drawCarModel(state.dhInsideDest1.model, 0, null);
    ctx.drawCarModel(state.dhInsideDest2.model, 1, null);
    ctx.drawCarModel(state.dhInsideDest3.model, 2, null);
    ctx.drawCarModel(state.dhInsideDest4.model, 3, null);
    ctx.drawCarModel(state.dhInsideDest5.model, 4, null);
    ctx.drawCarModel(state.dhInsideDest6.model, 5, null);
}

function updateNextStationDisplay(state, train) {
    ['inside-dest1', 'inside-dest2', 'inside-dest3', 'inside-dest4'].forEach(slotName => {
        updateDisplaySlot(state.dhInsideDest1, slotName, state);
    });

    ['inside-dest1', 'inside-dest2'].forEach(slotName => {
        updateDisplaySlot(state.dhInsideDest2, slotName, state);
    });

    ['inside-dest1', 'inside-dest2', 'inside-dest3', 'inside-dest4'].forEach(slotName => {
        updateDisplaySlot(state.dhInsideDest3, slotName, state);
    });

    ['inside-dest1', 'inside-dest2', 'inside-dest3', 'inside-dest4'].forEach(slotName => {
        updateDisplaySlot(state.dhInsideDest4, slotName, state);
    });

    ['inside-dest1', 'inside-dest2'].forEach(slotName => {
        updateDisplaySlot(state.dhInsideDest5, slotName, state);
    });

    ['inside-dest1', 'inside-dest2', 'inside-dest3', 'inside-dest4'].forEach(slotName => {
        updateDisplaySlot(state.dhInsideDest6, slotName, state);
    });
}

function updateDisplaySlot(dh, slotName, state) {
    let g = dh.graphicsFor(slotName);
    
    // Создаем новую трансформацию вместо использования undefined
    let transform = new AffineTransform();
    g.setTransform(transform);
    
    g.setComposite(AlphaComposite.Clear);
    g.fillRect(0, 0, 1024, 128);
    g.setComposite(AlphaComposite.SrcOver);
    g.setColor(Color.ORANGE);
    g.setFont(EMUFont.deriveFont(Font.PLAIN, 90));
    
    // Рисуем прокручиваемый текст
    g.drawString(state.fullText, state.scrollOffset, 100);
    
    // Для бесшовной прокрутки рисуем текст еще раз справа
    if (state.scrollOffset + state.textWidth < 1024) {
        g.drawString(state.fullText, state.scrollOffset + state.textWidth, 100);
    }
    
    dh.upload();
}

function getNextStation(train) {
    let stationList = train.getThisRoutePlatforms();
    let nextstationindex = train.getThisRoutePlatformsNextIndex();
    return stationList[nextstationindex].station.name;
}

function updateDisplays(state, text) {
    state.scrollText = text + "    ";
    state.scrollPosition = 0;
    updateDestinationDisplays(state, text);
    updateRouteDisplays(state);
}

function getDestinationStation(train) {
    let stationList = train.getThisRoutePlatforms();
    let lastPlatform = stationList[stationList.size() - 1];
    return lastPlatform === undefined ? 'NICHT EINSTEIGEN' : lastPlatform.destinationName.split('\\|')[0];
}

function getFirstStation(train) {
    let stationList = train.getThisRoutePlatforms();
    if (stationList[0] == undefined) return "";
    let station = stationList[0].station;
    let customFirstSt = stationList[0].route.platformIds[0].customDestination + "";
  
    let regularFirstSt = station == null ? "" : station.name;
    return customFirstSt == "" ? regularFirstSt : customFirstSt;
}

function getEndStation(train) {
    try {
        if (!train) return "NICHT EINSTEIGEN    ";
        
        let stationList = train.getThisRoutePlatforms();
        if (!stationList || stationList.size() === 0) {
            return "NICHT EINSTEIGEN    ";
        }
        
        let lastPlatform = stationList[stationList.size() - 1];
        if (!lastPlatform || !lastPlatform.destinationName) {
            return "NICHT EINSTEIGEN    ";
        }
        
        // Handle both string and null cases for destinationName
        let destination = lastPlatform.destinationName;
        if (!destination) return "NICHT EINSTEIGEN   ";
        
        let endStation = destination.split('\\|')[0];
        return (endStation && endStation.trim()) ? endStation.trim() : "NICHT EINSTEIGEN   ";
    } catch (e) {
        return "NICHT EINSTEIGEN    ";
    }
}

function getRouteNum(train) {
    try {
        // Проверяем, что train существует
        if (!train) return "";
        
        // Получаем список станций (с проверкой на null/undefined)
        let stationList = train.getThisRoutePlatforms();
        if (!stationList || stationList.size() === 0) {
            return "";
        }
        
        // Безопасно получаем первую станцию (может быть массивом или Java-коллекцией)
        let firstPlatform = stationList[0] || (stationList.get && stationList.get(0));
        if (!firstPlatform || !firstPlatform.route) {
            return "";
        }
        
        // Получаем номер маршрута (с проверкой)
        let routeNum = firstPlatform.route.lightRailRouteNumber;
        if (routeNum == null) { // Проверяем и null, и undefined
            return "";
        }
        
        // Возвращаем строку (на случай, если номер пришел как число)
        return String(routeNum);
    } catch (e) {
        return ""; // Если что-то пошло не так — возвращаем пустую строку
    }
}

function getRouteColor(train) {
    try {
        // Проверяем, что train существует
        if (!train) return decodeColor(0); // Возвращаем синий цвет по умолчанию
        
        // Получаем список станций
        let stationList = train.getThisRoutePlatforms();
        if (!stationList || stationList.size() === 0) {
            return decodeColor(0);
        }
        
        // Безопасно получаем первую станцию
        let firstPlatform = stationList[0] || (stationList.get && stationList.get(0));
        if (!firstPlatform || !firstPlatform.route) {
            return decodeColor(0);
        }
        
        // Получаем цвет маршрута (с проверкой)
        let color = firstPlatform.route.color;
        if (color == null) {
            return decodeColor(0);
        }
        
        // Декодируем цвет (если он есть)
        return decodeColor(color);
    } catch (e) {
        return decodeColor(0); // Если ошибка — возвращаем синий
    }
}

function decodeColor(color) {
    let r = (color >> 16) & 0xFF;
    let g = (color >> 8) & 0xFF;
    let b = color & 0xFF;
    return { r, g, b };
}

function renderStaticText(g, text, yPos, fontSize) {
    g.setFont(EMUFont.deriveFont(Font.PLAIN, fontSize));
    let textWidth = g.getFontMetrics().stringWidth(text);
    g.drawString(text, (1024 - textWidth) / 2, yPos);
}

function renderScrollingText(g, text, scrollPos, yPos, fontSize) {
    g.setFont(EMUFont.deriveFont(Font.PLAIN, fontSize));
    let textWidth = g.getFontMetrics().stringWidth(text);
    const displayWidth = 1024;

    if (textWidth > displayWidth) {
        scrollPos = scrollPos % (textWidth + displayWidth);
        g.drawString(text, displayWidth - scrollPos, yPos);
        g.drawString(text, displayWidth - scrollPos + textWidth + displayWidth, yPos);
    } else {
        g.drawString(text, (displayWidth - textWidth) / 2, yPos);
    }
}