{"id":2480,"date":"2026-05-24T14:50:02","date_gmt":"2026-05-24T14:50:02","guid":{"rendered":"https:\/\/millepiani.com\/service-and-maintenance\/"},"modified":"2026-09-14T17:59:36","modified_gmt":"2026-09-14T17:59:36","slug":"service-and-maintenance","status":"publish","type":"page","link":"https:\/\/millepiani.com\/en\/service-and-maintenance\/","title":{"rendered":"Service and Maintenance"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2480\" class=\"elementor elementor-2480 elementor-414\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-50cfe3a e-con-full e-flex e-con e-parent\" data-id=\"50cfe3a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-19b6665 elementor-widget elementor-widget-html\" data-id=\"19b6665\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"mp-maint-page\">\r\n\r\n  <!-- HERO -->\r\n  <section class=\"mp-maint-hero\" id=\"top\">\r\n    <div class=\"mp-maint-hero-bg\"><\/div>\r\n    <div class=\"mp-maint-hero-overlay\"><\/div>\r\n\r\n    <div class=\"mp-maint-hero-content mp-reveal\">\r\n      <p class=\"mp-kicker\">Millepiani Service<\/p>\r\n\r\n      <h1>Service and <br\/>Maintenance<\/h1>\r\n\r\n      <p>\r\n Service and maintenance solutions for elevators, freight lifts and escalators. Technical support<br\/>designed to ensure safety, peace of mind, service continuity, rapid response and consistent<br\/>system performance.\r\n      <\/p>\r\n\r\n      <a href=\"#preventivo\" class=\"mp-outline-btn\">Request information<\/a>\r\n    <\/div>\r\n\r\n    <a href=\"#assistenza-manutenzione\" class=\"mp-scroll-arrow\" aria-label=\"Scorri alla sezione successiva\">\r\n      <span><\/span>\r\n    <\/a>\r\n  <\/section>\r\n\r\n\r\n  <!-- INTRO + 6 RIQUADRI -->\r\n  <section class=\"mp-maint-intro\" id=\"assistenza-manutenzione\">\r\n    <div class=\"mp-container\">\r\n\r\n      <div class=\"mp-section-heading mp-reveal\">\r\n        <p>Why choose<\/p>\r\n        <h2>Elevator Service<br\/>and Maintenance<\/h2>\r\n      <\/div>\r\n\r\n      <div class=\"mp-intro-text mp-reveal\">\r\n        <p>\r\n Proper system operation provides safety and peace of mind while ensuring freedom<br\/>of movement. Millepiani Service offers a structured service designed to reduce inconvenience,<br\/>maintain consistent system performance and prevent potential issues through periodic<br\/>inspections. \r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"mp-features-grid\">\r\n\r\n        <article class=\"mp-feature-card mp-reveal\">\r\n          <span class=\"mp-feature-icon\">\r\n            <svg viewbox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <path d=\"M12 3l7 4v5c0 5-3.5 8-7 9-3.5-1-7-4-7-9V7l7-4z\"><\/path>\r\n              <path d=\"M9 12l2 2 4-5\"><\/path>\r\n            <\/path><\/path><\/svg>\r\n          <\/span>\r\n          <h3>Safety<\/h3>\r\n          <p>Proper maintenance keeps the system efficient and safe over time.<\/p>\r\n        <\/article>\r\n\r\n        <article class=\"mp-feature-card mp-reveal\">\r\n          <span class=\"mp-feature-icon\">\r\n            <svg viewbox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <circle cx=\"12\" cy=\"12\" r=\"9\"><\/circle>\r\n              <path d=\"M12 7v5l3 2\"><\/path>\r\n            <\/path><\/svg>\r\n          <\/span>\r\n          <h3>24\/7 Support<\/h3>\r\n          <p>A 24\/7 Call Center to handle requests promptly.<\/p>\r\n        <\/article>\r\n\r\n        <article class=\"mp-feature-card mp-reveal\">\r\n          <span class=\"mp-feature-icon\">\r\n            <svg viewbox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <circle cx=\"12\" cy=\"12\" r=\"9\"><\/circle>\r\n              <path d=\"M3 12h18\"><\/path>\r\n              <path d=\"M12 3a9 9 0 0 1 0 18\"><\/path>\r\n              <path d=\"M12 3a9 9 0 0 0 0 18\"><\/path>\r\n            <\/path><\/path><\/path><\/svg>\r\n          <\/span>\r\n          <h3>Nationwide Coverage<\/h3>\r\n          <p>Requests are forwarded to the local technician for a rapid response.<\/p>\r\n        <\/article>\r\n\r\n        <article class=\"mp-feature-card mp-reveal\">\r\n          <span class=\"mp-feature-icon\">\r\n            <svg viewbox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <path d=\"M4 19h16\"><\/path>\r\n              <path d=\"M7 16V8a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v8\"><\/path>\r\n              <path d=\"M10 10h4\"><\/path>\r\n              <path d=\"M10 13h4\"><\/path>\r\n            <\/path><\/path><\/path><\/path><\/svg>\r\n          <\/span>\r\n          <h3>System Upgrades<\/h3>\r\n          <p>Maintenance, upgrades and improvements for systems using older technologies as well.<\/p>\r\n        <\/article>\r\n\r\n        <article class=\"mp-feature-card mp-reveal\">\r\n          <span class=\"mp-feature-icon\">\r\n            <svg viewbox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <path d=\"M13 2L4 14h7l-1 8 10-13h-7V2z\"><\/path>\r\n            <\/path><\/svg>\r\n          <\/span>\r\n          <h3>Technology and Savings<\/h3>\r\n          <p>Electronic and digital equipment to reduce energy consumption and maintenance costs.<\/p>\r\n        <\/article>\r\n\r\n        <article class=\"mp-feature-card mp-reveal\">\r\n          <span class=\"mp-feature-icon\">\r\n            <svg viewbox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <path d=\"M16 21v-2a4 4 0 0 0-8 0v2\"><\/path>\r\n              <circle cx=\"12\" cy=\"7\" r=\"4\"><\/circle>\r\n              <path d=\"M20 8v6\"><\/path>\r\n              <path d=\"M23 11h-6\"><\/path>\r\n            <\/path><\/path><\/path><\/svg>\r\n          <\/span>\r\n          <h3>Professional Expertise<\/h3>\r\n          <p>Qualified operators and partners providing comprehensive, prompt and effective service.<\/p>\r\n        <\/article>\r\n\r\n      <\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n\r\n  <!-- SEZIONE SPECIALE -->\r\n  <section class=\"mp-service-lab\" id=\"service-lab\">\r\n    <canvas class=\"mp-service-lab-canvas\" id=\"mpServiceLabCanvas\" aria-hidden=\"true\"><\/canvas>\r\n\r\n    <div class=\"mp-service-lab-bg\"><\/div>\r\n    <div class=\"mp-service-lab-grid\"><\/div>\r\n\r\n    <div class=\"mp-service-lab-inner\">\r\n\r\n      <div class=\"mp-service-lab-head mp-reveal\">\r\n        <p class=\"mp-service-lab-kicker\" id=\"mpServiceLabKicker\">24\/7 Call Center<\/p>\r\n\r\n        <h2 id=\"mpServiceLabTitle\">\r\n Your Request Is<br\/>Taken in Charge\r\n        <\/h2>\r\n\r\n        <p id=\"mpServiceLabText\">\r\n The 24\/7 service receives the call and activates the support process for elevators,<br\/>freight lifts and escalators.\r\n        <\/p>\r\n\r\n        <div class=\"mp-service-lab-tags\" id=\"mpServiceLabTags\">\r\n          24\/7 Support<br\/>Rapid Response<br\/>Request Handling\r\n        <\/div>\r\n      <\/div>\r\n\r\n\r\n      <!-- PULSANTI IN ALTO -->\r\n      <div class=\"mp-service-controls mp-reveal\">\r\n\r\n        <div class=\"mp-service-control-block\">\r\n          <div class=\"mp-service-control-label\">\r\n            <span>01<\/span>\r\nSystem Type\r\n          <\/div>\r\n\r\n          <div class=\"mp-service-plant-switch\" aria-label=\"Seleziona tipo impianto\">\r\n            <button class=\"is-active\" type=\"button\" data-plant=\"lift\" aria-pressed=\"true\">\r\n              <span>01<\/span>\r\nElevators\r\n            <\/button>\r\n\r\n            <button type=\"button\" data-plant=\"goods\" aria-pressed=\"false\">\r\n              <span>02<\/span>\r\nFreight Lift\r\n            <\/button>\r\n\r\n            <button type=\"button\" data-plant=\"escalator\" aria-pressed=\"false\">\r\n              <span>03<\/span>\r\nEscalator\r\n            <\/button>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"mp-service-control-block\">\r\n          <div class=\"mp-service-control-label\">\r\n            <span>02<\/span>\r\nService Stage\r\n          <\/div>\r\n\r\n          <div class=\"mp-service-phase-switch\" aria-label=\"Seleziona fase servizio\">\r\n            <button class=\"is-active\" type=\"button\" data-phase=\"call\" aria-pressed=\"true\">\r\n              <span>01<\/span>\r\nCall\r\n            <\/button>\r\n\r\n            <button type=\"button\" data-phase=\"technician\" aria-pressed=\"false\">\r\n              <span>02<\/span>\r\nTechnician\r\n            <\/button>\r\n\r\n            <button type=\"button\" data-phase=\"diagnosis\" aria-pressed=\"false\">\r\n              <span>03<\/span>\r\nDiagnosis\r\n            <\/button>\r\n\r\n            <button type=\"button\" data-phase=\"check\" aria-pressed=\"false\">\r\n              <span>04<\/span>\r\nInspections\r\n            <\/button>\r\n          <\/div>\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n\r\n      <!-- CONTENUTO DINAMICO -->\r\n      <div class=\"mp-service-lab-stage mp-reveal\">\r\n\r\n        <div class=\"mp-service-model-area\">\r\n          <div class=\"mp-service-model-frame\" id=\"mpServiceModelFrame\">\r\n            <canvas id=\"mpServiceThreeCanvas\" class=\"mp-service-three-canvas\" aria-label=\"Modello 3D servizio assistenza\"><\/canvas>\r\n\r\n            <div class=\"mp-service-floating-status\">\r\n              System Active\r\n<strong id=\"mpFloatingMetric\">24\/24<\/strong>\r\n            <\/div>\r\n\r\n            <div class=\"mp-model-caption\">\r\n              System<br\/>Elevator\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"mp-service-info-area\">\r\n          <div class=\"mp-service-info-card\" id=\"mpServiceInfoCard\">\r\n            <p>Call<\/p>\r\n            <h3>Request Taken in Charge<\/h3>\r\n            <span>\r\n The 24\/7 Call Center receives the request and starts the support process to minimise inconvenience.\r\n            <\/span>\r\n          <\/div>\r\n\r\n          <div class=\"mp-service-check-panel\">\r\n            <p>Service Routine<\/p>\r\n\r\n            <div class=\"mp-service-check is-active\" data-check=\"request\">\r\n              <i><\/i>\r\n              <span>Request Handling<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mp-service-check\" data-check=\"dispatch\">\r\n              <i><\/i>\r\n              <span>Local Technician<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mp-service-check\" data-check=\"diagnosis\">\r\n              <i><\/i>\r\n              <span>Technical Diagnosis<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mp-service-check\" data-check=\"prevention\">\r\n              <i><\/i>\r\n              <span>Periodic Inspections<\/span>\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div class=\"mp-service-metrics\" id=\"mpServiceMetrics\">\r\n            <div>\r\n              <span>Safety<\/span>\r\n              <i><em><\/em><\/i>\r\n            <\/div>\r\n\r\n            <div>\r\n              <span>Continuity<\/span>\r\n              <i><em><\/em><\/i>\r\n            <\/div>\r\n\r\n            <div>\r\n              <span>Reliability<\/span>\r\n              <i><em><\/em><\/i>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n  <\/section>\r\n\r\n\r\n<\/div>\r\n\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/three.js\/r128\/three.min.js\"><\/script>\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/gsap\/3.12.5\/gsap.min.js\"><\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2371314 elementor-widget elementor-widget-shortcode\" data-id=\"2371314\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><section class=\"section mp-quote-section\" id=\"preventivo\">\r\n  <div class=\"mp-quote-bg\"><\/div>\r\n  <div class=\"mp-quote-overlay\"><\/div>\r\n\r\n  <div class=\"mp-quote-inner\">\r\n    <div class=\"mp-quote-info\">\r\n      <p class=\"mp-quote-kicker\">Contact us<\/p>\r\n\r\n      <h2 class=\"mp-quote-title\">\r\n        Request a<br>\r\n        free<br>\r\n        quote\r\n      <\/h2>\r\n\r\n      <p class=\"mp-quote-description\">\r\n        Are you interested in our products or looking for a solution\r\n        tailored specifically to your needs? Please get in touch:\r\n        we are here to assist you and help you choose\r\n        the solution that best meets your requirements.\r\n      <\/p>\r\n\r\n      <div class=\"mp-quote-contacts\">\r\n        <a href=\"tel:+390296690901\" class=\"mp-quote-contact\">\r\n          <span class=\"mp-quote-contact-icon\">\r\n            <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <path d=\"M22 16.92v3a2 2 0 0 1-2.18 2A19.86 19.86 0 0 1 11.19 19 19.5 19.5 0 0 1 5 12.81 19.86 19.86 0 0 1 2.08 4.18 2 2 0 0 1 4.06 2h3a2 2 0 0 1 2 1.72c.12.9.33 1.78.62 2.63a2 2 0 0 1-.45 2.11L8 9.69a16 16 0 0 0 6.31 6.31l1.23-1.23a2 2 0 0 1 2.11-.45c.85.29 1.73.5 2.63.62A2 2 0 0 1 22 16.92z\"><\/path>\r\n            <\/svg>\r\n          <\/span>\r\n\r\n          <span>\r\n            <strong>Phone<\/strong>\r\n            +39 02 96690901\r\n          <\/span>\r\n        <\/a>\r\n\r\n        <a href=\"mailto:info@millepiani.com\" class=\"mp-quote-contact\">\r\n          <span class=\"mp-quote-contact-icon\">\r\n            <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <path d=\"M4 4h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z\"><\/path>\r\n              <path d=\"m22 6-10 7L2 6\"><\/path>\r\n            <\/svg>\r\n          <\/span>\r\n\r\n          <span>\r\n            <strong>Email<\/strong>\r\n            info@millepiani.com\r\n          <\/span>\r\n        <\/a>\r\n\r\n        <div class=\"mp-quote-contact\">\r\n          <span class=\"mp-quote-contact-icon\">\r\n            <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <path d=\"M21 10c0 7-9 12-9 12S3 17 3 10a9 9 0 1 1 18 0z\"><\/path>\r\n              <circle cx=\"12\" cy=\"10\" r=\"3\"><\/circle>\r\n            <\/svg>\r\n          <\/span>\r\n\r\n          <span>\r\n            <strong>Office<\/strong>\r\n            Via Della Longura, 21 Misinto MB\r\n          <\/span>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"mp-quote-form-card\">\r\n      <form\r\n        class=\"mp-quote-form\"\r\n        id=\"mpQuoteForm\"\r\n        enctype=\"multipart\/form-data\"\r\n        data-success-url=\"\/grazie\/\"\r\n        novalidate\r\n      >\r\n        <div\r\n          class=\"mp-form-status\"\r\n          id=\"mpFormStatus\"\r\n          aria-live=\"polite\"\r\n        ><\/div>\r\n\r\n        <!-- Anti-spam honeypot -->\r\n        <input\r\n          type=\"text\"\r\n          name=\"website\"\r\n          tabindex=\"-1\"\r\n          autocomplete=\"off\"\r\n          aria-hidden=\"true\"\r\n          style=\"position:absolute;left:-9999px;opacity:0;height:0;width:0;\"\r\n        >\r\n\r\n        <div class=\"mp-form-grid\">\r\n          <div class=\"mp-field\">\r\n            <input\r\n              type=\"text\"\r\n              name=\"name\"\r\n              id=\"mpName\"\r\n              placeholder=\" \"\r\n              required\r\n              autocomplete=\"given-name\"\r\n            >\r\n            <label for=\"mpName\">First name *<\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-field\">\r\n            <input\r\n              type=\"text\"\r\n              name=\"surname\"\r\n              id=\"mpSurname\"\r\n              placeholder=\" \"\r\n              required\r\n              autocomplete=\"family-name\"\r\n            >\r\n            <label for=\"mpSurname\">Last name *<\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-field\">\r\n            <input\r\n              type=\"email\"\r\n              name=\"email\"\r\n              id=\"mpEmail\"\r\n              placeholder=\" \"\r\n              required\r\n              autocomplete=\"email\"\r\n            >\r\n            <label for=\"mpEmail\">Email *<\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-field\">\r\n            <input\r\n              type=\"tel\"\r\n              name=\"phone\"\r\n              id=\"mpPhone\"\r\n              placeholder=\" \"\r\n              required\r\n              autocomplete=\"tel\"\r\n            >\r\n            <label for=\"mpPhone\">Phone number<\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-field\">\r\n            <select name=\"role\" id=\"mpRole\">\r\n              <option value=\"\" selected>Select<\/option>\r\n              <option value=\"progettista\">Designer<\/option>\r\n              <option value=\"impresa_di_costruzioni\">\r\n                Construction company\r\n              <\/option>\r\n              <option value=\"proprietario_edificio\">\r\n                Building owner\r\n              <\/option>\r\n              <option value=\"amministratore_edificio\">\r\n                Building manager\r\n              <\/option>\r\n              <option value=\"consulente_ascensori\">\r\n                Lift consultant\r\n              <\/option>\r\n              <option value=\"ente_pubblico\">Public authority<\/option>\r\n              <option value=\"cerco_lavoro\">Job seeker<\/option>\r\n              <option value=\"utente_passeggero\">\r\n                User\/Passenger\r\n              <\/option>\r\n              <option value=\"studente\">Student<\/option>\r\n              <option value=\"altro\">Other<\/option>\r\n            <\/select>\r\n\r\n            <label for=\"mpRole\">What is your role?<\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-field\">\r\n            <input\r\n              type=\"text\"\r\n              name=\"company\"\r\n              id=\"mpCompany\"\r\n              placeholder=\" \"\r\n              autocomplete=\"organization\"\r\n            >\r\n            <label for=\"mpCompany\">Company name<\/label>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"mp-form-grid mp-location-grid\">\r\n          <div class=\"mp-field\">\r\n            <select\r\n              name=\"country\"\r\n              id=\"mpCountry\"\r\n              required\r\n              autocomplete=\"country-name\"\r\n            >\r\n              <option value=\"italia\" selected>Italy<\/option>\r\n              <option value=\"estero\">Outside Italy<\/option>\r\n            <\/select>\r\n\r\n            <label for=\"mpCountry\">Country\/Region *<\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-field\">\r\n            <select\r\n              name=\"province\"\r\n              id=\"mpProvince\"\r\n              required\r\n              autocomplete=\"address-level2\"\r\n            >\r\n              <option value=\"\" selected disabled>Select<\/option>\r\n              <option value=\"AG\">Agrigento<\/option>\r\n              <option value=\"AL\">Alessandria<\/option>\r\n              <option value=\"AN\">Ancona<\/option>\r\n              <option value=\"AO\">Aosta<\/option>\r\n              <option value=\"AR\">Arezzo<\/option>\r\n              <option value=\"AP\">Ascoli Piceno<\/option>\r\n              <option value=\"AT\">Asti<\/option>\r\n              <option value=\"AV\">Avellino<\/option>\r\n              <option value=\"BA\">Bari<\/option>\r\n              <option value=\"BT\">Barletta-Andria-Trani<\/option>\r\n              <option value=\"BL\">Belluno<\/option>\r\n              <option value=\"BN\">Benevento<\/option>\r\n              <option value=\"BG\">Bergamo<\/option>\r\n              <option value=\"BI\">Biella<\/option>\r\n              <option value=\"BO\">Bologna<\/option>\r\n              <option value=\"BZ\">Bolzano<\/option>\r\n              <option value=\"BS\">Brescia<\/option>\r\n              <option value=\"BR\">Brindisi<\/option>\r\n              <option value=\"CA\">Cagliari<\/option>\r\n              <option value=\"CL\">Caltanissetta<\/option>\r\n              <option value=\"CB\">Campobasso<\/option>\r\n              <option value=\"CE\">Caserta<\/option>\r\n              <option value=\"CT\">Catania<\/option>\r\n              <option value=\"CZ\">Catanzaro<\/option>\r\n              <option value=\"CH\">Chieti<\/option>\r\n              <option value=\"CO\">Como<\/option>\r\n              <option value=\"CS\">Cosenza<\/option>\r\n              <option value=\"CR\">Cremona<\/option>\r\n              <option value=\"KR\">Crotone<\/option>\r\n              <option value=\"CN\">Cuneo<\/option>\r\n              <option value=\"EN\">Enna<\/option>\r\n              <option value=\"FM\">Fermo<\/option>\r\n              <option value=\"FE\">Ferrara<\/option>\r\n              <option value=\"FI\">Florence<\/option>\r\n              <option value=\"FG\">Foggia<\/option>\r\n              <option value=\"FC\">Forl\u00ec-Cesena<\/option>\r\n              <option value=\"FR\">Frosinone<\/option>\r\n              <option value=\"GE\">Genoa<\/option>\r\n              <option value=\"GO\">Gorizia<\/option>\r\n              <option value=\"GR\">Grosseto<\/option>\r\n              <option value=\"IM\">Imperia<\/option>\r\n              <option value=\"IS\">Isernia<\/option>\r\n              <option value=\"SP\">La Spezia<\/option>\r\n              <option value=\"AQ\">L'Aquila<\/option>\r\n              <option value=\"LT\">Latina<\/option>\r\n              <option value=\"LE\">Lecce<\/option>\r\n              <option value=\"LC\">Lecco<\/option>\r\n              <option value=\"LI\">Livorno<\/option>\r\n              <option value=\"LO\">Lodi<\/option>\r\n              <option value=\"LU\">Lucca<\/option>\r\n              <option value=\"MC\">Macerata<\/option>\r\n              <option value=\"MN\">Mantua<\/option>\r\n              <option value=\"MS\">Massa-Carrara<\/option>\r\n              <option value=\"MT\">Matera<\/option>\r\n              <option value=\"ME\">Messina<\/option>\r\n              <option value=\"MI\">Milan<\/option>\r\n              <option value=\"MO\">Modena<\/option>\r\n              <option value=\"MB\">Monza and Brianza<\/option>\r\n              <option value=\"NA\">Naples<\/option>\r\n              <option value=\"NO\">Novara<\/option>\r\n              <option value=\"NU\">Nuoro<\/option>\r\n              <option value=\"OR\">Oristano<\/option>\r\n              <option value=\"PD\">Padua<\/option>\r\n              <option value=\"PA\">Palermo<\/option>\r\n              <option value=\"PR\">Parma<\/option>\r\n              <option value=\"PV\">Pavia<\/option>\r\n              <option value=\"PG\">Perugia<\/option>\r\n              <option value=\"PU\">Pesaro and Urbino<\/option>\r\n              <option value=\"PE\">Pescara<\/option>\r\n              <option value=\"PC\">Piacenza<\/option>\r\n              <option value=\"PI\">Pisa<\/option>\r\n              <option value=\"PT\">Pistoia<\/option>\r\n              <option value=\"PN\">Pordenone<\/option>\r\n              <option value=\"PZ\">Potenza<\/option>\r\n              <option value=\"PO\">Prato<\/option>\r\n              <option value=\"RG\">Ragusa<\/option>\r\n              <option value=\"RA\">Ravenna<\/option>\r\n              <option value=\"RC\">Reggio Calabria<\/option>\r\n              <option value=\"RE\">Reggio Emilia<\/option>\r\n              <option value=\"RI\">Rieti<\/option>\r\n              <option value=\"RN\">Rimini<\/option>\r\n              <option value=\"RM\">Rome<\/option>\r\n              <option value=\"RO\">Rovigo<\/option>\r\n              <option value=\"SA\">Salerno<\/option>\r\n              <option value=\"SS\">Sassari<\/option>\r\n              <option value=\"SV\">Savona<\/option>\r\n              <option value=\"SI\">Siena<\/option>\r\n              <option value=\"SR\">Syracuse<\/option>\r\n              <option value=\"SO\">Sondrio<\/option>\r\n              <option value=\"SU\">South Sardinia<\/option>\r\n              <option value=\"TA\">Taranto<\/option>\r\n              <option value=\"TE\">Teramo<\/option>\r\n              <option value=\"TR\">Terni<\/option>\r\n              <option value=\"TO\">Turin<\/option>\r\n              <option value=\"TP\">Trapani<\/option>\r\n              <option value=\"TN\">Trento<\/option>\r\n              <option value=\"TV\">Treviso<\/option>\r\n              <option value=\"TS\">Trieste<\/option>\r\n              <option value=\"UD\">Udine<\/option>\r\n              <option value=\"VA\">Varese<\/option>\r\n              <option value=\"VE\">Venice<\/option>\r\n              <option value=\"VB\">Verbano-Cusio-Ossola<\/option>\r\n              <option value=\"VC\">Vercelli<\/option>\r\n              <option value=\"VR\">Verona<\/option>\r\n              <option value=\"VV\">Vibo Valentia<\/option>\r\n              <option value=\"VI\">Vicenza<\/option>\r\n              <option value=\"VT\">Viterbo<\/option>\r\n              <option value=\"ESTERO\">Province outside Italy<\/option>\r\n            <\/select>\r\n\r\n            <label for=\"mpProvince\">Province *<\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-field\">\r\n            <input\r\n              type=\"text\"\r\n              name=\"city\"\r\n              id=\"mpCity\"\r\n              placeholder=\" \"\r\n              required\r\n              autocomplete=\"address-level2\"\r\n            >\r\n            <label for=\"mpCity\">City *<\/label>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"mp-field mp-field-full\">\r\n          <select\r\n            name=\"contact_reason\"\r\n            id=\"mpContactReason\"\r\n            required\r\n          >\r\n            <option value=\"\" selected disabled>Select<\/option>\r\n            <option value=\"nuovo_impianto\">\r\n              Installing a new lift in a new\/existing building\r\n            <\/option>\r\n            <option value=\"sostituzione_ascensore\">\r\n              Replacing an existing lift\r\n            <\/option>\r\n            <option value=\"ammodernamento_impianto\">\r\n              Modernising a lift\r\n            <\/option>\r\n            <option value=\"assistenza_manutenzione\">\r\n              I am interested in support and maintenance services\r\n            <\/option>\r\n            <option value=\"ricambi\">\r\n              Spare parts for Millepiani lifts\r\n            <\/option>\r\n            <option value=\"altro\">Other<\/option>\r\n          <\/select>\r\n\r\n          <label for=\"mpContactReason\">\r\n            What would you like us to contact you about? *\r\n          <\/label>\r\n        <\/div>\r\n\r\n        <div class=\"mp-field mp-field-full\">\r\n          <textarea\r\n            name=\"message\"\r\n            id=\"mpMessage\"\r\n            rows=\"4\"\r\n            placeholder=\" \"\r\n          ><\/textarea>\r\n\r\n          <label for=\"mpMessage\">How can we help you?<\/label>\r\n        <\/div>\r\n\r\n        <div class=\"mp-form-foot\">\r\n          <div class=\"mp-privacy-box\">\r\n            <label\r\n              class=\"mp-privacy-check\"\r\n              for=\"mpPrivacyAcceptance\"\r\n            >\r\n              <input\r\n                type=\"checkbox\"\r\n                name=\"privacy_acceptance\"\r\n                id=\"mpPrivacyAcceptance\"\r\n                value=\"accepted\"\r\n                required\r\n              >\r\n\r\n              <span>\r\n                I accept the\r\n                <a\r\n                  href=\"\/privacy-policy\/\"\r\n                  target=\"_blank\"\r\n                  rel=\"noopener noreferrer\"\r\n                >\r\n                  Privacy Policy\r\n                <\/a>. *\r\n              <\/span>\r\n            <\/label>\r\n\r\n            <label\r\n              class=\"mp-privacy-check\"\r\n              for=\"mpExistingContract\"\r\n            >\r\n              <input\r\n                type=\"checkbox\"\r\n                name=\"existing_contract\"\r\n                id=\"mpExistingContract\"\r\n                value=\"yes\"\r\n              >\r\n\r\n              <span>\r\n                I already have a contract with Millepiani\r\n              <\/span>\r\n            <\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-captcha\">\r\n            <div\r\n              class=\"g-recaptcha\"\r\n              data-sitekey=\"6LfxY6ktAAAAAFBbvnofa2IpjG_zaaX5UdOtJuTS\"\r\n            ><\/div>\r\n          <\/div>\r\n\r\n          <button type=\"submit\" class=\"mp-submit-btn\">\r\n            <span>Send message<\/span>\r\n          <\/button>\r\n        <\/div>\r\n      <\/form>\r\n    <\/div>\r\n  <\/div>\r\n<\/section><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c64e18f elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-shortcode\" data-id=\"c64e18f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><script>document.documentElement.classList.add(\"mp-js-ready\");\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Reveal animation\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  const revealItems = document.querySelectorAll(\".mp-reveal\");\r\n\r\n  if (\"IntersectionObserver\" in window) {\r\n    const revealObserver = new IntersectionObserver(function (entries, observer) {\r\n      entries.forEach(function (entry) {\r\n        if (!entry.isIntersecting) return;\r\n\r\n        entry.target.classList.add(\"is-visible\");\r\n        observer.unobserve(entry.target);\r\n      });\r\n    }, {\r\n      threshold: 0.16\r\n    });\r\n\r\n    revealItems.forEach(function (item) {\r\n      revealObserver.observe(item);\r\n    });\r\n  } else {\r\n    revealItems.forEach(function (item) {\r\n      item.classList.add(\"is-visible\");\r\n    });\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Smooth scroll\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  document.querySelectorAll('a[href^=\"#\"]').forEach(function (anchor) {\r\n    anchor.addEventListener(\"click\", function (event) {\r\n      const targetId = anchor.getAttribute(\"href\");\r\n\r\n      if (!targetId || targetId === \"#\") return;\r\n\r\n      const target = document.querySelector(targetId);\r\n\r\n      if (!target) return;\r\n\r\n      event.preventDefault();\r\n\r\n      target.scrollIntoView({\r\n        behavior: \"smooth\",\r\n        block: \"start\"\r\n      });\r\n    });\r\n  });\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Service Lab language\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  const pageLang = (document.documentElement.lang || \"it\")\r\n    .toLowerCase()\r\n    .split(\"-\")[0];\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Service Lab translations\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  const serviceTranslations = {\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | ITALIANO\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    it: {\r\n      phases: {\r\n        call: {\r\n          kicker: \"Call Center 24\/24\",\r\n          title: \"La richiesta<br>viene presa in carico\",\r\n          text: \"Il servizio operativo 24 ore su 24 riceve la chiamata e attiva il flusso di assistenza per ascensori, montacarichi e scale mobili.\",\r\n          tags: [\"Assistenza 24\/24\", \"Tempestivit\u00e0\", \"Presa in carico\"],\r\n          cardLabel: \"Chiamata\",\r\n          cardTitle: \"Richiesta presa in carico\",\r\n          cardText: \"Il Call Center operativo 24 ore su 24 riceve la richiesta e avvia il flusso di assistenza per ridurre al minimo i disagi.\",\r\n          status: \"Sistema attivo\",\r\n          metric: \"24\/24\",\r\n          liftY: -1.25,\r\n          goodsY: -0.25,\r\n          checks: [\"request\"],\r\n          speed: 1\r\n        },\r\n\r\n        technician: {\r\n          kicker: \"Tecnico di zona\",\r\n          title: \"La richiesta<br>raggiunge il tecnico\",\r\n          text: \"Le richieste vengono veicolate al tecnico di zona per favorire interventi tempestivi e mirati sul territorio.\",\r\n          tags: [\"Tecnico di zona\", \"Territorio nazionale\", \"Intervento rapido\"],\r\n          cardLabel: \"Tecnico\",\r\n          cardTitle: \"Intervento rapido sul territorio\",\r\n          cardText: \"Il servizio indirizza la richiesta al tecnico di zona, permettendo una gestione pi\u00f9 rapida e coordinata dell\u2019intervento.\",\r\n          status: \"Tecnico avvisato\",\r\n          metric: \"ON\",\r\n          liftY: 0.05,\r\n          goodsY: 0.22,\r\n          checks: [\"request\", \"dispatch\"],\r\n          speed: 1.18\r\n        },\r\n\r\n        diagnosis: {\r\n          kicker: \"Diagnosi tecnica\",\r\n          title: \"L\u2019impianto<br>viene analizzato\",\r\n          text: \"Strumentazione elettronica e digitale supporta la lettura dello stato dell\u2019impianto e aiuta a individuare criticit\u00e0 o necessit\u00e0 di aggiornamento.\",\r\n          tags: [\"Diagnosi\", \"Tecnologia digitale\", \"Controllo\"],\r\n          cardLabel: \"Diagnosi\",\r\n          cardTitle: \"Controllo tecnico dell\u2019impianto\",\r\n          cardText: \"La diagnostica consente di analizzare il comportamento dell\u2019impianto e supportare attivit\u00e0 di manutenzione, aggiornamento e miglioramento.\",\r\n          status: \"Diagnosi attiva\",\r\n          metric: \"SCAN\",\r\n          liftY: 1.15,\r\n          goodsY: 0.58,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\"],\r\n          speed: 1.32\r\n        },\r\n\r\n        check: {\r\n          kicker: \"Verifiche periodiche\",\r\n          title: \"La sicurezza<br>si costruisce nel tempo\",\r\n          text: \"Le verifiche periodiche aiutano a mantenere costante il livello di performance dell\u2019impianto e a prevenire eventuali problematiche.\",\r\n          tags: [\"Verifiche periodiche\", \"Prevenzione\", \"Affidabilit\u00e0\"],\r\n          cardLabel: \"Verifica\",\r\n          cardTitle: \"Performance costanti nel tempo\",\r\n          cardText: \"La manutenzione programmata contribuisce a conservare sicurezza, affidabilit\u00e0 e continuit\u00e0 di servizio nel tempo.\",\r\n          status: \"Verifica periodica\",\r\n          metric: \"OK\",\r\n          liftY: -0.45,\r\n          goodsY: 0.02,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\", \"prevention\"],\r\n          speed: 0.9\r\n        }\r\n      },\r\n\r\n      plants: {\r\n        lift: {\r\n          label: \"Ascensore\"\r\n        },\r\n        goods: {\r\n          label: \"Montacarichi\"\r\n        },\r\n        escalator: {\r\n          label: \"Scala mobile\"\r\n        }\r\n      }\r\n    },\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | ENGLISH\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    en: {\r\n      phases: {\r\n        call: {\r\n          kicker: \"24\/7 Call Center\",\r\n          title: \"Your request<br>is received\",\r\n          text: \"Our 24\/7 service receives the call and activates the assistance process for lifts, goods lifts and escalators.\",\r\n          tags: [\"24\/7 Assistance\", \"Fast Response\", \"Request Management\"],\r\n          cardLabel: \"Call\",\r\n          cardTitle: \"Request received\",\r\n          cardText: \"Our 24\/7 Call Center receives the request and starts the assistance process to minimise disruption.\",\r\n          status: \"System active\",\r\n          metric: \"24\/7\",\r\n          liftY: -1.25,\r\n          goodsY: -0.25,\r\n          checks: [\"request\"],\r\n          speed: 1\r\n        },\r\n\r\n        technician: {\r\n          kicker: \"Local technician\",\r\n          title: \"The request<br>reaches the technician\",\r\n          text: \"Requests are forwarded to the local technician to ensure fast and targeted on-site assistance.\",\r\n          tags: [\"Local technician\", \"Nationwide coverage\", \"Fast response\"],\r\n          cardLabel: \"Technician\",\r\n          cardTitle: \"Fast on-site assistance\",\r\n          cardText: \"The service forwards the request to the local technician, enabling faster and more coordinated intervention management.\",\r\n          status: \"Technician notified\",\r\n          metric: \"ON\",\r\n          liftY: 0.05,\r\n          goodsY: 0.22,\r\n          checks: [\"request\", \"dispatch\"],\r\n          speed: 1.18\r\n        },\r\n\r\n        diagnosis: {\r\n          kicker: \"Technical diagnostics\",\r\n          title: \"The system<br>is analysed\",\r\n          text: \"Electronic and digital equipment supports system status monitoring and helps identify critical issues or upgrade requirements.\",\r\n          tags: [\"Diagnostics\", \"Digital technology\", \"Monitoring\"],\r\n          cardLabel: \"Diagnostics\",\r\n          cardTitle: \"Technical system inspection\",\r\n          cardText: \"Diagnostic tools make it possible to analyse system performance and support maintenance, upgrades and improvement activities.\",\r\n          status: \"Diagnostics active\",\r\n          metric: \"SCAN\",\r\n          liftY: 1.15,\r\n          goodsY: 0.58,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\"],\r\n          speed: 1.32\r\n        },\r\n\r\n        check: {\r\n          kicker: \"Periodic inspections\",\r\n          title: \"Safety<br>is built over time\",\r\n          text: \"Periodic inspections help maintain consistent system performance and prevent potential issues.\",\r\n          tags: [\"Periodic inspections\", \"Prevention\", \"Reliability\"],\r\n          cardLabel: \"Inspection\",\r\n          cardTitle: \"Consistent performance over time\",\r\n          cardText: \"Scheduled maintenance helps preserve safety, reliability and continuity of service over time.\",\r\n          status: \"Periodic inspection\",\r\n          metric: \"OK\",\r\n          liftY: -0.45,\r\n          goodsY: 0.02,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\", \"prevention\"],\r\n          speed: 0.9\r\n        }\r\n      },\r\n\r\n      plants: {\r\n        lift: {\r\n          label: \"Lift\"\r\n        },\r\n        goods: {\r\n          label: \"Goods lift\"\r\n        },\r\n        escalator: {\r\n          label: \"Escalator\"\r\n        }\r\n      }\r\n    },\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | FRAN\u00c7AIS\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    fr: {\r\n      phases: {\r\n        call: {\r\n          kicker: \"Centre d\u2019assistance 24h\/24\",\r\n          title: \"La demande<br>est prise en charge\",\r\n          text: \"Notre service op\u00e9rationnel 24h\/24 re\u00e7oit l\u2019appel et d\u00e9clenche le processus d\u2019assistance pour les ascenseurs, monte-charges et escaliers m\u00e9caniques.\",\r\n          tags: [\"Assistance 24h\/24\", \"R\u00e9activit\u00e9\", \"Prise en charge\"],\r\n          cardLabel: \"Appel\",\r\n          cardTitle: \"Demande prise en charge\",\r\n          cardText: \"Notre centre d\u2019assistance op\u00e9rationnel 24h\/24 re\u00e7oit la demande et lance le processus d\u2019intervention afin de r\u00e9duire au minimum les d\u00e9sagr\u00e9ments.\",\r\n          status: \"Syst\u00e8me actif\",\r\n          metric: \"24\/24\",\r\n          liftY: -1.25,\r\n          goodsY: -0.25,\r\n          checks: [\"request\"],\r\n          speed: 1\r\n        },\r\n\r\n        technician: {\r\n          kicker: \"Technicien local\",\r\n          title: \"La demande<br>parvient au technicien\",\r\n          text: \"Les demandes sont transmises au technicien local afin de garantir des interventions rapides et cibl\u00e9es sur le terrain.\",\r\n          tags: [\"Technicien local\", \"Couverture nationale\", \"Intervention rapide\"],\r\n          cardLabel: \"Technicien\",\r\n          cardTitle: \"Intervention rapide sur le terrain\",\r\n          cardText: \"Le service transmet la demande au technicien local, permettant une gestion plus rapide et mieux coordonn\u00e9e de l\u2019intervention.\",\r\n          status: \"Technicien inform\u00e9\",\r\n          metric: \"ON\",\r\n          liftY: 0.05,\r\n          goodsY: 0.22,\r\n          checks: [\"request\", \"dispatch\"],\r\n          speed: 1.18\r\n        },\r\n\r\n        diagnosis: {\r\n          kicker: \"Diagnostic technique\",\r\n          title: \"L\u2019installation<br>est analys\u00e9e\",\r\n          text: \"Des \u00e9quipements \u00e9lectroniques et num\u00e9riques permettent de contr\u00f4ler l\u2019\u00e9tat de l\u2019installation et d\u2019identifier les \u00e9ventuelles anomalies ou besoins de modernisation.\",\r\n          tags: [\"Diagnostic\", \"Technologie num\u00e9rique\", \"Contr\u00f4le\"],\r\n          cardLabel: \"Diagnostic\",\r\n          cardTitle: \"Contr\u00f4le technique de l\u2019installation\",\r\n          cardText: \"Le diagnostic permet d\u2019analyser le fonctionnement de l\u2019installation et d\u2019accompagner les op\u00e9rations de maintenance, de modernisation et d\u2019am\u00e9lioration.\",\r\n          status: \"Diagnostic actif\",\r\n          metric: \"SCAN\",\r\n          liftY: 1.15,\r\n          goodsY: 0.58,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\"],\r\n          speed: 1.32\r\n        },\r\n\r\n        check: {\r\n          kicker: \"Contr\u00f4les p\u00e9riodiques\",\r\n          title: \"La s\u00e9curit\u00e9<br>se construit dans le temps\",\r\n          text: \"Les contr\u00f4les p\u00e9riodiques contribuent \u00e0 maintenir un niveau de performance constant de l\u2019installation et \u00e0 pr\u00e9venir d\u2019\u00e9ventuels probl\u00e8mes.\",\r\n          tags: [\"Contr\u00f4les p\u00e9riodiques\", \"Pr\u00e9vention\", \"Fiabilit\u00e9\"],\r\n          cardLabel: \"Contr\u00f4le\",\r\n          cardTitle: \"Des performances constantes dans le temps\",\r\n          cardText: \"La maintenance programm\u00e9e contribue \u00e0 pr\u00e9server la s\u00e9curit\u00e9, la fiabilit\u00e9 et la continuit\u00e9 du service dans le temps.\",\r\n          status: \"Contr\u00f4le p\u00e9riodique\",\r\n          metric: \"OK\",\r\n          liftY: -0.45,\r\n          goodsY: 0.02,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\", \"prevention\"],\r\n          speed: 0.9\r\n        }\r\n      },\r\n\r\n      plants: {\r\n        lift: {\r\n          label: \"Ascenseur\"\r\n        },\r\n        goods: {\r\n          label: \"Monte-charge\"\r\n        },\r\n        escalator: {\r\n          label: \"Escalier m\u00e9canique\"\r\n        }\r\n      }\r\n    },\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | \u0420\u0423\u0421\u0421\u041a\u0418\u0419\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    ru: {\r\n      phases: {\r\n        call: {\r\n          kicker: \"\u041a\u043e\u043b\u043b-\u0446\u0435\u043d\u0442\u0440 24\/7\",\r\n          title: \"\u0417\u0430\u044f\u0432\u043a\u0430<br>\u043f\u0440\u0438\u043d\u044f\u0442\u0430 \u0432 \u0440\u0430\u0431\u043e\u0442\u0443\",\r\n          text: \"\u041d\u0430\u0448\u0430 \u043a\u0440\u0443\u0433\u043b\u043e\u0441\u0443\u0442\u043e\u0447\u043d\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0432\u043e\u043d\u043e\u043a \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043b\u0438\u0444\u0442\u043e\u0432, \u0433\u0440\u0443\u0437\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u044a\u0451\u043c\u043d\u0438\u043a\u043e\u0432 \u0438 \u044d\u0441\u043a\u0430\u043b\u0430\u0442\u043e\u0440\u043e\u0432.\",\r\n          tags: [\"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 24\/7\", \"\u041e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\", \"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u044f\u0432\u043a\u0438\"],\r\n          cardLabel: \"\u0417\u0432\u043e\u043d\u043e\u043a\",\r\n          cardTitle: \"\u0417\u0430\u044f\u0432\u043a\u0430 \u043f\u0440\u0438\u043d\u044f\u0442\u0430\",\r\n          cardText: \"\u041a\u0440\u0443\u0433\u043b\u043e\u0441\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u043a\u043e\u043b\u043b-\u0446\u0435\u043d\u0442\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u044f\u0432\u043a\u0443 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0441\u0432\u0435\u0441\u0442\u0438 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0443.\",\r\n          status: \"\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u0430\",\r\n          metric: \"24\/7\",\r\n          liftY: -1.25,\r\n          goodsY: -0.25,\r\n          checks: [\"request\"],\r\n          speed: 1\r\n        },\r\n\r\n        technician: {\r\n          kicker: \"\u041c\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\",\r\n          title: \"\u0417\u0430\u044f\u0432\u043a\u0430<br>\u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0443\",\r\n          text: \"\u0417\u0430\u044f\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043d\u043e\u043c\u0443 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0443, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0438 \u0446\u0435\u043b\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435.\",\r\n          tags: [\"\u041c\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\", \"\u0420\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0435\", \"\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0432\u044b\u0435\u0437\u0434\"],\r\n          cardLabel: \"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\",\r\n          cardTitle: \"\u041e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435\",\r\n          cardText: \"\u0421\u0435\u0440\u0432\u0438\u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0437\u0430\u044f\u0432\u043a\u0443 \u043c\u0435\u0441\u0442\u043d\u043e\u043c\u0443 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0443, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0438 \u0441\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0430\u0431\u043e\u0442.\",\r\n          status: \"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0451\u043d\",\r\n          metric: \"ON\",\r\n          liftY: 0.05,\r\n          goodsY: 0.22,\r\n          checks: [\"request\", \"dispatch\"],\r\n          speed: 1.18\r\n        },\r\n\r\n        diagnosis: {\r\n          kicker: \"\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\",\r\n          title: \"\u041e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435<br>\u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0443\",\r\n          text: \"\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0435 \u0438 \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c \u043d\u0435\u0438\u0441\u043f\u0440\u0430\u0432\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0430\u0446\u0438\u0438.\",\r\n          tags: [\"\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\", \"\u0426\u0438\u0444\u0440\u043e\u0432\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438\", \"\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\"],\r\n          cardLabel: \"\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\",\r\n          cardTitle: \"\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f\",\r\n          cardText: \"\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f, \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\",\r\n          status: \"\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u0430\",\r\n          metric: \"SCAN\",\r\n          liftY: 1.15,\r\n          goodsY: 0.58,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\"],\r\n          speed: 1.32\r\n        },\r\n\r\n        check: {\r\n          kicker: \"\u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\",\r\n          title: \"\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c<br>\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\",\r\n          text: \"\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043d\u0435\u0438\u0441\u043f\u0440\u0430\u0432\u043d\u043e\u0441\u0442\u0438.\",\r\n          tags: [\"\u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\", \"\u041f\u0440\u043e\u0444\u0438\u043b\u0430\u043a\u0442\u0438\u043a\u0430\", \"\u041d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c\"],\r\n          cardLabel: \"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\",\r\n          cardTitle: \"\u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0433\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438\",\r\n          cardText: \"\u041f\u043b\u0430\u043d\u043e\u0432\u043e\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c, \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c \u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f.\",\r\n          status: \"\u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\",\r\n          metric: \"OK\",\r\n          liftY: -0.45,\r\n          goodsY: 0.02,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\", \"prevention\"],\r\n          speed: 0.9\r\n        }\r\n      },\r\n\r\n      plants: {\r\n        lift: {\r\n          label: \"\u041b\u0438\u0444\u0442\"\r\n        },\r\n        goods: {\r\n          label: \"\u0413\u0440\u0443\u0437\u043e\u0432\u043e\u0439 \u043f\u043e\u0434\u044a\u0451\u043c\u043d\u0438\u043a\"\r\n        },\r\n        escalator: {\r\n          label: \"\u042d\u0441\u043a\u0430\u043b\u0430\u0442\u043e\u0440\"\r\n        }\r\n      }\r\n    }\r\n  };\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Service Lab data\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  const serviceData =\r\n    serviceTranslations[pageLang] ||\r\n    serviceTranslations.it;\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | DOM\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  const lab = document.querySelector(\".mp-service-lab\");\r\n  const bgCanvas = document.querySelector(\"#mpServiceLabCanvas\");\r\n  const bgCtx = bgCanvas ? bgCanvas.getContext(\"2d\") : null;\r\n\r\n  const kicker = document.querySelector(\"#mpServiceLabKicker\");\r\n  const title = document.querySelector(\"#mpServiceLabTitle\");\r\n  const text = document.querySelector(\"#mpServiceLabText\");\r\n  const tags = document.querySelector(\"#mpServiceLabTags\");\r\n  const card = document.querySelector(\"#mpServiceInfoCard\");\r\n  const floatingStatus = document.querySelector(\"#mpFloatingStatus\");\r\n  const floatingMetric = document.querySelector(\"#mpFloatingMetric\");\r\n  const modelCaption = document.querySelector(\"#mpModelCaption\");\r\n\r\n  const plantButtons = document.querySelectorAll(\"[data-plant]\");\r\n  const phaseButtons = document.querySelectorAll(\"[data-phase]\");\r\n  const checks = document.querySelectorAll(\".mp-service-check\");\r\n  const metricBars = document.querySelectorAll(\".mp-service-metrics i em\");\r\n\r\n  let currentPlant = \"lift\";\r\n  let currentPhase = \"call\";\r\n  let targetPulseSpeed = 1;\r\n  let pulseSpeed = 1;\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | UI functions\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function animateElement(element) {\r\n    if (!element) return;\r\n\r\n    if (window.gsap) {\r\n      gsap.fromTo(element,\r\n        { opacity: 0.35, y: 18 },\r\n        { opacity: 1, y: 0, duration: 0.48, ease: \"power3.out\" }\r\n      );\r\n      return;\r\n    }\r\n\r\n    element.animate([\r\n      { opacity: 0.35, transform: \"translateY(18px)\" },\r\n      { opacity: 1, transform: \"translateY(0)\" }\r\n    ], {\r\n      duration: 460,\r\n      easing: \"cubic-bezier(0.22, 1, 0.36, 1)\"\r\n    });\r\n  }\r\n\r\n  function animateMetrics() {\r\n    metricBars.forEach(function (bar) {\r\n      bar.style.transition = \"none\";\r\n      bar.style.width = \"0%\";\r\n\r\n      requestAnimationFrame(function () {\r\n        requestAnimationFrame(function () {\r\n          bar.style.transition = \"width 1150ms cubic-bezier(0.22, 1, 0.36, 1)\";\r\n          bar.style.width = \"100%\";\r\n        });\r\n      });\r\n    });\r\n  }\r\n\r\n  function centerActiveButton(button) {\r\n    if (!button || window.innerWidth > 900) return;\r\n\r\n    button.scrollIntoView({\r\n      behavior: \"smooth\",\r\n      block: \"nearest\",\r\n      inline: \"center\"\r\n    });\r\n  }\r\n\r\n  function setPhase(phaseKey) {\r\n    const phase = serviceData.phases[phaseKey];\r\n\r\n    if (!phase) return;\r\n\r\n    currentPhase = phaseKey;\r\n    targetPulseSpeed = phase.speed;\r\n\r\n    if (kicker) kicker.textContent = phase.kicker;\r\n    if (title) title.innerHTML = phase.title;\r\n    if (text) text.textContent = phase.text;\r\n    if (floatingStatus) floatingStatus.textContent = phase.status;\r\n    if (floatingMetric) floatingMetric.textContent = phase.metric;\r\n\r\n    if (tags) {\r\n      tags.innerHTML = \"\";\r\n\r\n      phase.tags.forEach(function (tag) {\r\n        const span = document.createElement(\"span\");\r\n        span.textContent = tag;\r\n        tags.appendChild(span);\r\n      });\r\n    }\r\n\r\n    if (card) {\r\n      card.innerHTML =\r\n        \"<p>\" + phase.cardLabel + \"<\/p>\" +\r\n        \"<h3>\" + phase.cardTitle + \"<\/h3>\" +\r\n        \"<span>\" + phase.cardText + \"<\/span>\";\r\n    }\r\n\r\n    checks.forEach(function (check) {\r\n      const key = check.getAttribute(\"data-check\");\r\n      check.classList.toggle(\"is-active\", phase.checks.indexOf(key) !== -1);\r\n    });\r\n\r\n    phaseButtons.forEach(function (button) {\r\n      const isActive = button.getAttribute(\"data-phase\") === phaseKey;\r\n\r\n      button.classList.toggle(\"is-active\", isActive);\r\n      button.setAttribute(\"aria-pressed\", isActive ? \"true\" : \"false\");\r\n\r\n      if (isActive) {\r\n        centerActiveButton(button);\r\n      }\r\n    });\r\n\r\n    animateMetrics();\r\n    animateElement(document.querySelector(\".mp-service-lab-head\"));\r\n    animateElement(card);\r\n\r\n    updateThreePhase();\r\n  }\r\n\r\n  function setPlant(plantKey) {\r\n    const plant = serviceData.plants[plantKey];\r\n\r\n    if (!plant) return;\r\n\r\n    currentPlant = plantKey;\r\n\r\n    plantButtons.forEach(function (button) {\r\n      const isActive = button.getAttribute(\"data-plant\") === plantKey;\r\n\r\n      button.classList.toggle(\"is-active\", isActive);\r\n      button.setAttribute(\"aria-pressed\", isActive ? \"true\" : \"false\");\r\n\r\n      if (isActive) {\r\n        centerActiveButton(button);\r\n      }\r\n    });\r\n\r\n    if (modelCaption) {\r\n      modelCaption.textContent = plant.label;\r\n    }\r\n\r\n    rebuildThreeModel();\r\n\r\n    if (window.gsap && threeRoot) {\r\n      gsap.fromTo(threeRoot.scale,\r\n        { x: 0.94, y: 0.94, z: 0.94 },\r\n        { x: 1, y: 1, z: 1, duration: 0.72, ease: \"power3.out\" }\r\n      );\r\n    }\r\n  }\r\n\r\n  plantButtons.forEach(function (button) {\r\n    button.addEventListener(\"click\", function () {\r\n      setPlant(button.getAttribute(\"data-plant\"));\r\n    });\r\n  });\r\n\r\n  phaseButtons.forEach(function (button) {\r\n    button.addEventListener(\"click\", function () {\r\n      setPhase(button.getAttribute(\"data-phase\"));\r\n    });\r\n  });\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Background canvas\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  let bgW = 0;\r\n  let bgH = 0;\r\n  let bgDpr = Math.min(window.devicePixelRatio || 1, 2);\r\n  let bgParticles = [];\r\n  let bgPackets = [];\r\n\r\n  function resizeBgCanvas() {\r\n    if (!bgCanvas || !bgCtx || !lab) return;\r\n\r\n    const rect = lab.getBoundingClientRect();\r\n\r\n    bgW = Math.max(1, rect.width);\r\n    bgH = Math.max(1, rect.height);\r\n    bgDpr = Math.min(window.devicePixelRatio || 1, 2);\r\n\r\n    bgCanvas.width = Math.floor(bgW * bgDpr);\r\n    bgCanvas.height = Math.floor(bgH * bgDpr);\r\n    bgCanvas.style.width = bgW + \"px\";\r\n    bgCanvas.style.height = bgH + \"px\";\r\n\r\n    bgCtx.setTransform(bgDpr, 0, 0, bgDpr, 0, 0);\r\n\r\n    bgParticles = [];\r\n    bgPackets = [];\r\n\r\n    const amount = Math.min(150, Math.max(70, Math.floor(bgW \/ 10)));\r\n\r\n    for (let i = 0; i < amount; i += 1) {\r\n      bgParticles.push({\r\n        x: Math.random() * bgW,\r\n        y: Math.random() * bgH,\r\n        vx: -0.16 + Math.random() * 0.32,\r\n        vy: -0.12 + Math.random() * 0.24,\r\n        r: 0.6 + Math.random() * 2.2,\r\n        alpha: 0.08 + Math.random() * 0.28,\r\n        phase: Math.random() * Math.PI * 2\r\n      });\r\n    }\r\n\r\n    for (let i = 0; i < 9; i += 1) {\r\n      bgPackets.push({\r\n        t: Math.random(),\r\n        path: i % 4,\r\n        speed: 0.0018 + Math.random() * 0.0028\r\n      });\r\n    }\r\n  }\r\n\r\n  function drawBgLine(a, b, alpha) {\r\n    const gradient = bgCtx.createLinearGradient(a.x, a.y, b.x, b.y);\r\n\r\n    gradient.addColorStop(0, \"rgba(255,255,255,0)\");\r\n    gradient.addColorStop(0.5, \"rgba(255,255,255,\" + alpha + \")\");\r\n    gradient.addColorStop(1, \"rgba(255,255,255,0)\");\r\n\r\n    bgCtx.beginPath();\r\n    bgCtx.moveTo(a.x, a.y);\r\n    bgCtx.lineTo(b.x, b.y);\r\n    bgCtx.strokeStyle = gradient;\r\n    bgCtx.lineWidth = 1;\r\n    bgCtx.stroke();\r\n  }\r\n\r\n  function drawBgCanvas(time) {\r\n    if (!bgCtx || !bgCanvas) return;\r\n\r\n    bgCtx.clearRect(0, 0, bgW, bgH);\r\n\r\n    pulseSpeed += (targetPulseSpeed - pulseSpeed) * 0.035;\r\n\r\n    const centerX = bgW * 0.56;\r\n    const centerY = bgH * 0.55;\r\n\r\n    const glow = bgCtx.createRadialGradient(\r\n      centerX,\r\n      centerY,\r\n      0,\r\n      centerX,\r\n      centerY,\r\n      Math.min(bgW, bgH) * 0.55\r\n    );\r\n\r\n    glow.addColorStop(0, \"rgba(255,255,255,0.14)\");\r\n    glow.addColorStop(0.34, \"rgba(255,255,255,0.045)\");\r\n    glow.addColorStop(1, \"rgba(255,255,255,0)\");\r\n\r\n    bgCtx.fillStyle = glow;\r\n    bgCtx.fillRect(0, 0, bgW, bgH);\r\n\r\n    bgParticles.forEach(function (p) {\r\n      p.x += p.vx * pulseSpeed;\r\n      p.y += p.vy * pulseSpeed;\r\n\r\n      p.x += Math.sin(time * 0.0006 + p.phase) * 0.08;\r\n      p.y += Math.cos(time * 0.0005 + p.phase) * 0.08;\r\n\r\n      if (p.x < -20) p.x = bgW + 20;\r\n      if (p.x > bgW + 20) p.x = -20;\r\n      if (p.y < -20) p.y = bgH + 20;\r\n      if (p.y > bgH + 20) p.y = -20;\r\n\r\n      const distance = Math.hypot(p.x - centerX, p.y - centerY);\r\n      const attraction = Math.max(0, 1 - distance \/ 420);\r\n\r\n      bgCtx.beginPath();\r\n      bgCtx.arc(p.x, p.y, p.r + attraction * 1.4, 0, Math.PI * 2);\r\n      bgCtx.fillStyle =\r\n        \"rgba(255,255,255,\" +\r\n        (p.alpha + attraction * 0.22) +\r\n        \")\";\r\n      bgCtx.fill();\r\n    });\r\n\r\n    const points = {\r\n      a: { x: bgW * 0.18, y: bgH * 0.68 },\r\n      b: { x: bgW * 0.42, y: bgH * 0.43 },\r\n      c: { x: bgW * 0.64, y: bgH * 0.52 },\r\n      d: { x: bgW * 0.82, y: bgH * 0.34 },\r\n      e: { x: bgW * 0.74, y: bgH * 0.72 }\r\n    };\r\n\r\n    drawBgLine(\r\n      points.a,\r\n      points.b,\r\n      currentPhase === \"call\" ? 0.55 : 0.12\r\n    );\r\n\r\n    drawBgLine(\r\n      points.b,\r\n      points.c,\r\n      currentPhase === \"technician\" ? 0.55 : 0.12\r\n    );\r\n\r\n    drawBgLine(\r\n      points.c,\r\n      points.d,\r\n      currentPhase === \"diagnosis\" ? 0.55 : 0.12\r\n    );\r\n\r\n    drawBgLine(\r\n      points.c,\r\n      points.e,\r\n      currentPhase === \"check\" ? 0.55 : 0.12\r\n    );\r\n\r\n    const paths = [\r\n      [points.a, points.b],\r\n      [points.b, points.c],\r\n      [points.c, points.d],\r\n      [points.c, points.e]\r\n    ];\r\n\r\n    bgPackets.forEach(function (packet) {\r\n      const path = paths[packet.path % paths.length];\r\n      const a = path[0];\r\n      const b = path[1];\r\n\r\n      packet.t += packet.speed * pulseSpeed;\r\n\r\n      if (packet.t > 1) {\r\n        packet.t = 0;\r\n        packet.path = (packet.path + 1) % paths.length;\r\n      }\r\n\r\n      const x = a.x + (b.x - a.x) * packet.t;\r\n      const y = a.y + (b.y - a.y) * packet.t;\r\n\r\n      bgCtx.beginPath();\r\n      bgCtx.arc(x, y, 3.2, 0, Math.PI * 2);\r\n      bgCtx.fillStyle = \"rgba(255,255,255,0.82)\";\r\n      bgCtx.shadowColor = \"rgba(255,255,255,0.82)\";\r\n      bgCtx.shadowBlur = 16;\r\n      bgCtx.fill();\r\n      bgCtx.shadowBlur = 0;\r\n    });\r\n\r\n    requestAnimationFrame(drawBgCanvas);\r\n  }\r\n\r\n  if (bgCtx) {\r\n    resizeBgCanvas();\r\n    window.addEventListener(\"resize\", resizeBgCanvas);\r\n    requestAnimationFrame(drawBgCanvas);\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | THREE.JS 3D models\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  const threeCanvas = document.querySelector(\"#mpServiceThreeCanvas\");\r\n  const frame = document.querySelector(\"#mpServiceModelFrame\");\r\n\r\n  let renderer;\r\n  let scene;\r\n  let camera;\r\n  let threeRoot;\r\n  let activeModelGroup;\r\n  let liftCabin3D;\r\n  let goodsCabin3D;\r\n  let escalatorSteps = [];\r\n\r\n  let activeAnimationTargets = {\r\n    liftY: -1.25,\r\n    goodsY: -0.25\r\n  };\r\n\r\n\r\n  function mat(\r\n    color,\r\n    roughness,\r\n    metalness,\r\n    opacity,\r\n    emissive,\r\n    intensity\r\n  ) {\r\n    const material = new THREE.MeshStandardMaterial({\r\n      color: color,\r\n      roughness: roughness,\r\n      metalness: metalness\r\n    });\r\n\r\n    if (opacity < 1) {\r\n      material.transparent = true;\r\n      material.opacity = opacity;\r\n      material.depthWrite = false;\r\n    }\r\n\r\n    if (emissive) {\r\n      material.emissive = new THREE.Color(emissive);\r\n      material.emissiveIntensity = intensity || 0;\r\n    }\r\n\r\n    return material;\r\n  }\r\n\r\n\r\n  function box(w, h, d, material) {\r\n    const mesh = new THREE.Mesh(\r\n      new THREE.BoxGeometry(w, h, d),\r\n      material\r\n    );\r\n\r\n    mesh.castShadow = true;\r\n    mesh.receiveShadow = true;\r\n\r\n    return mesh;\r\n  }\r\n\r\n\r\n  function cyl(r1, r2, h, material, segments) {\r\n    const mesh = new THREE.Mesh(\r\n      new THREE.CylinderGeometry(\r\n        r1,\r\n        r2,\r\n        h,\r\n        segments || 32\r\n      ),\r\n      material\r\n    );\r\n\r\n    mesh.castShadow = true;\r\n    mesh.receiveShadow = true;\r\n\r\n    return mesh;\r\n  }\r\n\r\n\r\n  function torus(radius, tube, material) {\r\n    const mesh = new THREE.Mesh(\r\n      new THREE.TorusGeometry(radius, tube, 18, 80),\r\n      material\r\n    );\r\n\r\n    mesh.castShadow = true;\r\n    mesh.receiveShadow = true;\r\n\r\n    return mesh;\r\n  }\r\n\r\n\r\n  function clearThreeRoot() {\r\n    if (!threeRoot) return;\r\n\r\n    while (threeRoot.children.length) {\r\n      const child = threeRoot.children[0];\r\n\r\n      child.traverse(function (obj) {\r\n        if (obj.geometry) {\r\n          obj.geometry.dispose();\r\n        }\r\n\r\n        if (obj.material) {\r\n          if (Array.isArray(obj.material)) {\r\n            obj.material.forEach(function (m) {\r\n              m.dispose();\r\n            });\r\n          } else {\r\n            obj.material.dispose();\r\n          }\r\n        }\r\n      });\r\n\r\n      threeRoot.remove(child);\r\n    }\r\n\r\n    activeModelGroup = null;\r\n    liftCabin3D = null;\r\n    goodsCabin3D = null;\r\n    escalatorSteps = [];\r\n  }\r\n\r\n\r\n  function createGlowSphere(radius, opacity) {\r\n    const glow = new THREE.Mesh(\r\n      new THREE.SphereGeometry(radius, 48, 48),\r\n      mat(\r\n        0xffffff,\r\n        0.2,\r\n        0,\r\n        opacity,\r\n        0xffffff,\r\n        0.2\r\n      )\r\n    );\r\n\r\n    glow.scale.set(1, 0.42, 1);\r\n\r\n    return glow;\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Lift model\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function createLiftModel() {\r\n    const group = new THREE.Group();\r\n\r\n    const black = mat(\r\n      0x111111,\r\n      0.52,\r\n      0.42,\r\n      1\r\n    );\r\n\r\n    const dark = mat(\r\n      0x1f1f1f,\r\n      0.44,\r\n      0.48,\r\n      1\r\n    );\r\n\r\n    const metal = mat(\r\n      0xdddddd,\r\n      0.28,\r\n      0.72,\r\n      1,\r\n      0xffffff,\r\n      0.06\r\n    );\r\n\r\n    const white = mat(\r\n      0xffffff,\r\n      0.20,\r\n      0.38,\r\n      1,\r\n      0xffffff,\r\n      0.12\r\n    );\r\n\r\n    const glass = mat(\r\n      0xdff7ff,\r\n      0.03,\r\n      0.02,\r\n      0.19\r\n    );\r\n\r\n    const glowMat = mat(\r\n      0xffffff,\r\n      0.22,\r\n      0.1,\r\n      0.78,\r\n      0xffffff,\r\n      0.45\r\n    );\r\n\r\n    const shaft = box(\r\n      1.75,\r\n      4.9,\r\n      1.32,\r\n      black\r\n    );\r\n\r\n    shaft.position.y = 0;\r\n    group.add(shaft);\r\n\r\n    const backPanel = box(\r\n      1.55,\r\n      4.65,\r\n      0.05,\r\n      dark\r\n    );\r\n\r\n    backPanel.position.z = -0.68;\r\n    group.add(backPanel);\r\n\r\n    const leftGlass = box(\r\n      0.05,\r\n      4.55,\r\n      1.24,\r\n      glass\r\n    );\r\n\r\n    leftGlass.position.x = -0.9;\r\n    group.add(leftGlass);\r\n\r\n    const rightGlass = box(\r\n      0.05,\r\n      4.55,\r\n      1.24,\r\n      glass\r\n    );\r\n\r\n    rightGlass.position.x = 0.9;\r\n    group.add(rightGlass);\r\n\r\n    const frontGlass = box(\r\n      1.48,\r\n      4.55,\r\n      0.045,\r\n      glass\r\n    );\r\n\r\n    frontGlass.position.z = 0.70;\r\n    group.add(frontGlass);\r\n\r\n    for (let i = 0; i < 6; i += 1) {\r\n      const floor = box(\r\n        2.95,\r\n        0.035,\r\n        1.95,\r\n        metal\r\n      );\r\n\r\n      floor.position.y = -2.1 + i * 0.84;\r\n      group.add(floor);\r\n\r\n      const led = box(\r\n        0.62,\r\n        0.025,\r\n        0.035,\r\n        glowMat\r\n      );\r\n\r\n      led.position.set(\r\n        0.62,\r\n        -1.98 + i * 0.84,\r\n        0.83\r\n      );\r\n\r\n      group.add(led);\r\n\r\n      const smallDisplay = box(\r\n        0.12,\r\n        0.12,\r\n        0.035,\r\n        glowMat\r\n      );\r\n\r\n      smallDisplay.position.set(\r\n        -0.70,\r\n        -1.90 + i * 0.84,\r\n        0.83\r\n      );\r\n\r\n      group.add(smallDisplay);\r\n    }\r\n\r\n    const railA = box(\r\n      0.035,\r\n      4.72,\r\n      0.04,\r\n      metal\r\n    );\r\n\r\n    railA.position.set(\r\n      -0.50,\r\n      0,\r\n      0.78\r\n    );\r\n\r\n    group.add(railA);\r\n\r\n    const railB = box(\r\n      0.035,\r\n      4.72,\r\n      0.04,\r\n      metal\r\n    );\r\n\r\n    railB.position.set(\r\n      0.50,\r\n      0,\r\n      0.78\r\n    );\r\n\r\n    group.add(railB);\r\n\r\n    const cableA = cyl(\r\n      0.012,\r\n      0.012,\r\n      4.65,\r\n      glowMat,\r\n      12\r\n    );\r\n\r\n    cableA.position.set(\r\n      -0.20,\r\n      0.08,\r\n      0.86\r\n    );\r\n\r\n    group.add(cableA);\r\n\r\n    const cableB = cyl(\r\n      0.012,\r\n      0.012,\r\n      4.65,\r\n      glowMat,\r\n      12\r\n    );\r\n\r\n    cableB.position.set(\r\n      0.20,\r\n      0.08,\r\n      0.86\r\n    );\r\n\r\n    group.add(cableB);\r\n\r\n    const pulleyA = torus(\r\n      0.20,\r\n      0.018,\r\n      metal\r\n    );\r\n\r\n    pulleyA.rotation.x = Math.PI \/ 2;\r\n\r\n    pulleyA.position.set(\r\n      -0.28,\r\n      2.38,\r\n      0.82\r\n    );\r\n\r\n    group.add(pulleyA);\r\n\r\n    const pulleyB = torus(\r\n      0.20,\r\n      0.018,\r\n      metal\r\n    );\r\n\r\n    pulleyB.rotation.x = Math.PI \/ 2;\r\n\r\n    pulleyB.position.set(\r\n      0.28,\r\n      2.38,\r\n      0.82\r\n    );\r\n\r\n    group.add(pulleyB);\r\n\r\n    const counterWeight = box(\r\n      0.24,\r\n      0.95,\r\n      0.16,\r\n      dark\r\n    );\r\n\r\n    counterWeight.position.set(\r\n      0.72,\r\n      0.82,\r\n      0.40\r\n    );\r\n\r\n    group.add(counterWeight);\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | Lift cabin\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    liftCabin3D = new THREE.Group();\r\n\r\n    const cabinBody = box(\r\n      0.94,\r\n      0.82,\r\n      0.82,\r\n      white\r\n    );\r\n\r\n    liftCabin3D.add(cabinBody);\r\n\r\n    const cabinTop = box(\r\n      1.04,\r\n      0.08,\r\n      0.92,\r\n      metal\r\n    );\r\n\r\n    cabinTop.position.y = 0.45;\r\n    liftCabin3D.add(cabinTop);\r\n\r\n    const cabinBottom = box(\r\n      1.04,\r\n      0.08,\r\n      0.92,\r\n      metal\r\n    );\r\n\r\n    cabinBottom.position.y = -0.45;\r\n    liftCabin3D.add(cabinBottom);\r\n\r\n    const doorA = box(\r\n      0.40,\r\n      0.66,\r\n      0.035,\r\n      dark\r\n    );\r\n\r\n    doorA.position.set(\r\n      -0.21,\r\n      0,\r\n      0.43\r\n    );\r\n\r\n    liftCabin3D.add(doorA);\r\n\r\n    const doorB = box(\r\n      0.40,\r\n      0.66,\r\n      0.035,\r\n      dark\r\n    );\r\n\r\n    doorB.position.set(\r\n      0.21,\r\n      0,\r\n      0.43\r\n    );\r\n\r\n    liftCabin3D.add(doorB);\r\n\r\n    const innerLight = box(\r\n      0.54,\r\n      0.035,\r\n      0.035,\r\n      glowMat\r\n    );\r\n\r\n    innerLight.position.set(\r\n      0,\r\n      0.30,\r\n      0.47\r\n    );\r\n\r\n    liftCabin3D.add(innerLight);\r\n\r\n    const handle = box(\r\n      0.54,\r\n      0.025,\r\n      0.035,\r\n      metal\r\n    );\r\n\r\n    handle.position.set(\r\n      0,\r\n      -0.18,\r\n      0.47\r\n    );\r\n\r\n    liftCabin3D.add(handle);\r\n\r\n    liftCabin3D.position.y =\r\n      serviceData.phases[currentPhase].liftY;\r\n\r\n    group.add(liftCabin3D);\r\n\r\n    const glow = createGlowSphere(\r\n      2.25,\r\n      0.11\r\n    );\r\n\r\n    glow.position.y = 0.05;\r\n    group.add(glow);\r\n\r\n    group.rotation.y = -0.26;\r\n    group.rotation.x = 0.06;\r\n    group.position.y = 0.05;\r\n\r\n    return group;\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Goods lift model\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function createGoodsModel() {\r\n    const group = new THREE.Group();\r\n\r\n    const black = mat(\r\n      0x111111,\r\n      0.50,\r\n      0.45,\r\n      1\r\n    );\r\n\r\n    const dark = mat(\r\n      0x242424,\r\n      0.45,\r\n      0.46,\r\n      1\r\n    );\r\n\r\n    const metal = mat(\r\n      0xdcdcdc,\r\n      0.26,\r\n      0.75,\r\n      1,\r\n      0xffffff,\r\n      0.08\r\n    );\r\n\r\n    const white = mat(\r\n      0xffffff,\r\n      0.22,\r\n      0.35,\r\n      1,\r\n      0xffffff,\r\n      0.12\r\n    );\r\n\r\n    const glass = mat(\r\n      0xdff7ff,\r\n      0.05,\r\n      0.02,\r\n      0.16\r\n    );\r\n\r\n    const glowMat = mat(\r\n      0xffffff,\r\n      0.20,\r\n      0.12,\r\n      0.85,\r\n      0xffffff,\r\n      0.42\r\n    );\r\n\r\n    const base = box(\r\n      3.35,\r\n      0.14,\r\n      2.55,\r\n      black\r\n    );\r\n\r\n    base.position.y = -1.55;\r\n    group.add(base);\r\n\r\n    const platformFrame = box(\r\n      1.85,\r\n      0.16,\r\n      1.55,\r\n      metal\r\n    );\r\n\r\n    platformFrame.position.y = -0.65;\r\n    group.add(platformFrame);\r\n\r\n    goodsCabin3D = platformFrame;\r\n\r\n    const loadBox = box(\r\n      0.76,\r\n      0.52,\r\n      0.66,\r\n      dark\r\n    );\r\n\r\n    loadBox.position.set(\r\n      -0.25,\r\n      -0.28,\r\n      0.04\r\n    );\r\n\r\n    group.add(loadBox);\r\n\r\n    const loadTapeA = box(\r\n      0.78,\r\n      0.05,\r\n      0.68,\r\n      glowMat\r\n    );\r\n\r\n    loadTapeA.position.set(\r\n      -0.25,\r\n      -0.02,\r\n      0.04\r\n    );\r\n\r\n    group.add(loadTapeA);\r\n\r\n    const backPanel = box(\r\n      1.88,\r\n      1.42,\r\n      0.08,\r\n      glass\r\n    );\r\n\r\n    backPanel.position.set(\r\n      0,\r\n      0.16,\r\n      -0.78\r\n    );\r\n\r\n    group.add(backPanel);\r\n\r\n    const sideA = box(\r\n      0.08,\r\n      1.42,\r\n      1.52,\r\n      glass\r\n    );\r\n\r\n    sideA.position.set(\r\n      -0.96,\r\n      0.16,\r\n      0\r\n    );\r\n\r\n    group.add(sideA);\r\n\r\n    const sideB = box(\r\n      0.08,\r\n      1.42,\r\n      1.52,\r\n      glass\r\n    );\r\n\r\n    sideB.position.set(\r\n      0.96,\r\n      0.16,\r\n      0\r\n    );\r\n\r\n    group.add(sideB);\r\n\r\n    [-1.38, 1.38].forEach(function (x) {\r\n      [-1.08, 1.08].forEach(function (z) {\r\n        const post = cyl(\r\n          0.035,\r\n          0.035,\r\n          3.35,\r\n          metal,\r\n          18\r\n        );\r\n\r\n        post.position.set(\r\n          x,\r\n          0,\r\n          z\r\n        );\r\n\r\n        group.add(post);\r\n\r\n        const cap = box(\r\n          0.18,\r\n          0.12,\r\n          0.18,\r\n          white\r\n        );\r\n\r\n        cap.position.set(\r\n          x,\r\n          1.66,\r\n          z\r\n        );\r\n\r\n        group.add(cap);\r\n      });\r\n    });\r\n\r\n    const upperBeamA = box(\r\n      2.95,\r\n      0.08,\r\n      0.08,\r\n      metal\r\n    );\r\n\r\n    upperBeamA.position.set(\r\n      0,\r\n      1.65,\r\n      -1.08\r\n    );\r\n\r\n    group.add(upperBeamA);\r\n\r\n    const upperBeamB = box(\r\n      2.95,\r\n      0.08,\r\n      0.08,\r\n      metal\r\n    );\r\n\r\n    upperBeamB.position.set(\r\n      0,\r\n      1.65,\r\n      1.08\r\n    );\r\n\r\n    group.add(upperBeamB);\r\n\r\n    const hoist = box(\r\n      0.46,\r\n      0.30,\r\n      0.42,\r\n      white\r\n    );\r\n\r\n    hoist.position.set(\r\n      0,\r\n      1.82,\r\n      0\r\n    );\r\n\r\n    group.add(hoist);\r\n\r\n    const hookCable = cyl(\r\n      0.013,\r\n      0.013,\r\n      1.75,\r\n      glowMat,\r\n      12\r\n    );\r\n\r\n    hookCable.position.set(\r\n      0,\r\n      0.95,\r\n      0\r\n    );\r\n\r\n    group.add(hookCable);\r\n\r\n    const hook = torus(\r\n      0.12,\r\n      0.016,\r\n      metal\r\n    );\r\n\r\n    hook.rotation.x = Math.PI \/ 2;\r\n\r\n    hook.position.set(\r\n      0,\r\n      0.05,\r\n      0\r\n    );\r\n\r\n    group.add(hook);\r\n\r\n    const frontRail = box(\r\n      1.78,\r\n      0.06,\r\n      0.06,\r\n      metal\r\n    );\r\n\r\n    frontRail.position.set(\r\n      0,\r\n      0.26,\r\n      0.84\r\n    );\r\n\r\n    group.add(frontRail);\r\n\r\n    const glow = createGlowSphere(\r\n      2.35,\r\n      0.12\r\n    );\r\n\r\n    glow.position.y = 0;\r\n    group.add(glow);\r\n\r\n    group.rotation.x = 0.48;\r\n    group.rotation.z = -0.34;\r\n    group.rotation.y = -0.18;\r\n    group.position.y = -0.12;\r\n\r\n    return group;\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Escalator model\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function createEscalatorModel() {\r\n    const group = new THREE.Group();\r\n\r\n    const black = mat(\r\n      0x111111,\r\n      0.52,\r\n      0.42,\r\n      1\r\n    );\r\n\r\n    const metal = mat(\r\n      0xdedede,\r\n      0.28,\r\n      0.72,\r\n      1,\r\n      0xffffff,\r\n      0.08\r\n    );\r\n\r\n    const white = mat(\r\n      0xffffff,\r\n      0.22,\r\n      0.35,\r\n      1,\r\n      0xffffff,\r\n      0.12\r\n    );\r\n\r\n    const glass = mat(\r\n      0xdff7ff,\r\n      0.05,\r\n      0.02,\r\n      0.19\r\n    );\r\n\r\n    const glowMat = mat(\r\n      0xffffff,\r\n      0.20,\r\n      0.12,\r\n      0.85,\r\n      0xffffff,\r\n      0.46\r\n    );\r\n\r\n    const base = box(\r\n      4.45,\r\n      0.18,\r\n      1.30,\r\n      black\r\n    );\r\n\r\n    base.position.y = -0.78;\r\n    group.add(base);\r\n\r\n    const lowerLanding = box(\r\n      1.10,\r\n      0.14,\r\n      1.45,\r\n      metal\r\n    );\r\n\r\n    lowerLanding.position.set(\r\n      -2.20,\r\n      -0.66,\r\n      0\r\n    );\r\n\r\n    group.add(lowerLanding);\r\n\r\n    const upperLanding = box(\r\n      1.10,\r\n      0.14,\r\n      1.45,\r\n      metal\r\n    );\r\n\r\n    upperLanding.position.set(\r\n      2.20,\r\n      0.46,\r\n      0\r\n    );\r\n\r\n    group.add(upperLanding);\r\n\r\n    for (let i = 0; i < 16; i += 1) {\r\n      const stepGroup = new THREE.Group();\r\n\r\n      const tread = box(\r\n        0.30,\r\n        0.055,\r\n        0.94,\r\n        white\r\n      );\r\n\r\n      tread.position.y = 0;\r\n      stepGroup.add(tread);\r\n\r\n      const riser = box(\r\n        0.035,\r\n        0.12,\r\n        0.94,\r\n        metal\r\n      );\r\n\r\n      riser.position.set(\r\n        -0.16,\r\n        -0.08,\r\n        0\r\n      );\r\n\r\n      stepGroup.add(riser);\r\n\r\n      const grooveA = box(\r\n        0.30,\r\n        0.012,\r\n        0.018,\r\n        black\r\n      );\r\n\r\n      grooveA.position.set(\r\n        0,\r\n        0.033,\r\n        -0.22\r\n      );\r\n\r\n      stepGroup.add(grooveA);\r\n\r\n      const grooveB = box(\r\n        0.30,\r\n        0.012,\r\n        0.018,\r\n        black\r\n      );\r\n\r\n      grooveB.position.set(\r\n        0,\r\n        0.033,\r\n        0\r\n      );\r\n\r\n      stepGroup.add(grooveB);\r\n\r\n      const grooveC = box(\r\n        0.30,\r\n        0.012,\r\n        0.018,\r\n        black\r\n      );\r\n\r\n      grooveC.position.set(\r\n        0,\r\n        0.033,\r\n        0.22\r\n      );\r\n\r\n      stepGroup.add(grooveC);\r\n\r\n      stepGroup.position.set(\r\n        -2.00 + i * 0.27,\r\n        -0.48 + i * 0.066,\r\n        0\r\n      );\r\n\r\n      stepGroup.userData.baseX =\r\n        stepGroup.position.x;\r\n\r\n      stepGroup.userData.baseY =\r\n        stepGroup.position.y;\r\n\r\n      stepGroup.userData.index = i;\r\n\r\n      escalatorSteps.push(stepGroup);\r\n      group.add(stepGroup);\r\n    }\r\n\r\n    const glassA = box(\r\n      4.55,\r\n      0.82,\r\n      0.04,\r\n      glass\r\n    );\r\n\r\n    glassA.rotation.z = 0.25;\r\n\r\n    glassA.position.set(\r\n      0,\r\n      0.08,\r\n      0.78\r\n    );\r\n\r\n    group.add(glassA);\r\n\r\n    const glassB = box(\r\n      4.55,\r\n      0.82,\r\n      0.04,\r\n      glass\r\n    );\r\n\r\n    glassB.rotation.z = 0.25;\r\n\r\n    glassB.position.set(\r\n      0,\r\n      0.08,\r\n      -0.78\r\n    );\r\n\r\n    group.add(glassB);\r\n\r\n    const railA = cyl(\r\n      0.038,\r\n      0.038,\r\n      4.7,\r\n      glowMat,\r\n      18\r\n    );\r\n\r\n    railA.rotation.z =\r\n      Math.PI \/ 2 - 0.25;\r\n\r\n    railA.position.set(\r\n      0,\r\n      0.53,\r\n      0.86\r\n    );\r\n\r\n    group.add(railA);\r\n\r\n    const railB = cyl(\r\n      0.038,\r\n      0.038,\r\n      4.7,\r\n      glowMat,\r\n      18\r\n    );\r\n\r\n    railB.rotation.z =\r\n      Math.PI \/ 2 - 0.25;\r\n\r\n    railB.position.set(\r\n      0,\r\n      0.53,\r\n      -0.86\r\n    );\r\n\r\n    group.add(railB);\r\n\r\n    const sideSkirtA = box(\r\n      4.38,\r\n      0.12,\r\n      0.08,\r\n      metal\r\n    );\r\n\r\n    sideSkirtA.rotation.z = 0.25;\r\n\r\n    sideSkirtA.position.set(\r\n      0,\r\n      -0.18,\r\n      0.58\r\n    );\r\n\r\n    group.add(sideSkirtA);\r\n\r\n    const sideSkirtB = box(\r\n      4.38,\r\n      0.12,\r\n      0.08,\r\n      metal\r\n    );\r\n\r\n    sideSkirtB.rotation.z = 0.25;\r\n\r\n    sideSkirtB.position.set(\r\n      0,\r\n      -0.18,\r\n      -0.58\r\n    );\r\n\r\n    group.add(sideSkirtB);\r\n\r\n    const glow = createGlowSphere(\r\n      2.6,\r\n      0.12\r\n    );\r\n\r\n    glow.position.y = 0;\r\n    group.add(glow);\r\n\r\n    group.rotation.x = 0.52;\r\n    group.rotation.z = -0.34;\r\n    group.rotation.y = -0.16;\r\n    group.position.y = -0.15;\r\n\r\n    return group;\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Rebuild 3D model\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function rebuildThreeModel() {\r\n    if (!threeRoot) return;\r\n\r\n    clearThreeRoot();\r\n\r\n    let model;\r\n\r\n    if (currentPlant === \"lift\") {\r\n      model = createLiftModel();\r\n    }\r\n\r\n    if (currentPlant === \"goods\") {\r\n      model = createGoodsModel();\r\n    }\r\n\r\n    if (currentPlant === \"escalator\") {\r\n      model = createEscalatorModel();\r\n    }\r\n\r\n    if (model) {\r\n      activeModelGroup = model;\r\n      threeRoot.add(model);\r\n    }\r\n\r\n    updateThreePhase();\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Update 3D phase\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function updateThreePhase() {\r\n    const phase = serviceData.phases[currentPhase];\r\n\r\n    if (!phase) return;\r\n\r\n    activeAnimationTargets.liftY =\r\n      phase.liftY;\r\n\r\n    activeAnimationTargets.goodsY =\r\n      phase.goodsY;\r\n\r\n    if (window.gsap) {\r\n      if (liftCabin3D) {\r\n        gsap.to(\r\n          liftCabin3D.position,\r\n          {\r\n            y: phase.liftY,\r\n            duration: 1.05,\r\n            ease: \"power3.inOut\"\r\n          }\r\n        );\r\n      }\r\n\r\n      if (goodsCabin3D) {\r\n        gsap.to(\r\n          goodsCabin3D.position,\r\n          {\r\n            y: phase.goodsY,\r\n            duration: 1.05,\r\n            ease: \"power3.inOut\"\r\n          }\r\n        );\r\n      }\r\n    }\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Init THREE.JS\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function initThree() {\r\n    if (\r\n      !threeCanvas ||\r\n      !frame ||\r\n      !window.THREE\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    scene = new THREE.Scene();\r\n\r\n    scene.fog = new THREE.FogExp2(\r\n      0x050505,\r\n      0.052\r\n    );\r\n\r\n    camera =\r\n      new THREE.PerspectiveCamera(\r\n        38,\r\n        1,\r\n        0.1,\r\n        100\r\n      );\r\n\r\n    camera.position.set(\r\n      4.0,\r\n      2.85,\r\n      7.0\r\n    );\r\n\r\n    camera.lookAt(\r\n      0,\r\n      0,\r\n      0\r\n    );\r\n\r\n    renderer =\r\n      new THREE.WebGLRenderer({\r\n        canvas: threeCanvas,\r\n        antialias: true,\r\n        alpha: true,\r\n        powerPreference: \"high-performance\"\r\n      });\r\n\r\n    renderer.setPixelRatio(\r\n      Math.min(\r\n        window.devicePixelRatio || 1,\r\n        2\r\n      )\r\n    );\r\n\r\n    renderer.setClearColor(\r\n      0x000000,\r\n      0\r\n    );\r\n\r\n    renderer.shadowMap.enabled = true;\r\n\r\n    renderer.shadowMap.type =\r\n      THREE.PCFSoftShadowMap;\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | Lights\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    const ambient =\r\n      new THREE.AmbientLight(\r\n        0xffffff,\r\n        0.56\r\n      );\r\n\r\n    scene.add(ambient);\r\n\r\n    const key =\r\n      new THREE.DirectionalLight(\r\n        0xffffff,\r\n        1.65\r\n      );\r\n\r\n    key.position.set(\r\n      4.8,\r\n      6.8,\r\n      5.2\r\n    );\r\n\r\n    key.castShadow = true;\r\n\r\n    key.shadow.mapSize.width = 2048;\r\n    key.shadow.mapSize.height = 2048;\r\n\r\n    scene.add(key);\r\n\r\n    const rim =\r\n      new THREE.PointLight(\r\n        0xffffff,\r\n        1.15,\r\n        10\r\n      );\r\n\r\n    rim.position.set(\r\n      -3.8,\r\n      2.5,\r\n      -4\r\n    );\r\n\r\n    scene.add(rim);\r\n\r\n    const front =\r\n      new THREE.PointLight(\r\n        0xffffff,\r\n        0.84,\r\n        8\r\n      );\r\n\r\n    front.position.set(\r\n      2.2,\r\n      1.2,\r\n      3.8\r\n    );\r\n\r\n    scene.add(front);\r\n\r\n    const softTop =\r\n      new THREE.PointLight(\r\n        0xffffff,\r\n        0.72,\r\n        9\r\n      );\r\n\r\n    softTop.position.set(\r\n      0,\r\n      4.5,\r\n      1.4\r\n    );\r\n\r\n    scene.add(softTop);\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | Floor\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    const floor = new THREE.Mesh(\r\n      new THREE.PlaneGeometry(\r\n        10,\r\n        10\r\n      ),\r\n      new THREE.ShadowMaterial({\r\n        opacity: 0.23\r\n      })\r\n    );\r\n\r\n    floor.rotation.x =\r\n      -Math.PI \/ 2;\r\n\r\n    floor.position.y = -2.05;\r\n\r\n    floor.receiveShadow = true;\r\n\r\n    scene.add(floor);\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | Root\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    threeRoot =\r\n      new THREE.Group();\r\n\r\n    scene.add(threeRoot);\r\n\r\n    rebuildThreeModel();\r\n    resizeThree();\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | Render loop\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    function render(now) {\r\n      const breathing =\r\n        Math.sin(\r\n          now * 0.00075\r\n        ) * 0.018;\r\n\r\n      if (threeRoot) {\r\n        threeRoot.rotation.y +=\r\n          (\r\n            breathing -\r\n            threeRoot.rotation.y\r\n          ) * 0.035;\r\n\r\n        threeRoot.rotation.x +=\r\n          (\r\n            breathing * 0.35 -\r\n            threeRoot.rotation.x\r\n          ) * 0.035;\r\n      }\r\n\r\n      if (activeModelGroup) {\r\n        activeModelGroup.position.y +=\r\n          (\r\n            Math.sin(\r\n              now * 0.0011\r\n            ) * 0.035 -\r\n            activeModelGroup.position.y\r\n          ) * 0.025;\r\n      }\r\n\r\n      if (\r\n        liftCabin3D &&\r\n        !window.gsap\r\n      ) {\r\n        liftCabin3D.position.y +=\r\n          (\r\n            activeAnimationTargets.liftY -\r\n            liftCabin3D.position.y\r\n          ) * 0.05;\r\n      }\r\n\r\n      if (\r\n        goodsCabin3D &&\r\n        !window.gsap\r\n      ) {\r\n        goodsCabin3D.position.y +=\r\n          (\r\n            activeAnimationTargets.goodsY -\r\n            goodsCabin3D.position.y\r\n          ) * 0.05;\r\n      }\r\n\r\n      escalatorSteps.forEach(function (step) {\r\n        const t =\r\n          now * 0.00032 +\r\n          step.userData.index * 0.13;\r\n\r\n        step.position.x =\r\n          step.userData.baseX +\r\n          Math.sin(t) * 0.055;\r\n\r\n        step.position.y =\r\n          step.userData.baseY +\r\n          Math.sin(t) * 0.014;\r\n      });\r\n\r\n      renderer.render(\r\n        scene,\r\n        camera\r\n      );\r\n\r\n      requestAnimationFrame(render);\r\n    }\r\n\r\n    requestAnimationFrame(render);\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Resize THREE.JS\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function resizeThree() {\r\n    if (\r\n      !renderer ||\r\n      !camera ||\r\n      !threeCanvas\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    const rect =\r\n      threeCanvas.getBoundingClientRect();\r\n\r\n    if (\r\n      !rect.width ||\r\n      !rect.height\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    renderer.setSize(\r\n      rect.width,\r\n      rect.height,\r\n      false\r\n    );\r\n\r\n    camera.aspect =\r\n      rect.width \/ rect.height;\r\n\r\n    camera.updateProjectionMatrix();\r\n  }\r\n\r\n  window.addEventListener(\r\n    \"resize\",\r\n    resizeThree\r\n  );\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Start THREE.JS\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  initThree();\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Initial state\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  setPlant(\"lift\");\r\n  setPhase(\"call\");\r\n\r\n});<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Millepiani Service Service and Maintenance Service and maintenance solutions for elevators, freight lifts and escalators. Technical supportdesigned to ensure safety, peace of mind, service continuity, rapid response and consistentsystem performance. Request information Why choose Elevator Serviceand Maintenance Proper system operation provides safety and peace of mind while ensuring freedomof movement. Millepiani Service offers a structured [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-2480","page","type-page","status-publish","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Service and maintenance for elevators, freight lifts and escalators: 24\/7 call center, qualified technicians and rapid response.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/millepiani.com\/en\/service-and-maintenance\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"millepiani.com -\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Elevator Service and Maintenance | Millepiani\" \/>\n\t\t<meta property=\"og:description\" content=\"Service and maintenance for elevators, freight lifts and escalators: 24\/7 call center, qualified technicians and rapid response.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/millepiani.com\/en\/service-and-maintenance\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-05-24T14:50:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-09-14T17:59:36+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Elevator Service and Maintenance | Millepiani\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Service and maintenance for elevators, freight lifts and escalators: 24\/7 call center, qualified technicians and rapid response.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/en\\\/service-and-maintenance\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/en\\\/#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/millepiani.com\\\/en\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/en\\\/service-and-maintenance\\\/#listItem\",\"name\":\"Service and Maintenance\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/en\\\/service-and-maintenance\\\/#listItem\",\"position\":2,\"name\":\"Service and Maintenance\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/en\\\/#listItem\",\"name\":\"Home\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/en\\\/#organization\",\"name\":\"millepiani.com\",\"url\":\"https:\\\/\\\/millepiani.com\\\/en\\\/\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/en\\\/service-and-maintenance\\\/#webpage\",\"url\":\"https:\\\/\\\/millepiani.com\\\/en\\\/service-and-maintenance\\\/\",\"name\":\"Elevator Service and Maintenance | Millepiani\",\"description\":\"Service and maintenance for elevators, freight lifts and escalators: 24\\\/7 call center, qualified technicians and rapid response.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/millepiani.com\\\/en\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/millepiani.com\\\/en\\\/service-and-maintenance\\\/#breadcrumblist\"},\"datePublished\":\"2026-05-24T14:50:02+00:00\",\"dateModified\":\"2026-09-14T17:59:36+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/millepiani.com\\\/en\\\/\",\"name\":\"millepiani.com\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/millepiani.com\\\/en\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Elevator Service and Maintenance | Millepiani","description":"Service and maintenance for elevators, freight lifts and escalators: 24\/7 call center, qualified technicians and rapid response.","canonical_url":"https:\/\/millepiani.com\/en\/service-and-maintenance\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/millepiani.com\/en\/service-and-maintenance\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/millepiani.com\/en\/#listItem","position":1,"name":"Home","item":"https:\/\/millepiani.com\/en\/","nextItem":{"@type":"ListItem","@id":"https:\/\/millepiani.com\/en\/service-and-maintenance\/#listItem","name":"Service and Maintenance"}},{"@type":"ListItem","@id":"https:\/\/millepiani.com\/en\/service-and-maintenance\/#listItem","position":2,"name":"Service and Maintenance","previousItem":{"@type":"ListItem","@id":"https:\/\/millepiani.com\/en\/#listItem","name":"Home"}}]},{"@type":"Organization","@id":"https:\/\/millepiani.com\/en\/#organization","name":"millepiani.com","url":"https:\/\/millepiani.com\/en\/"},{"@type":"WebPage","@id":"https:\/\/millepiani.com\/en\/service-and-maintenance\/#webpage","url":"https:\/\/millepiani.com\/en\/service-and-maintenance\/","name":"Elevator Service and Maintenance | Millepiani","description":"Service and maintenance for elevators, freight lifts and escalators: 24\/7 call center, qualified technicians and rapid response.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/millepiani.com\/en\/#website"},"breadcrumb":{"@id":"https:\/\/millepiani.com\/en\/service-and-maintenance\/#breadcrumblist"},"datePublished":"2026-05-24T14:50:02+00:00","dateModified":"2026-09-14T17:59:36+00:00"},{"@type":"WebSite","@id":"https:\/\/millepiani.com\/en\/#website","url":"https:\/\/millepiani.com\/en\/","name":"millepiani.com","inLanguage":"en-US","publisher":{"@id":"https:\/\/millepiani.com\/en\/#organization"}}]},"og:locale":"en_US","og:site_name":"millepiani.com -","og:type":"article","og:title":"Elevator Service and Maintenance | Millepiani","og:description":"Service and maintenance for elevators, freight lifts and escalators: 24\/7 call center, qualified technicians and rapid response.","og:url":"https:\/\/millepiani.com\/en\/service-and-maintenance\/","article:published_time":"2026-05-24T14:50:02+00:00","article:modified_time":"2026-09-14T17:59:36+00:00","twitter:card":"summary_large_image","twitter:title":"Elevator Service and Maintenance | Millepiani","twitter:description":"Service and maintenance for elevators, freight lifts and escalators: 24\/7 call center, qualified technicians and rapid response."},"aioseo_meta_data":{"post_id":"2480","title":"Elevator Service and Maintenance | Millepiani","description":"Service and maintenance for elevators, freight lifts and escalators: 24\/7 call center, qualified technicians and rapid response.","keywords":null,"keyphrases":{"focus":{"keyphrase":"manutenzione ascensori","score":0,"analysis":[]},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_custom_url":null,"og_image_custom_fields":null,"og_image_url":null,"og_image_width":null,"og_image_height":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_image_url":null,"twitter_title":null,"twitter_description":null,"schema_type":"default","schema_type_options":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"WebPage","isEnabled":true},"graphs":[]},"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"breadcrumb_settings":null,"seo_analyzer_scan_date":null,"created":"2026-09-14 17:37:28","updated":"2026-09-14 18:34:32","focus_keyword":"manutenzione ascensori","additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/millepiani.com\/en\/\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tService and Maintenance\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/millepiani.com\/en\/"},{"label":"Service and Maintenance","link":"https:\/\/millepiani.com\/en\/service-and-maintenance\/"}],"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"_links":{"self":[{"href":"https:\/\/millepiani.com\/en\/wp-json\/wp\/v2\/pages\/2480","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/millepiani.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/millepiani.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/millepiani.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/millepiani.com\/en\/wp-json\/wp\/v2\/comments?post=2480"}],"version-history":[{"count":4,"href":"https:\/\/millepiani.com\/en\/wp-json\/wp\/v2\/pages\/2480\/revisions"}],"predecessor-version":[{"id":2484,"href":"https:\/\/millepiani.com\/en\/wp-json\/wp\/v2\/pages\/2480\/revisions\/2484"}],"wp:attachment":[{"href":"https:\/\/millepiani.com\/en\/wp-json\/wp\/v2\/media?parent=2480"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}