{"id":2410,"date":"2026-04-10T04:37:34","date_gmt":"2026-04-10T04:37:34","guid":{"rendered":"https:\/\/curetecglobal.com\/?page_id=2410"},"modified":"2026-07-03T01:54:24","modified_gmt":"2026-07-03T01:54:24","slug":"%e4%bc%99%e4%bc%b4","status":"publish","type":"page","link":"https:\/\/curetecglobal.com\/zh\/partners\/","title":{"rendered":"\u5168\u7403\u5408\u4f5c\u4f19\u4f34"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"2410\" class=\"elementor elementor-2410\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a56952f e-con-full e-flex e-con e-parent\" data-id=\"a56952f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;gradient&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-c14858d e-con-full e-flex e-con e-child\" data-id=\"c14858d\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-964345a e-con-full e-flex e-con e-child\" data-id=\"964345a\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-091d636 elementor-widget elementor-widget-heading\" data-id=\"091d636\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Worldwide Expertise in Smart Concrete Curing Solutions<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c69c7b7 elementor-widget elementor-widget-heading\" data-id=\"c69c7b7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Global Technology<br>Local Partners<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-a468ae5 e-con-full e-flex e-con e-child\" data-id=\"a468ae5\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-df729a0 elementor-widget elementor-widget-text-editor\" data-id=\"df729a0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>We work closely with trusted partners worldwide to integrate advanced steam systems into diverse industrial applications. Through technical synergy and shared resources, we jointly deliver high &#8211; performance, highly reliable solutions to our customers.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-36489c96 e-con-full e-flex e-con e-parent\" data-id=\"36489c96\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6dc55b3 elementor-widget elementor-widget-html\" data-id=\"6dc55b3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<curetec-partner-map><\/curetec-partner-map>\r\n\r\n<script>\r\n(function() {\r\n  class CuretecPartnerMap extends HTMLElement {\r\n    constructor() {\r\n      super();\r\n      this.attachShadow({ mode: 'open' });\r\n      this._ready = false;\r\n      this._app = null;\r\n    }\r\n\r\n    connectedCallback() {\r\n      if (this._ready) return;\r\n      this._render();\r\n      this._loadDependencies()\r\n        .then(() => this._initApp())\r\n        .catch(err => {\r\n          const loading = this.shadowRoot.getElementById('loading-message');\r\n          if (loading) loading.textContent = 'Map failed to load. Please refresh.';\r\n          console.error(err);\r\n        });\r\n    }\r\n\r\n    _render() {\r\n      this.shadowRoot.innerHTML = `\r\n        <style>\r\n          @import url('https:\/\/fonts.googleapis.com\/css2?family=Raleway:wght@400;500;600;700;800&display=swap');\r\n\r\n          :host {\r\n            --clr-bg-deep: #020d25;\r\n            --clr-bg-panel: rgba(2, 13, 37, 0.78);\r\n            --clr-bg-card: rgba(2, 13, 37, 0.65);\r\n            --clr-accent: #0072ce;\r\n            --clr-accent-bright: #1a8fe3;\r\n            --clr-accent-soft: #005196;\r\n            --clr-border-dim: rgba(31, 52, 77, 0.7);\r\n            --clr-border-subtle: rgba(0, 114, 206, 0.15);\r\n            --clr-text-primary: #e8ecf1;\r\n            --clr-text-secondary: #b0c4d8;\r\n            --clr-text-muted: #6b8099;\r\n            --clr-gmbh-fill: #1f3d66;\r\n            --clr-shanghai-fill: #0072ce;\r\n            --clr-pin: #ff3b47;\r\n            --fs-h1: 22px;\r\n            --fs-h2: 18px;\r\n            --fs-h3: 14px;\r\n            --fs-subtitle: 13px;\r\n            --fs-body: 13px;\r\n            --fs-button: 13px;\r\n            --fs-small: 11px;\r\n            --fs-icon: 19px;\r\n            --lh-heading: 1.25;\r\n            --lh-body: 1.55;\r\n            --fw-strong: 800;\r\n            --fw-bold: 700;\r\n            --fw-semibold: 600;\r\n            --fw-medium: 500;\r\n            --transition-fast: 0.15s ease;\r\n            --transition-smooth: 0.25s ease;\r\n          }\r\n\r\n          * {\r\n            margin: 0;\r\n            padding: 0;\r\n            box-sizing: border-box;\r\n            border-radius: 0 !important;\r\n          }\r\n          :host {\r\n            font-family: 'Raleway', 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\r\n            background-color: var(--clr-bg-deep);\r\n            background-image:\r\n              radial-gradient(ellipse at 50% 92%, rgba(0, 114, 206, 0.06) 0%, transparent 60%),\r\n              linear-gradient(to bottom,\r\n                rgba(2, 13, 37, 0.88) 0%,\r\n                rgba(2, 13, 37, 0.78) 28%,\r\n                rgba(2, 13, 37, 0.58) 50%,\r\n                rgba(2, 13, 37, 0.32) 70%,\r\n                rgba(2, 13, 37, 0.12) 86%,\r\n                rgba(2, 13, 37, 0.03) 95%,\r\n                transparent 100%);\r\n            color: var(--clr-text-primary);\r\n            overflow-x: auto;\r\n            min-height: 100vh;\r\n            display: block;\r\n            max-width: 100%;\r\n            position: relative;\r\n            font-size: var(--fs-body);\r\n            line-height: var(--lh-body);\r\n            font-weight: 400;\r\n            letter-spacing: 0.01em;\r\n          }\r\n          .main-container {\r\n            max-width: 1620px;\r\n            width: calc(100% - 48px);\r\n            margin: 0 auto;\r\n            padding: 24px;\r\n            background: transparent;\r\n            position: relative;\r\n            z-index: 1;\r\n          }\r\n          .container {\r\n            display: flex;\r\n            \/* \u4fee\u590d\u9ad8\u5ea6\u65e0\u9650\u589e\u957f\uff1a\u4f7f\u7528\u56fa\u5b9a\u9ad8\u5ea6\u66ff\u4ee3 min-height *\/\r\n            height: 82vh;\r\n            min-height: 560px;\r\n            gap: 24px;\r\n            margin-top: 20px;\r\n            flex-wrap: wrap;\r\n          }\r\n\r\n          .info-panel {\r\n            width: 380px;\r\n            height: 100%;\r\n            background: var(--clr-bg-panel);\r\n            border: 1px solid var(--clr-border-dim);\r\n            padding: 28px 24px;\r\n            box-shadow: none;\r\n            overflow-y: auto;\r\n            z-index: 2;\r\n            flex-shrink: 0;\r\n            position: relative;\r\n            transition: border-color var(--transition-smooth);\r\n            backdrop-filter: blur(2px);\r\n            -webkit-backdrop-filter: blur(2px);\r\n          }\r\n          .info-panel:hover {\r\n            border-color: var(--clr-accent-bright);\r\n          }\r\n          .info-panel::-webkit-scrollbar {\r\n            width: 5px;\r\n          }\r\n          .info-panel::-webkit-scrollbar-track {\r\n            background: transparent;\r\n          }\r\n          .info-panel::-webkit-scrollbar-thumb {\r\n            background: rgba(0, 114, 206, 0.3);\r\n          }\r\n          .info-panel::-webkit-scrollbar-thumb:hover {\r\n            background: var(--clr-accent);\r\n          }\r\n\r\n          .map-container {\r\n            flex: 1;\r\n            height: 100%;\r\n            min-height: 0;\r\n            background: rgba(2, 13, 37, 0.55);\r\n            backdrop-filter: blur(1px);\r\n            -webkit-backdrop-filter: blur(1px);\r\n            border: 1px solid var(--clr-border-dim);\r\n            overflow: hidden;\r\n            box-shadow: none;\r\n            position: relative;\r\n            min-width: 500px;\r\n            min-height: 0;\r\n            transition: border-color var(--transition-smooth);\r\n          }\r\n          .map-container:hover {\r\n            border-color: var(--clr-accent-bright);\r\n          }\r\n\r\n          .inline-legend {\r\n            position: absolute;\r\n            bottom: 18px;\r\n            right: 18px;\r\n            background: rgba(2, 13, 37, 0.8);\r\n            padding: 10px 16px;\r\n            display: flex;\r\n            gap: 18px;\r\n            z-index: 15;\r\n            font-size: var(--fs-small);\r\n            font-weight: 500;\r\n            border: 1px solid var(--clr-border-dim);\r\n            pointer-events: none;\r\n            box-shadow: none;\r\n            letter-spacing: 0.12em;\r\n            line-height: 1.3;\r\n          }\r\n          .legend-dot {\r\n            display: inline-block;\r\n            width: 10px;\r\n            height: 10px;\r\n            margin-right: 6px;\r\n            vertical-align: middle;\r\n          }\r\n          .legend-item {\r\n            display: inline-flex;\r\n            align-items: center;\r\n            gap: 4px;\r\n            color: var(--clr-text-primary);\r\n          }\r\n          .dot-gray {\r\n            background: var(--clr-gmbh-fill);\r\n          }\r\n          .dot-blue {\r\n            background: var(--clr-shanghai-fill);\r\n          }\r\n\r\n          .info-panel-header {\r\n            display: flex;\r\n            justify-content: space-between;\r\n            align-items: flex-start;\r\n            margin-bottom: 20px;\r\n            border-bottom: 1px solid var(--clr-border-subtle);\r\n            padding-bottom: 14px;\r\n            flex-wrap: wrap;\r\n            gap: 10px;\r\n          }\r\n          .info-panel-header h2 {\r\n            color: #ffffff;\r\n            font-size: var(--fs-h1);\r\n            font-weight: 800;\r\n            letter-spacing: 0.03em;\r\n            margin: 0;\r\n            flex: 1;\r\n            min-width: 180px;\r\n            text-shadow: none;\r\n            line-height: var(--lh-heading);\r\n          }\r\n          .lang-switch {\r\n            display: flex;\r\n            gap: 2px;\r\n            background: rgba(2, 13, 37, 0.7);\r\n            padding: 3px;\r\n            border: 1px solid var(--clr-border-dim);\r\n            flex-shrink: 0;\r\n          }\r\n          .lang-btn {\r\n            padding: 6px 12px;\r\n            border: none;\r\n            cursor: pointer;\r\n            font-size: var(--fs-small);\r\n            font-weight: 600;\r\n            transition: all var(--transition-fast);\r\n            background: transparent;\r\n            color: var(--clr-text-secondary);\r\n            white-space: nowrap;\r\n            font-family: inherit;\r\n            letter-spacing: 0.1em;\r\n          }\r\n          .lang-btn.active {\r\n            background: var(--clr-accent);\r\n            color: #ffffff;\r\n            box-shadow: none;\r\n            transform: none;\r\n          }\r\n          .lang-btn:hover:not(.active) {\r\n            color: #ffffff;\r\n            background: rgba(0, 114, 206, 0.2);\r\n          }\r\n          .lang-btn:active {\r\n            transform: scale(0.96);\r\n          }\r\n\r\n          .country-selector {\r\n            margin-bottom: 20px;\r\n          }\r\n          .country-selector label {\r\n            display: block;\r\n            margin-bottom: 8px;\r\n            font-weight: 500;\r\n            color: var(--clr-text-secondary);\r\n            font-size: var(--fs-body);\r\n            letter-spacing: 0.05em;\r\n          }\r\n          select {\r\n            width: 100%;\r\n            padding: 13px 16px;\r\n            border: 1px solid var(--clr-border-dim);\r\n            font-size: var(--fs-body);\r\n            background: rgba(2, 13, 37, 0.6);\r\n            color: #f1f5f9;\r\n            cursor: pointer;\r\n            transition: all var(--transition-smooth);\r\n            appearance: none;\r\n            background-image: url(\"data:image\/svg+xml,%3csvg xmlns='http:\/\/www.w3.org\/2000\/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%230072ce' stroke-linecap='square' stroke-width='2' d='M6 8l4 4 4-4'\/%3e%3c\/svg%3e\");\r\n            background-position: right 14px center;\r\n            background-repeat: no-repeat;\r\n            background-size: 16px;\r\n            font-family: inherit;\r\n            box-shadow: none;\r\n            font-weight: 400;\r\n          }\r\n          select:focus {\r\n            outline: none;\r\n            border-color: var(--clr-accent-bright);\r\n            background: rgba(2, 13, 37, 0.75);\r\n          }\r\n          select:hover {\r\n            border-color: var(--clr-accent-bright);\r\n            background: rgba(2, 13, 37, 0.7);\r\n          }\r\n          select option {\r\n            background: #0a1c38;\r\n            color: #e8ecf1;\r\n            padding: 8px;\r\n          }\r\n          select optgroup {\r\n            background: #0a1c38;\r\n            color: #6a85b0;\r\n            font-weight: 600;\r\n            letter-spacing: 0.1em;\r\n            font-size: var(--fs-small);\r\n          }\r\n\r\n          .partners-container {\r\n            display: flex;\r\n            flex-direction: column;\r\n            gap: 14px;\r\n            flex-grow: 1;\r\n          }\r\n          .partner-tab {\r\n            background: var(--clr-bg-card);\r\n            border: 1px solid var(--clr-border-dim);\r\n            overflow: hidden;\r\n            transition: border-color var(--transition-smooth);\r\n            box-shadow: none;\r\n            position: relative;\r\n          }\r\n          .partner-tab:hover {\r\n            border-color: var(--clr-accent-bright);\r\n          }\r\n          .partner-tab.gmbh-highlight {\r\n            border-color: rgba(31, 52, 77, 0.9);\r\n          }\r\n          .partner-tab.gmbh-highlight:hover {\r\n            border-color: var(--clr-accent-bright);\r\n          }\r\n          .partner-header {\r\n            padding: 15px 18px;\r\n            cursor: pointer;\r\n            display: flex;\r\n            justify-content: space-between;\r\n            align-items: center;\r\n            background: transparent;\r\n            width: 100%;\r\n            text-align: left;\r\n            color: #ffffff;\r\n            font-weight: 600;\r\n            font-size: var(--fs-h3);\r\n            transition: background var(--transition-fast);\r\n            gap: 10px;\r\n            border: none;\r\n            font-family: inherit;\r\n            letter-spacing: 0.03em;\r\n            line-height: var(--lh-heading);\r\n          }\r\n          .partner-header:hover {\r\n            background: rgba(0, 114, 206, 0.08);\r\n          }\r\n          .partner-header:active {\r\n            background: rgba(0, 114, 206, 0.15);\r\n          }\r\n          .partner-header .arrow {\r\n            transition: transform 0.3s ease;\r\n            flex-shrink: 0;\r\n            font-size: 12px;\r\n            opacity: 0.7;\r\n            display: inline-block;\r\n            width: 20px;\r\n            height: 20px;\r\n            line-height: 20px;\r\n            text-align: center;\r\n            background: rgba(0, 114, 206, 0.15);\r\n            font-weight: 700;\r\n          }\r\n          .partner-content {\r\n            padding: 0 20px;\r\n            max-height: 0;\r\n            overflow: hidden;\r\n            transition: max-height 0.45s cubic-bezier(0.4, 0, 0.2, 1), padding 0.4s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.25s ease;\r\n            opacity: 0;\r\n            background: rgba(2, 13, 37, 0.3);\r\n          }\r\n          .partner-content.expanded {\r\n            padding: 20px;\r\n            max-height: 2000px;\r\n            opacity: 1;\r\n          }\r\n          .partner-name {\r\n            font-size: var(--fs-h2);\r\n            font-weight: 800;\r\n            margin-bottom: 12px;\r\n            color: #ffffff;\r\n            letter-spacing: 0.02em;\r\n            line-height: 1.3;\r\n            text-shadow: none;\r\n          }\r\n          .partner-name.gmbh-name {\r\n            color: #ffffff;\r\n          }\r\n          .partner-details p {\r\n            margin: 10px 0;\r\n            color: var(--clr-text-secondary);\r\n            font-weight: 400;\r\n            line-height: 1.6;\r\n            font-size: var(--fs-body);\r\n          }\r\n          .partner-details p strong {\r\n            color: #ffffff;\r\n            font-weight: 600;\r\n          }\r\n          .partner-content h3 {\r\n            font-size: var(--fs-subtitle);\r\n            font-weight: 600;\r\n            color: #1a8fe3;\r\n            margin: 12px 0 8px;\r\n            letter-spacing: 0.05em;\r\n            border-bottom: 1px solid rgba(0, 114, 206, 0.2);\r\n            padding-bottom: 4px;\r\n          }\r\n          .contact-link,\r\n          .global-contact-link {\r\n            display: inline-flex;\r\n            align-items: center;\r\n            justify-content: center;\r\n            gap: 6px;\r\n            background: var(--clr-accent);\r\n            color: white;\r\n            padding: 13px 24px;\r\n            text-decoration: none;\r\n            margin-top: 16px;\r\n            transition: background var(--transition-smooth);\r\n            font-weight: 600;\r\n            font-size: var(--fs-button);\r\n            box-shadow: none;\r\n            border: none;\r\n            cursor: pointer;\r\n            width: 100%;\r\n            text-align: center;\r\n            letter-spacing: 0.05em;\r\n            font-family: inherit;\r\n          }\r\n          .contact-link:hover,\r\n          .global-contact-link:hover {\r\n            background: #1a8fe3;\r\n            transform: none;\r\n          }\r\n          .clickable-email,\r\n          .clickable-phone,\r\n          .clickable-website {\r\n            color: #1a8fe3;\r\n            text-decoration: none;\r\n            border-bottom: 1px solid rgba(0, 114, 206, 0.4);\r\n            transition: color var(--transition-fast), border-color var(--transition-fast);\r\n            padding-bottom: 1px;\r\n          }\r\n          .clickable-email:hover,\r\n          .clickable-phone:hover,\r\n          .clickable-website:hover {\r\n            color: #ffffff;\r\n            border-bottom-color: #ffffff;\r\n          }\r\n          .product-item {\r\n            background: rgba(0, 114, 206, 0.06);\r\n            padding: 10px 14px;\r\n            margin-bottom: 7px;\r\n            font-size: var(--fs-body);\r\n            font-weight: 500;\r\n            color: #c8ddf8;\r\n            border-left: 3px solid var(--clr-accent);\r\n            transition: background var(--transition-fast);\r\n          }\r\n          .product-item:hover {\r\n            background: rgba(0, 114, 206, 0.12);\r\n            transform: none;\r\n            box-shadow: none;\r\n          }\r\n          .product-item::before {\r\n            content: '\u25b9';\r\n            margin-right: 6px;\r\n            color: #1a8fe3;\r\n            font-weight: bold;\r\n          }\r\n\r\n          .map-svg {\r\n            width: 100%;\r\n            height: 100%;\r\n            position: relative;\r\n            z-index: 5;\r\n          }\r\n          .country-path {\r\n            stroke: rgba(8, 22, 45, 0.85);\r\n            stroke-width: 0.6;\r\n            transition: fill var(--transition-smooth), stroke var(--transition-smooth);\r\n            cursor: pointer;\r\n            vector-effect: non-scaling-stroke;\r\n          }\r\n          .country-path:hover {\r\n            stroke: rgba(255, 255, 255, 0.5);\r\n            stroke-width: 1.2;\r\n          }\r\n\r\n          .map-controls {\r\n            position: absolute;\r\n            top: 20px;\r\n            right: 20px;\r\n            z-index: 12;\r\n            display: flex;\r\n            flex-direction: column;\r\n            gap: 8px;\r\n          }\r\n          .map-control-btn {\r\n            width: 40px;\r\n            height: 40px;\r\n            border: 1px solid var(--clr-border-dim);\r\n            background: rgba(2, 13, 37, 0.75);\r\n            display: flex;\r\n            align-items: center;\r\n            justify-content: center;\r\n            cursor: pointer;\r\n            font-size: var(--fs-icon);\r\n            font-weight: 700;\r\n            color: var(--clr-text-primary);\r\n            transition: background var(--transition-smooth), border-color var(--transition-smooth);\r\n            box-shadow: none;\r\n            font-family: inherit;\r\n            user-select: none;\r\n          }\r\n          .map-control-btn:hover {\r\n            background: var(--clr-accent);\r\n            border-color: var(--clr-accent-bright);\r\n            transform: none;\r\n          }\r\n          .reset-btn {\r\n            font-size: 18px;\r\n          }\r\n\r\n          .loading-message {\r\n            position: absolute;\r\n            top: 50%;\r\n            left: 50%;\r\n            transform: translate(-50%, -50%);\r\n            background: rgba(2, 13, 37, 0.85);\r\n            padding: 14px 28px;\r\n            font-size: var(--fs-body);\r\n            z-index: 10;\r\n            pointer-events: none;\r\n            color: #bbd7ff;\r\n            border: 1px solid var(--clr-border-dim);\r\n            box-shadow: none;\r\n            letter-spacing: 0.05em;\r\n            animation: loading-pulse 2s ease-in-out infinite;\r\n            font-weight: 500;\r\n          }\r\n          @keyframes loading-pulse {\r\n            0%, 100% { opacity: 0.7; }\r\n            50% { opacity: 1; }\r\n          }\r\n\r\n          .flat-pin {\r\n            cursor: pointer;\r\n            transform-origin: center center;\r\n          }\r\n          .flat-pin .pin-circle {\r\n            fill: var(--clr-pin);\r\n            stroke: #a50018;\r\n            stroke-width: 0.8;\r\n          }\r\n          .pin-pulse-ring {\r\n            fill: none;\r\n            stroke: var(--clr-pin);\r\n            stroke-width: 2;\r\n            opacity: 0;\r\n            pointer-events: none;\r\n            animation: pin-pulse 2.2s infinite;\r\n          }\r\n          @keyframes pin-pulse {\r\n            0% { r: 5; opacity: 0.6; }\r\n            100% { r: 18; opacity: 0; }\r\n          }\r\n\r\n          @media (max-width: 900px) {\r\n            .info-panel { width: 310px; }\r\n            .map-container { min-width: 380px; }\r\n          }\r\n          @media (max-width: 768px) {\r\n            .main-container { width: 100%; padding: 10px; }\r\n            .container { flex-direction: column; height: auto; min-height: auto; }\r\n            .info-panel { width: 100%; height: auto; }\r\n            .map-container { min-height: 340px; height: 45vh; }\r\n          }\r\n        <\/style>\r\n\r\n        <div class=\"main-container\">\r\n          <div class=\"container\">\r\n            <div class=\"info-panel\" id=\"partner-panel-root\"><\/div>\r\n            <div class=\"map-container\" id=\"map-root\">\r\n              <div class=\"map-controls\">\r\n                <button class=\"map-control-btn zoom-in-btn\" aria-label=\"Zoom In\">+<\/button>\r\n                <button class=\"map-control-btn zoom-out-btn\" aria-label=\"Zoom Out\">\u2212<\/button>\r\n                <button class=\"map-control-btn reset-btn\" aria-label=\"Reset View\">\u27f3<\/button>\r\n              <\/div>\r\n              <div id=\"loading-message\" class=\"loading-message\">\ud83d\uddfa\ufe0f Loading map...<\/div>\r\n              <svg id=\"world-map\" class=\"map-svg\"><\/svg>\r\n              <div class=\"inline-legend\" id=\"inline-legend\">\r\n                <div class=\"legend-item\"><span class=\"legend-dot dot-gray\"><\/span> <span class=\"legend-text-gmbh\">Curetec Energietechnik GmbH<\/span><\/div>\r\n                <div class=\"legend-item\"><span class=\"legend-dot dot-blue\"><\/span> <span class=\"legend-text-shanghai\">Curetec Shanghai<\/span><\/div>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n      `;\r\n    }\r\n\r\n    _loadDependencies() {\r\n      return Promise.all([\r\n        this._loadScript('https:\/\/d3js.org\/d3.v7.min.js'),\r\n        this._loadScript('https:\/\/cdn.jsdelivr.net\/npm\/topojson@3\/dist\/topojson.min.js')\r\n      ]);\r\n    }\r\n\r\n    _loadScript(src) {\r\n      return new Promise((resolve, reject) => {\r\n        if (document.querySelector(`script[src=\"${src}\"]`)) return resolve();\r\n        const script = document.createElement('script');\r\n        script.src = src;\r\n        script.onload = resolve;\r\n        script.onerror = reject;\r\n        document.head.appendChild(script);\r\n      });\r\n    }\r\n\r\n    _initApp() {\r\n      const root = this.shadowRoot;\r\n\r\n      const I18nService = (() => {\r\n        const translations = {\r\n          en: {\r\n            panelTitle: '\ud83c\udf0d Curetec Global Distribution Network',\r\n            selectLabel: '\ud83d\udccd Select Partner Country:',\r\n            selectPlaceholder: '-- Select --',\r\n            gmbhOption: '\ud83c\udde9\ud83c\uddea Curetec Energietechnik GmbH',\r\n            noPartnerMsg: '\u2728 Click the red pin on the map or<br>select from dropdown to view partner details',\r\n            noPartnerSelect: '\u2728 Select a partner country from dropdown',\r\n            noAuthPartner: '\u26a0\ufe0f No authorized partner in this region.<br>Please contact us directly.',\r\n            contactUs: '\ud83d\udce7 Contact Us',\r\n            gmbhDirectContact: '\ud83d\udcde Direct contact for this region:',\r\n            getQuote: '\ud83d\udce7 Get Quote & Tech Support',\r\n            mainProducts: '\ud83d\udee0\ufe0f Main Products',\r\n            addressLabel: '\ud83d\udccd Address:',\r\n            phoneLabel: '\ud83d\udcde Phone:',\r\n            emailLabel: '\u2709\ufe0f Email:',\r\n            websiteLabel: '\ud83c\udf10 Website:',\r\n            loadingMap: '\ud83d\uddfa\ufe0f Loading map...',\r\n            mapLoadFailed: 'Map failed to load. Please refresh.',\r\n            zoomInAria: 'Zoom In',\r\n            zoomOutAria: 'Zoom Out',\r\n            resetAria: 'Reset View',\r\n            legendGmbh: 'Curetec Energietechnik GmbH',\r\n            legendShanghai: 'Curetec Shanghai',\r\n            countryIndia: '\ud83c\uddee\ud83c\uddf3 India',\r\n            countryAustralia: '\ud83c\udde6\ud83c\uddfa Australia',\r\n            countryNewZealand: '\ud83c\uddf3\ud83c\uddff New Zealand',\r\n            countrySouthKorea: '\ud83c\uddf0\ud83c\uddf7 South Korea',\r\n            countryPhilippines: '\ud83c\uddf5\ud83c\udded Philippines',\r\n            countryRussia: '\ud83c\uddf7\ud83c\uddfa Russia',\r\n            optgroupLabel: '\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500',\r\n          },\r\n          zh: {\r\n            panelTitle: '\ud83c\udf0d Curetec \u5168\u7403\u5206\u9500\u7f51\u7edc',\r\n            selectLabel: '\ud83d\udccd \u9009\u62e9\u5408\u4f5c\u4f19\u4f34\u56fd\u5bb6\uff1a',\r\n            selectPlaceholder: '-- \u8bf7\u9009\u62e9 --',\r\n            gmbhOption: '\ud83c\udde9\ud83c\uddea Curetec Energietechnik GmbH\uff08\u5fb7\u56fd\u603b\u90e8\uff09',\r\n            noPartnerMsg: '\u2728 \u70b9\u51fb\u5730\u56fe\u4e0a\u7684\u7ea2\u8272\u6807\u8bb0\u6216<br>\u4ece\u4e0b\u62c9\u83dc\u5355\u9009\u62e9\u4ee5\u67e5\u770b\u5408\u4f5c\u4f19\u4f34\u8be6\u60c5',\r\n            noPartnerSelect: '\u2728 \u8bf7\u4ece\u4e0b\u62c9\u83dc\u5355\u9009\u62e9\u5408\u4f5c\u4f19\u4f34\u56fd\u5bb6',\r\n            noAuthPartner: '\u26a0\ufe0f \u8be5\u5730\u533a\u6682\u65e0\u6388\u6743\u5408\u4f5c\u4f19\u4f34\u3002<br>\u8bf7\u76f4\u63a5\u8054\u7cfb\u6211\u4eec\u3002',\r\n            contactUs: '\ud83d\udce7 \u8054\u7cfb\u6211\u4eec',\r\n            gmbhDirectContact: '\ud83d\udcde \u8be5\u5730\u533a\u76f4\u63a5\u8054\u7cfb\u65b9\u5f0f\uff1a',\r\n            getQuote: '\ud83d\udce7 \u83b7\u53d6\u62a5\u4ef7\u4e0e\u6280\u672f\u652f\u63f4',\r\n            mainProducts: '\ud83d\udee0\ufe0f \u4e3b\u8981\u4ea7\u54c1',\r\n            addressLabel: '\ud83d\udccd \u5730\u5740\uff1a',\r\n            phoneLabel: '\ud83d\udcde \u7535\u8bdd\uff1a',\r\n            emailLabel: '\u2709\ufe0f \u90ae\u7bb1\uff1a',\r\n            websiteLabel: '\ud83c\udf10 \u7f51\u7ad9\uff1a',\r\n            loadingMap: '\ud83d\uddfa\ufe0f \u52a0\u8f7d\u5730\u56fe\u4e2d...',\r\n            mapLoadFailed: '\u5730\u56fe\u52a0\u8f7d\u5931\u8d25\uff0c\u8bf7\u5237\u65b0\u9875\u9762\u3002',\r\n            zoomInAria: '\u653e\u5927',\r\n            zoomOutAria: '\u7f29\u5c0f',\r\n            resetAria: '\u91cd\u7f6e\u89c6\u56fe',\r\n            legendGmbh: 'Curetec Energietechnik GmbH',\r\n            legendShanghai: 'Curetec \u4e0a\u6d77',\r\n            countryIndia: '\ud83c\uddee\ud83c\uddf3 \u5370\u5ea6',\r\n            countryAustralia: '\ud83c\udde6\ud83c\uddfa \u6fb3\u5927\u5229\u4e9a',\r\n            countryNewZealand: '\ud83c\uddf3\ud83c\uddff \u65b0\u897f\u5170',\r\n            countrySouthKorea: '\ud83c\uddf0\ud83c\uddf7 \u97e9\u56fd',\r\n            countryPhilippines: '\ud83c\uddf5\ud83c\udded \u83f2\u5f8b\u5bbe',\r\n            countryRussia: '\ud83c\uddf7\ud83c\uddfa \u4fc4\u7f57\u65af',\r\n            optgroupLabel: '\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500',\r\n          },\r\n          ru: {\r\n            panelTitle: '\ud83c\udf0d \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u043e\u0440\u0441\u043a\u0430\u044f \u0441\u0435\u0442\u044c Curetec',\r\n            selectLabel: '\ud83d\udccd \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u0443 \u043f\u0430\u0440\u0442\u043d\u0435\u0440\u0430:',\r\n            selectPlaceholder: '-- \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 --',\r\n            gmbhOption: '\ud83c\udde9\ud83c\uddea Curetec Energietechnik GmbH (\u0413\u0435\u0440\u043c\u0430\u043d\u0438\u044f)',\r\n            noPartnerMsg: '\u2728 \u041d\u0430\u0436\u043c\u0438\u0442\u0435 \u043d\u0430 \u043a\u0440\u0430\u0441\u043d\u0443\u044e \u043c\u0435\u0442\u043a\u0443 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u0438\u043b\u0438<br>\u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0430\u0440\u0442\u043d\u0435\u0440\u0435',\r\n            noPartnerSelect: '\u2728 \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u0443 \u043f\u0430\u0440\u0442\u043d\u0435\u0440\u0430 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430',\r\n            noAuthPartner: '\u26a0\ufe0f \u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0433\u0438\u043e\u043d\u0435 \u043d\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0442\u043d\u0435\u0440\u0430.<br>\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u0432\u044f\u0436\u0438\u0442\u0435\u0441\u044c \u0441 \u043d\u0430\u043c\u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e.',\r\n            contactUs: '\ud83d\udce7 \u0421\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u0430\u043c\u0438',\r\n            gmbhDirectContact: '\ud83d\udcde \u041f\u0440\u044f\u043c\u043e\u0439 \u043a\u043e\u043d\u0442\u0430\u043a\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430:',\r\n            getQuote: '\ud83d\udce7 \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0442\u0435\u0445\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443',\r\n            mainProducts: '\ud83d\udee0\ufe0f \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b',\r\n            addressLabel: '\ud83d\udccd \u0410\u0434\u0440\u0435\u0441:',\r\n            phoneLabel: '\ud83d\udcde \u0422\u0435\u043b\u0435\u0444\u043e\u043d:',\r\n            emailLabel: '\u2709\ufe0f \u042d\u043b. \u043f\u043e\u0447\u0442\u0430:',\r\n            websiteLabel: '\ud83c\udf10 \u0421\u0430\u0439\u0442:',\r\n            loadingMap: '\ud83d\uddfa\ufe0f \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u0430\u0440\u0442\u044b...',\r\n            mapLoadFailed: '\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0443. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.',\r\n            zoomInAria: '\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c',\r\n            zoomOutAria: '\u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c',\r\n            resetAria: '\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0432\u0438\u0434',\r\n            legendGmbh: 'Curetec Energietechnik GmbH',\r\n            legendShanghai: 'Curetec Shanghai',\r\n            countryIndia: '\ud83c\uddee\ud83c\uddf3 \u0418\u043d\u0434\u0438\u044f',\r\n            countryAustralia: '\ud83c\udde6\ud83c\uddfa \u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u044f',\r\n            countryNewZealand: '\ud83c\uddf3\ud83c\uddff \u041d\u043e\u0432\u0430\u044f \u0417\u0435\u043b\u0430\u043d\u0434\u0438\u044f',\r\n            countrySouthKorea: '\ud83c\uddf0\ud83c\uddf7 \u042e\u0436\u043d\u0430\u044f \u041a\u043e\u0440\u0435\u044f',\r\n            countryPhilippines: '\ud83c\uddf5\ud83c\udded \u0424\u0438\u043b\u0438\u043f\u043f\u0438\u043d\u044b',\r\n            countryRussia: '\ud83c\uddf7\ud83c\uddfa \u0420\u043e\u0441\u0441\u0438\u044f',\r\n            optgroupLabel: '\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500',\r\n          }\r\n        };\r\n\r\n        let currentLang = 'en';\r\n        return {\r\n          get currentLang() { return currentLang; },\r\n          setLang(lang) { if (translations[lang]) currentLang = lang; },\r\n          t(key) { return translations[currentLang]?.[key] || translations['en'][key] || key; }\r\n        };\r\n      })();\r\n\r\n      const t = (key) => I18nService.t(key);\r\n\r\n      const DataStore = (() => {\r\n        const nexsoftPartner = {\r\n          name: \"Nexsoft Australia & New Zealand\",\r\n          address: \"12 Envision Close Pakenham VIC 3810, Australia \/ Serving New Zealand region\",\r\n          phone: \"+61 424 449 552\",\r\n          email: \"marketing@nexsoftaustralia.com.au\",\r\n          website: \"www.nexsoftaustralia.com.au\",\r\n          products: [\"CureComplete System\", \"CureControl System\"]\r\n        };\r\n\r\n        const partnersData = {\r\n          \"IND\": [{ name: \"Apollo Infratech\", address: \"Village : Rajpur - 382 715, Dist. Mehsana, Gujarat, India\", phone: \"+91 75676 11088\", email: \"info@apolloinfratech.com\", website: \"www.apolloinfratech.com\", products: [\"VG Vapor Generator\", \"CureComplete System\", \"CureControl System\"] }],\r\n          \"AUS\": [nexsoftPartner],\r\n          \"NZL\": [nexsoftPartner],\r\n          \"KOR\": [{ name: \"Nordimpianti Korea Corp.\", address: \"189-16, Chungcheong-daero, Wonnam-myeon, Eumseong-gun, Chungcheongbuk-do, Republic of Korea\", phone: \"+82 10 9093 9253\", email: \"minkyukim@nordimpianti.com\", website: \"www.nordimpianti-korea.co.kr\", products: [\"VG Vapor Generator\", \"CureComplete System\"] }],\r\n          \"PHL\": [{ name: \"Bueven Inc.\", address: \"Unit 2C Linear Bldg. 142 Katipunan Avenue, Brgy. St. Ignatius Quezon City, Philippines\", phone: \"(02) 8 715 0756\", email: \"info@bueven.com\", website: \"www.bueven.com\", products: [\"CureControl System\", \"VG Vapor Generator\"] }],\r\n          \"RUS\": [{ name: \"Betonmash\", address: \"129226, \u0433. \u041c\u043e\u0441\u043a\u0432\u0430, \u0421\u0435\u043b\u044c\u0441\u043a\u043e\u0445\u043e\u0437\u044f\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0443\u043b., \u0434. 17, \u043a\u043e\u0440\u043f. 1, Russia\", phone: \"+7 4957965410\", email: \"office@betonmash.ru\", website: \"betonmash.ru\", products: [\"CureComplete System\", \"CureControl System\", \"VG Vapor Generator\"] }]\r\n        };\r\n\r\n        const gmbhHQ = { name: \"Curetec Energietechnik GmbH\", phone: \"+49 (0) 4479\/9390-600\", phoneClean: \"+4944799390600\" };\r\n\r\n        const americasSet = new Set([\"USA\",\"CAN\",\"MEX\",\"GTM\",\"BLZ\",\"HND\",\"SLV\",\"NIC\",\"CRI\",\"PAN\",\"BHS\",\"CUB\",\"JAM\",\"HTI\",\"DOM\",\"PRI\",\"VCT\",\"LCA\",\"GRD\",\"BRB\",\"TTO\",\"ABW\",\"CUW\",\"SXM\",\"KNA\",\"DMA\",\"COL\",\"VEN\",\"GUY\",\"SUR\",\"GUF\",\"ECU\",\"PER\",\"BRA\",\"BOL\",\"PRY\",\"CHL\",\"ARG\",\"URY\",\"FLK\"]);\r\n        const europeExclRussiaSet = new Set([\"GBR\",\"FRA\",\"DEU\",\"ITA\",\"ESP\",\"PRT\",\"NLD\",\"BEL\",\"LUX\",\"IRL\",\"DNK\",\"SWE\",\"NOR\",\"FIN\",\"ISL\",\"AUT\",\"CHE\",\"CZE\",\"SVK\",\"HUN\",\"POL\",\"ROU\",\"BGR\",\"SRB\",\"HRV\",\"SVN\",\"BIH\",\"MNE\",\"ALB\",\"MKD\",\"GRC\",\"EST\",\"LVA\",\"LTU\",\"UKR\",\"BLR\",\"MDA\",\"AND\",\"MCO\",\"LIE\",\"SMR\",\"VAT\",\"MLT\",\"CYP\"]);\r\n        const numericIsoMap = { 840:\"USA\",124:\"CAN\",826:\"GBR\",276:\"DEU\",250:\"FRA\",392:\"JPN\",36:\"AUS\",702:\"SGP\",710:\"ZAF\",76:\"BRA\",356:\"IND\",156:\"CHN\",158:\"TWN\",410:\"KOR\",608:\"PHL\",643:\"RUS\",484:\"MEX\",724:\"ESP\",380:\"ITA\",528:\"NLD\",756:\"CHE\",56:\"BEL\",40:\"AUT\",203:\"CZE\",348:\"HUN\",616:\"POL\",642:\"ROU\",100:\"BGR\",191:\"HRV\",705:\"SVN\",688:\"SRB\",32:\"ARG\",152:\"CHL\",170:\"COL\",218:\"ECU\",604:\"PER\",862:\"VEN\",68:\"BOL\",600:\"PRY\",858:\"URY\",52:\"BRB\",192:\"CUB\",214:\"DOM\",332:\"HTI\",388:\"JAM\",222:\"SLV\",320:\"GTM\",340:\"HND\",558:\"NIC\",188:\"CRI\",591:\"PAN\",752:\"SWE\",578:\"NOR\",208:\"DNK\",246:\"FIN\",372:\"IRL\",804:\"UKR\",112:\"BLR\",440:\"LTU\",428:\"LVA\",233:\"EST\",470:\"MLT\",300:\"GRC\",620:\"PRT\",703:\"SVK\",807:\"MKD\",499:\"MNE\",70:\"BIH\",50:\"BGD\",104:\"MMR\",360:\"IDN\",364:\"IRN\",368:\"IRQ\",376:\"ISR\",400:\"JOR\",414:\"KWT\",422:\"LBN\",458:\"MYS\",512:\"OMN\",586:\"PAK\",634:\"QAT\",682:\"SAU\",760:\"SYR\",784:\"ARE\",887:\"YEM\",12:\"DZA\",24:\"AGO\",72:\"BWA\",204:\"BEN\",262:\"DJI\",266:\"GAB\",270:\"GMB\",288:\"GHA\",324:\"GIN\",384:\"CIV\",404:\"KEN\",426:\"LSO\",430:\"LBR\",450:\"MDG\",454:\"MWI\",466:\"MLI\",478:\"MRT\",480:\"MUS\",504:\"MAR\",508:\"MOZ\",516:\"NAM\",562:\"NER\",566:\"NGA\",646:\"RWA\",686:\"SEN\",690:\"SYC\",694:\"SLE\",706:\"SOM\",716:\"ZWE\",728:\"SSD\",748:\"SWZ\",768:\"TGO\",788:\"TUN\",800:\"UGA\",834:\"TZA\",894:\"ZMB\",818:\"EGY\",729:\"TCD\",226:\"GNQ\",231:\"ETH\",554:\"NZL\" };\r\n\r\n        function getCountryISO(id) {\r\n          if (typeof id === 'number') { const m = numericIsoMap[id]; return m === \"TWN\" ? \"CHN\" : (m || null); }\r\n          const code = id.toString().toUpperCase();\r\n          return code === 'TWN' ? 'CHN' : code;\r\n        }\r\n        function getRegionGroup(isoCode) {\r\n          if (!isoCode) return \"SHANGHAI\";\r\n          if (isoCode === \"RUS\") return \"SHANGHAI\";\r\n          if (americasSet.has(isoCode) || europeExclRussiaSet.has(isoCode)) return \"GMBH\";\r\n          return \"SHANGHAI\";\r\n        }\r\n        function getCountryFillStyle(countryCode) { return getRegionGroup(countryCode) === \"GMBH\" ? \"#1f3d66\" : \"#0072ce\"; }\r\n        function hasPartner(countryCode) { return !!(countryCode && partnersData[countryCode]); }\r\n        function getPartners(countryCode) { return partnersData[countryCode] || null; }\r\n\r\n        return { partnersData, gmbhHQ, getCountryISO, getRegionGroup, getCountryFillStyle, hasPartner, getPartners, numericIsoMap, contactUrl: \"https:\/\/curetecglobal.com\/contact-us\" };\r\n      })();\r\n\r\n      class PanelComponent {\r\n        constructor(containerId) {\r\n          this.container = root.getElementById(containerId);\r\n          this.partnersContainer = null;\r\n          this.countrySelect = null;\r\n          this.currentSelectedValue = \"\";\r\n          this._onCountrySelect = null;\r\n          this._onLanguageChange = null;\r\n          this.renderStatic();\r\n          this.bindSelectChange();\r\n          this.bindLangSwitches();\r\n        }\r\n        set onCountrySelect(cb) { this._onCountrySelect = cb; }\r\n        set onLanguageChange(cb) { this._onLanguageChange = cb; }\r\n        renderStatic() {\r\n          this.container.innerHTML = `\r\n            <div class=\"info-panel-header\">\r\n              <h2>${t('panelTitle')}<\/h2>\r\n              <div class=\"lang-switch\">\r\n                <button class=\"lang-btn ${I18nService.currentLang==='en'?'active':''}\" data-lang=\"en\">EN<\/button>\r\n                <button class=\"lang-btn ${I18nService.currentLang==='zh'?'active':''}\" data-lang=\"zh\">\u4e2d\u6587<\/button>\r\n                <button class=\"lang-btn ${I18nService.currentLang==='ru'?'active':''}\" data-lang=\"ru\">RU<\/button>\r\n              <\/div>\r\n            <\/div>\r\n            <div class=\"country-selector\">\r\n              <label for=\"country-select\">${t('selectLabel')}<\/label>\r\n              <select id=\"country-select\">\r\n                <option value=\"\">${t('selectPlaceholder')}<\/option>\r\n                <option value=\"IND\">${t('countryIndia')}<\/option>\r\n                <option value=\"AUS\">${t('countryAustralia')}<\/option>\r\n                <option value=\"NZL\">${t('countryNewZealand')}<\/option>\r\n                <option value=\"KOR\">${t('countrySouthKorea')}<\/option>\r\n                <option value=\"PHL\">${t('countryPhilippines')}<\/option>\r\n                <option value=\"RUS\">${t('countryRussia')}<\/option>\r\n                <optgroup label=\"${t('optgroupLabel')}\"><\/optgroup>\r\n                <option value=\"__GMBH_DEU__\">${t('gmbhOption')}<\/option>\r\n              <\/select>\r\n            <\/div>\r\n            <div id=\"dynamic-partners\" class=\"partners-container\">\r\n              <p class=\"no-partner\" style=\"text-align:center;\">${t('noPartnerMsg')}<\/p>\r\n            <\/div>\r\n          `;\r\n          this.partnersContainer = this.container.querySelector('#dynamic-partners');\r\n          this.countrySelect = this.container.querySelector('#country-select');\r\n        }\r\n        bindSelectChange() { if (this.countrySelect) this.countrySelect.addEventListener('change', e => this.handleSelectChange(e)); }\r\n        bindLangSwitches() {\r\n          this.container.querySelectorAll('.lang-btn').forEach(btn => {\r\n            btn.addEventListener('click', () => { const lang = btn.getAttribute('data-lang'); if (lang && lang !== I18nService.currentLang) this.switchLanguage(lang); });\r\n          });\r\n        }\r\n        switchLanguage(newLang) {\r\n          const sv = this.countrySelect ? this.countrySelect.value : this.currentSelectedValue;\r\n          I18nService.setLang(newLang);\r\n          this.renderStatic();\r\n          this.bindSelectChange();\r\n          this.bindLangSwitches();\r\n          if (sv) { this.countrySelect.value = sv; this.currentSelectedValue = sv; this.handleSelectChange({ target: { value: sv } }); }\r\n          else { this.currentSelectedValue = \"\"; this.partnersContainer.innerHTML = `<p class=\"no-partner\" style=\"text-align:center;\">${t('noPartnerMsg')}<\/p>`; }\r\n          if (this._onLanguageChange) this._onLanguageChange(newLang);\r\n        }\r\n        handleSelectChange(e) {\r\n          const val = e.target.value; this.currentSelectedValue = val;\r\n          if (val && val.startsWith('__GMBH_')) { this.showGmbhSimpleContact(); if (this._onCountrySelect) this._onCountrySelect(val.replace('__GMBH_','').replace('__',''), false); }\r\n          else if (val && DataStore.hasPartner(val)) { this.displayPartners(val); if (this._onCountrySelect) this._onCountrySelect(val, true); }\r\n          else if (val && DataStore.getRegionGroup(val)===\"GMBH\") { this.showGmbhSimpleContact(); if (this._onCountrySelect) this._onCountrySelect(val, false); }\r\n          else if (val) { this.showNoPartnerMessage(); if (this._onCountrySelect) this._onCountrySelect(null, false); }\r\n          else { this.partnersContainer.innerHTML = `<p class=\"no-partner\" style=\"text-align:center;\">${t('noPartnerSelect')}<\/p>`; if (this._onCountrySelect) this._onCountrySelect(null, false); }\r\n        }\r\n        setSelectedCountry(countryCode, hasPartner) {\r\n          if (hasPartner && countryCode && DataStore.hasPartner(countryCode)) this.displayPartners(countryCode);\r\n          else if (countryCode && !hasPartner && DataStore.getRegionGroup(countryCode)===\"GMBH\") this.showGmbhSimpleContact();\r\n          else if (countryCode && !hasPartner) { this.showNoPartnerMessage(); if (this.countrySelect) this.countrySelect.value = \"\"; this.currentSelectedValue = \"\"; }\r\n          else if (!countryCode) { this.partnersContainer.innerHTML = `<p class=\"no-partner\" style=\"text-align:center;\">${t('noPartnerMsg')}<\/p>`; if (this.countrySelect) this.countrySelect.value = \"\"; this.currentSelectedValue = \"\"; }\r\n        }\r\n        showNoPartnerMessage() {\r\n          this.partnersContainer.innerHTML = `<div style=\"text-align:center;\"><p class=\"no-partner\" style=\"margin-bottom:16px;\">${t('noAuthPartner')}<\/p><a href=\"${DataStore.contactUrl}\" target=\"_blank\" class=\"global-contact-link\">${t('contactUs')}<\/a><\/div>`;\r\n        }\r\n        _buildCompanyHTML(name) { return `<span>${name}<\/span>`; }\r\n        _createCollapsibleTab(tabCls, companyName, contentHTML, expandDefault = false, extraTabClass = '') {\r\n          const tab = document.createElement('div');\r\n          tab.className = 'partner-tab' + (extraTabClass ? ' ' + extraTabClass : '');\r\n          tab.innerHTML = `<button class=\"partner-header\"><div style=\"flex:1;text-align:left;min-width:0;\">${this._buildCompanyHTML(companyName)}<\/div><span class=\"arrow\">\u25bc<\/span><\/button><div class=\"partner-content${expandDefault?' expanded':''}\">${contentHTML}<\/div>`;\r\n          const hd = tab.querySelector('.partner-header');\r\n          const ct = tab.querySelector('.partner-content');\r\n          const ar = hd.querySelector('.arrow');\r\n          hd.addEventListener('click', () => {\r\n            const isExp = ct.classList.contains('expanded');\r\n            this.partnersContainer.querySelectorAll('.partner-tab .partner-content').forEach(c => {\r\n              if (c !== ct) { c.classList.remove('expanded'); const ph = c.previousElementSibling; if (ph && ph.querySelector('.arrow')) ph.querySelector('.arrow').style.transform = 'rotate(0deg)'; }\r\n            });\r\n            if (isExp) { ct.classList.remove('expanded'); ar.style.transform = 'rotate(0deg)'; }\r\n            else { ct.classList.add('expanded'); ar.style.transform = 'rotate(180deg)'; }\r\n          });\r\n          if (expandDefault && ar) ar.style.transform = 'rotate(180deg)';\r\n          return tab;\r\n        }\r\n        showGmbhSimpleContact() {\r\n          const g = DataStore.gmbhHQ;\r\n          this.partnersContainer.innerHTML = '';\r\n          const tab = this._createCollapsibleTab('gmbh-tab', g.name, `<div class=\"partner-name gmbh-name\">${g.name}<\/div><div class=\"simple-phone-card\"><p style=\"color:#b0c4d8;margin-bottom:4px;\">${t('gmbhDirectContact')}<\/p><a href=\"tel:${g.phoneClean}\" class=\"clickable-phone phone-number\">${g.phone}<\/a><\/div>`, true, 'gmbh-highlight');\r\n          this.partnersContainer.appendChild(tab);\r\n          if (this.countrySelect) this.countrySelect.value = '__GMBH_DEU__';\r\n          this.currentSelectedValue = '__GMBH_DEU__';\r\n        }\r\n        displayPartners(countryCode) {\r\n          const partners = DataStore.getPartners(countryCode);\r\n          if (!partners || partners.length === 0) { this.showNoPartnerMessage(); return; }\r\n          this.partnersContainer.innerHTML = '';\r\n          partners.forEach((p, idx) => {\r\n            const tab = this._createCollapsibleTab('partner-tab-'+idx, p.name, `<div class=\"partner-name\">${p.name}<\/div><div class=\"partner-details\"><p><strong>${t('addressLabel')}<\/strong> <a href=\"https:\/\/maps.google.com\/?q=${encodeURIComponent(p.address)}\" target=\"_blank\" class=\"clickable-website\">${p.address}<\/a><\/p><p><strong>${t('phoneLabel')}<\/strong> <a href=\"tel:${p.phone.replace(\/\\s+\/g,'')}\" class=\"clickable-phone\">${p.phone}<\/a><\/p><p><strong>${t('emailLabel')}<\/strong> <a href=\"mailto:${p.email.trim()}\" class=\"clickable-email\">${p.email.trim()}<\/a><\/p><p><strong>${t('websiteLabel')}<\/strong> <a href=\"https:\/\/${p.website.replace(\/^https?:\\\/\\\/\/,'')}\" target=\"_blank\" class=\"clickable-website\">${p.website}<\/a><\/p><\/div><div class=\"products-section\"><h3>${t('mainProducts')}<\/h3>${p.products.map(pr => `<div class=\"product-item\">${pr}<\/div>`).join('')}<\/div><a href=\"mailto:${p.email.trim()}\" class=\"contact-link\">${t('getQuote')}<\/a>`, idx === 0);\r\n            this.partnersContainer.appendChild(tab);\r\n          });\r\n          if (this.countrySelect) this.countrySelect.value = countryCode;\r\n          this.currentSelectedValue = countryCode;\r\n        }\r\n      }\r\n\r\n      class MapComponent {\r\n        constructor(containerId) {\r\n          this.container = root.getElementById(containerId);\r\n          this.svg = null; this.g = null; this.projection = null; this.path = null; this.zoom = null;\r\n          this.selectedCountry = null; this.worldData = null; this.countriesFeatures = null;\r\n          this._onCountryClick = null;\r\n          this.init();\r\n        }\r\n        set onCountryClick(cb) { this._onCountryClick = cb; }\r\n        init() {\r\n          const w = this.container.clientWidth, h = this.container.clientHeight;\r\n          if (w <= 100 || h <= 100) { setTimeout(() => this.init(), 150); return; }\r\n          this.projection = d3.geoMercator().scale(w < 700 ? 70 : 120).translate([w \/ 2, h \/ 1.55]);\r\n          this.path = d3.geoPath().projection(this.projection);\r\n          this.svg = d3.select(root.getElementById(\"world-map\")).attr(\"width\", w).attr(\"height\", h);\r\n          this.svg.selectAll(\"*\").remove();\r\n          this.g = this.svg.append(\"g\");\r\n          this.zoom = d3.zoom().scaleExtent([0.5, 10]).on(\"zoom\", (event) => { this.g.attr(\"transform\", event.transform); });\r\n          this.svg.call(this.zoom);\r\n          this._ensureDefs();\r\n          this.attachControls();\r\n          this.updateUITexts();\r\n          this.fetchMapData();\r\n        }\r\n        _ensureDefs() {\r\n          if (!this.g.select(\"defs\").empty()) return;\r\n          const defs = this.g.append(\"defs\");\r\n          const gf = defs.append(\"filter\").attr(\"id\",\"glow\").attr(\"x\",\"-30%\").attr(\"y\",\"-30%\").attr(\"width\",\"160%\").attr(\"height\",\"160%\");\r\n          gf.append(\"feDropShadow\").attr(\"dx\",0).attr(\"dy\",0).attr(\"stdDeviation\",4).attr(\"flood-color\",\"#ffffff\").attr(\"flood-opacity\",0.7);\r\n          gf.append(\"feDropShadow\").attr(\"dx\",0).attr(\"dy\",0).attr(\"stdDeviation\",8).attr(\"flood-color\",\"#0072ce\").attr(\"flood-opacity\",0.4);\r\n          const sg = defs.append(\"filter\").attr(\"id\",\"glow-strong\").attr(\"x\",\"-40%\").attr(\"y\",\"-40%\").attr(\"width\",\"180%\").attr(\"height\",\"180%\");\r\n          sg.append(\"feDropShadow\").attr(\"dx\",0).attr(\"dy\",0).attr(\"stdDeviation\",5).attr(\"flood-color\",\"#ffffff\").attr(\"flood-opacity\",0.85);\r\n          sg.append(\"feDropShadow\").attr(\"dx\",0).attr(\"dy\",0).attr(\"stdDeviation\",12).attr(\"flood-color\",\"#0072ce\").attr(\"flood-opacity\",0.5);\r\n        }\r\n        attachControls() {\r\n          const zi = this.container.querySelector('.zoom-in-btn'), zo = this.container.querySelector('.zoom-out-btn'), rst = this.container.querySelector('.reset-btn');\r\n          if (zi) zi.addEventListener('click', () => this.svg.transition().duration(300).call(this.zoom.scaleBy, 1.4));\r\n          if (zo) zo.addEventListener('click', () => this.svg.transition().duration(300).call(this.zoom.scaleBy, 0.7));\r\n          if (rst) rst.addEventListener('click', () => this.svg.transition().duration(400).call(this.zoom.transform, d3.zoomIdentity));\r\n        }\r\n        updateUITexts() {\r\n          const lm = root.getElementById('loading-message'); if (lm) lm.textContent = t('loadingMap');\r\n          const lg = this.container.querySelector('.legend-text-gmbh'), ls = this.container.querySelector('.legend-text-shanghai');\r\n          if (lg) lg.textContent = t('legendGmbh'); if (ls) ls.textContent = t('legendShanghai');\r\n          ['zoom-in-btn','zoom-out-btn','reset-btn'].forEach(cls => {\r\n            const btn = this.container.querySelector('.'+cls);\r\n            if (btn) { const am = {'zoom-in-btn':'zoomInAria','zoom-out-btn':'zoomOutAria','reset-btn':'resetAria'}; btn.setAttribute('aria-label', t(am[cls])); }\r\n          });\r\n        }\r\n        fetchMapData() {\r\n          const sources = [\"https:\/\/cdn.jsdelivr.net\/npm\/world-atlas@2\/countries-110m.json\", \"https:\/\/raw.githubusercontent.com\/holtzy\/D3-graph-gallery\/master\/DATA\/world.geojson\"];\r\n          let idx = 0;\r\n          const attempt = () => {\r\n            if (idx >= sources.length) { const lm = root.getElementById('loading-message'); if (lm) lm.textContent = t('mapLoadFailed'); return; }\r\n            d3.json(sources[idx]).then(data => { this.worldData = data; this.renderMap(); }).catch(() => { idx++; attempt(); });\r\n          };\r\n          attempt();\r\n        }\r\n        renderMap() {\r\n          const lm = root.getElementById('loading-message'); if (lm) lm.style.display = 'none';\r\n          let countries;\r\n          if (this.worldData.objects && this.worldData.objects.countries) countries = topojson.feature(this.worldData, this.worldData.objects.countries).features;\r\n          else if (this.worldData.features) countries = this.worldData.features;\r\n          else return;\r\n          countries = countries.filter(d => DataStore.getCountryISO(d.id) !== 'TWN');\r\n          this.countriesFeatures = countries;\r\n          this.g.selectAll(\"path\").remove();\r\n          this.g.selectAll(\"path\")\r\n            .data(countries, d => d.id)\r\n            .enter().append(\"path\")\r\n            .attr(\"d\", this.path)\r\n            .attr(\"class\",\"country-path\")\r\n            .attr(\"data-code\", d => DataStore.getCountryISO(d.id))\r\n            .style(\"fill\", d => DataStore.getCountryFillStyle(DataStore.getCountryISO(d.id)))\r\n            .on(\"click\", (event, d) => { const code = DataStore.getCountryISO(d.id); const hp = DataStore.hasPartner(code); this.setSelectedCountry(code); if (this._onCountryClick) this._onCountryClick(code, hp); })\r\n            .on(\"mouseover\", function() { d3.select(this).style(\"filter\",\"brightness(0.9)\"); })\r\n            .on(\"mouseout\", function() { d3.select(this).style(\"filter\",\"\"); });\r\n          this.updateMapVisuals();\r\n          this.renderPins();\r\n          if (!this.selectedCountry) { const dc = \"IND\"; this.setSelectedCountry(dc); if (this._onCountryClick) this._onCountryClick(dc, true); }\r\n        }\r\n        renderPins() {\r\n          this.g.selectAll(\".flat-pin\").remove();\r\n          if (!this.countriesFeatures) return;\r\n          const pc = this.countriesFeatures.filter(d => { const code = DataStore.getCountryISO(d.id); return code && DataStore.hasPartner(code); });\r\n          pc.forEach(feature => {\r\n            const code = DataStore.getCountryISO(feature.id);\r\n            const centroid = this.path.centroid(feature);\r\n            if (!centroid || isNaN(centroid[0]) || isNaN(centroid[1])) return;\r\n            const [x, y] = centroid;\r\n            const pg = this.g.append(\"g\").attr(\"class\",\"flat-pin\").attr(\"transform\",`translate(${x}, ${y})`).style(\"cursor\",\"pointer\")\r\n              .on(\"click\", (event) => { event.stopPropagation(); const hp = DataStore.hasPartner(code); this.setSelectedCountry(code); if (this._onCountryClick) this._onCountryClick(code, hp); });\r\n            pg.append(\"circle\").attr(\"cx\",0).attr(\"cy\",-2).attr(\"r\",5).attr(\"class\",\"pin-pulse-ring\");\r\n            pg.append(\"circle\").attr(\"cx\",0).attr(\"cy\",-2).attr(\"r\",5).attr(\"fill\",\"#ff3b47\").attr(\"stroke\",\"#a50018\").attr(\"stroke-width\",0.8);\r\n            pg.append(\"line\").attr(\"x1\",0).attr(\"y1\",3).attr(\"x2\",0).attr(\"y2\",8).attr(\"stroke\",\"#a50018\").attr(\"stroke-width\",1.2).attr(\"stroke-linecap\",\"square\");\r\n            pg.append(\"circle\").attr(\"cx\",-1.5).attr(\"cy\",-3.5).attr(\"r\",1.2).attr(\"fill\",\"#ffb3b8\").attr(\"opacity\",0.85);\r\n          });\r\n        }\r\n        updateMapVisuals() {\r\n          if (!this.g) return;\r\n          this.g.selectAll(\"path.country-path\")\r\n            .attr(\"fill\", d => DataStore.getCountryFillStyle(DataStore.getCountryISO(d.id)))\r\n            .attr(\"stroke\", d => DataStore.getCountryISO(d.id) === this.selectedCountry ? \"#ffffff\" : \"rgba(8,22,45,0.85)\")\r\n            .attr(\"stroke-width\", d => DataStore.getCountryISO(d.id) === this.selectedCountry ? \"2.8\" : \"0.6\")\r\n            .attr(\"filter\", d => DataStore.getCountryISO(d.id) === this.selectedCountry ? \"url(#glow-strong)\" : null);\r\n        }\r\n        setSelectedCountry(code) { this.selectedCountry = code; this.updateMapVisuals(); }\r\n        resize() {\r\n          const w = this.container.clientWidth, h = this.container.clientHeight;\r\n          if (!w || !h) return;\r\n          this.projection.scale(w < 700 ? 70 : 120).translate([w \/ 2, h \/ 1.55]);\r\n          this.path = d3.geoPath().projection(this.projection);\r\n          this.svg.attr(\"width\", w).attr(\"height\", h);\r\n          if (this.worldData) this.renderMap();\r\n          this.updateUITexts();\r\n        }\r\n      }\r\n\r\n      class AppController {\r\n        constructor() { this.panel = null; this.map = null; this.resizeTimer = null; }\r\n        init() {\r\n          this.panel = new PanelComponent('partner-panel-root');\r\n          this.panel.onCountrySelect = (cc, hp) => this._handlePanelSelect(cc, hp);\r\n          this.panel.onLanguageChange = () => this._handleLanguageChange();\r\n          this.map = new MapComponent('map-root');\r\n          this.map.onCountryClick = (cc, hp) => this._handleMapClick(cc, hp);\r\n          window.addEventListener('resize', () => { clearTimeout(this.resizeTimer); this.resizeTimer = setTimeout(() => { if (this.map) this.map.resize(); }, 200); });\r\n        }\r\n        _handlePanelSelect(cc, hp) { if (cc && hp) this.map.setSelectedCountry(cc); else if (cc && DataStore.getRegionGroup(cc)===\"GMBH\") this.map.setSelectedCountry(cc); else if (cc === null) this.map.setSelectedCountry(null); }\r\n        _handleMapClick(cc, hp) { this.panel.setSelectedCountry(cc, hp); }\r\n        _handleLanguageChange() { if (this.map) this.map.updateUITexts(); }\r\n      }\r\n\r\n      const app = new AppController();\r\n      app.init();\r\n      this._ready = true;\r\n    }\r\n  }\r\n\r\n  customElements.define('curetec-partner-map', CuretecPartnerMap);\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7c1d92f e-flex e-con-boxed e-con e-parent\" data-id=\"7c1d92f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\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>\u5168\u7403\u667a\u80fd\u6df7\u51dd\u571f\u517b\u62a4\u89e3\u51b3\u65b9\u6848\u4e13\u4e1a\u77e5\u8bc6\n\u5168\u7403\u6280\u672f \u672c\u5730\u4f19\u4f34\n\u6211\u4eec\u4e0e\u4e16\u754c\u5404\u5730\u503c\u5f97\u4fe1\u8d56\u7684\u5408\u4f5c\u4f19\u4f34\u7d27\u5bc6\u5408\u4f5c\uff0c\u5c06\u5148\u8fdb\u7684\u84b8\u6c7d\u7cfb\u7edf\u96c6\u6210\u5230\u5404\u79cd\u5de5\u4e1a\u5e94\u7528\u4e2d\u3002\u901a\u8fc7\u6280\u672f\u534f\u540c\u548c\u8d44\u6e90\u5171\u4eab\uff0c\u6211\u4eec\u8054\u5408\u4e3a\u5ba2\u6237\u63d0\u4f9b\u9ad8\u6027\u80fd\u3001\u9ad8\u53ef\u9760\u6027\u7684\u89e3\u51b3\u65b9\u6848\u3002.<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_monsterinsights_skip_tracking":false,"footnotes":""},"class_list":["post-2410","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/curetecglobal.com\/zh\/wp-json\/wp\/v2\/pages\/2410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/curetecglobal.com\/zh\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/curetecglobal.com\/zh\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/curetecglobal.com\/zh\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/curetecglobal.com\/zh\/wp-json\/wp\/v2\/comments?post=2410"}],"version-history":[{"count":0,"href":"https:\/\/curetecglobal.com\/zh\/wp-json\/wp\/v2\/pages\/2410\/revisions"}],"wp:attachment":[{"href":"https:\/\/curetecglobal.com\/zh\/wp-json\/wp\/v2\/media?parent=2410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}