{"id":2647,"date":"2025-04-02T09:45:03","date_gmt":"2025-04-02T08:45:03","guid":{"rendered":"https:\/\/zabalimp.es\/?page_id=2647"},"modified":"2025-04-02T09:45:51","modified_gmt":"2025-04-02T08:45:51","slug":"limpieza-zonas-comunes","status":"publish","type":"page","link":"https:\/\/zabalimp.es\/eu\/limpieza-zonas-comunes\/","title":{"rendered":"Limpieza de zonas comunes"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"2647\" class=\"elementor elementor-2647\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-388a988 e-flex e-con-boxed e-con e-parent\" data-id=\"388a988\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-458269e e-con-full e-flex e-con e-child\" data-id=\"458269e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7d5c5e0b elementor-invisible elementor-widget elementor-widget-image\" data-id=\"7d5c5e0b\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInLeft&quot;}\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"800\" src=\"https:\/\/zabalimp.es\/wp-content\/uploads\/2025\/03\/Limpieza-de-zonas-comunes.png\" class=\"attachment-large size-large wp-image-1838\" alt=\"\" srcset=\"https:\/\/zabalimp.es\/wp-content\/uploads\/2025\/03\/Limpieza-de-zonas-comunes.png 1024w, https:\/\/zabalimp.es\/wp-content\/uploads\/2025\/03\/Limpieza-de-zonas-comunes-300x300.png 300w, https:\/\/zabalimp.es\/wp-content\/uploads\/2025\/03\/Limpieza-de-zonas-comunes-100x100.png 100w, https:\/\/zabalimp.es\/wp-content\/uploads\/2025\/03\/Limpieza-de-zonas-comunes-600x600.png 600w, https:\/\/zabalimp.es\/wp-content\/uploads\/2025\/03\/Limpieza-de-zonas-comunes-150x150.png 150w, https:\/\/zabalimp.es\/wp-content\/uploads\/2025\/03\/Limpieza-de-zonas-comunes-768x768.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\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-1962defc e-con-full e-flex e-con e-child\" data-id=\"1962defc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-36f3b8cb e-con-full e-flex e-con e-child\" data-id=\"36f3b8cb\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-107a62 elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"107a62\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;}\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<span class=\"elementor-heading-title elementor-size-default\">Las zonas comunes son el rostro compartido de una comunidad. Mantenerlas limpias y cuidadas no solo mejora la imagen del edificio, sino tambi\u00e9n la convivencia y el bienestar de quienes lo habitan.\n\nNuestro servicio de limpieza de zonas comunes est\u00e1 orientado a comunidades de vecinos, edificios residenciales y espacios compartidos. Nos encargamos de la limpieza de portales, escaleras, ascensores, pasillos, buzones, garajes y zonas de acceso, con personal fijo y horarios adaptados.\n\n\ud83c\udfe2 Intervenciones peri\u00f3dicas, \ud83e\uddfc mantenimiento preventivo, \ud83e\uddfd atenci\u00f3n a los detalles, \ud83e\udd1d comunicaci\u00f3n directa con la comunidad.\nOfrecemos un servicio continuo, eficaz y discreto, que se convierte en parte natural de la vida vecinal.\n\nPorque vivir en un entorno limpio tambi\u00e9n es vivir con respeto y armon\u00eda.<\/span>\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-55ac50a e-con-full e-flex e-con e-child\" data-id=\"55ac50a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-333b3058 elementor-widget elementor-widget-html\" data-id=\"333b3058\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\r\n  const subservicioId = 24;\r\n<\/script>\r\n\r\n<div id=\"form-field-dinamico\"><\/div>\r\n\r\n<div id=\"resumen-seleccionado\" style=\"min-height: 40px; margin-bottom: 60px;\"><\/div>\r\n<div id=\"pedir-fixed-wrapper\">\r\n  <div id=\"option_price\">\ud83d\udfe9 Total: 0.00 \u20ac<\/div>\r\n  <button id=\"btn-pedir\" class=\"elementor-button\">\ud83d\uded2 Pedir<\/button>\r\n<\/div>\r\n\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a31fc6c elementor-widget elementor-widget-html\" data-id=\"a31fc6c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\r\nlet selected = {};\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n  fetch(`\/wp-json\/miapi\/v1\/subservicio?id=${subservicioId}`)\r\n    .then(res => res.json())\r\n    .then(data => {\r\n      selected = {\r\n        servicio: { id: data.service_id, name: data.service_name },\r\n        subservicio: { id: data.id, name: data.name }\r\n      };\r\n      cargarParametros(data.id);\r\n    });\r\n\r\n  document.getElementById(\"btn-pedir\").addEventListener(\"click\", () => {\r\n    const resumen = document.getElementById(\"resumen-seleccionado\");\r\n    const precioField = document.getElementById(\"option_price\");\r\n\r\n    const descripcion = resumen.innerText;\r\n    const precioTexto = precioField.textContent.match(\/([\\d\\.]+) \u20ac$\/);\r\n    const precio = precioTexto ? parseFloat(precioTexto[1]) : 0;\r\n    const imagen = `https:\/\/zabalimp.es\/wp-content\/uploads\/2025\/03\/${normalizeFileName(selected.subservicio.name)}.png`;\r\n\r\n    const datosPedido = {\r\n      nombre: `${selected.servicio.name} \u2013 ${selected.subservicio.name}`,\r\n      descripcion: descripcion,\r\n      precio: precio,\r\n      imagen: imagen\r\n    };\r\n\r\n    fetch('\/wp-json\/miapi\/v1\/add-to-cart', {\r\n      method: 'POST',\r\n      headers: { 'Content-Type': 'application\/json' },\r\n      body: JSON.stringify(datosPedido)\r\n    })\r\n      .then(res => res.json())\r\n      .then(data => {\r\n        if (data.success) {\r\n          alert(\"\u2705 Producto a\u00f1adido al carrito\");\r\n          window.location.href = \"\/carrito\";\r\n        } else {\r\n          alert(\"\u274c No se pudo a\u00f1adir al carrito\");\r\n        }\r\n      })\r\n      .catch(err => {\r\n        console.error(\"Error:\", err);\r\n        alert(\"\u274c Error en el servidor\");\r\n      });\r\n  });\r\n});\r\n\r\nfunction normalizeFileName(name) {\r\n  const map = { '\u00e1':'a','\u00e9':'e','\u00ed':'i','\u00f3':'o','\u00fa':'u','\u00fc':'u','\u00f1':'n','\u00c1':'A','\u00c9':'E','\u00cd':'I','\u00d3':'O','\u00da':'U','\u00dc':'U','\u00d1':'N' };\r\n  return name.split('').map(c => map[c] || c).join('').replace(\/\\s+\/g, '-').replace(\/[^\\w\\-]\/g, '');\r\n}\r\n\r\n\r\nfunction cargarParametros(id) {\r\n  fetch(`\/wp-json\/miapi\/v1\/parametros?subservicio=${id}`)\r\n    .then(res => res.json())\r\n    .then(async parametros => {\r\n      const dinamico = document.getElementById(\"form-field-dinamico\");\r\n      dinamico.innerHTML = \"\";\r\n\r\n      for (const param of parametros) {\r\n        const priceData = await fetch(`\/wp-json\/miapi\/v1\/option-price?id=${param.id}`).then(r => r.json());\r\n        const base = parseFloat(priceData?.base_price || 0);\r\n        const pricePerUnit = parseFloat(priceData?.price_per_unit || 0);\r\n        const unit = priceData?.unit || \"servicio\";\r\n        const modifiers = priceData?.value_modifier || \"\";\r\n\r\n        const modArray = modifiers\r\n          .split(\";\")\r\n          .map(s => s.trim().split(\":\"))\r\n            .filter(([key, val]) =>\r\n                key && val !== undefined &&\r\n                !isNaN(parseFloat(val)) &&\r\n                !(key.toLowerCase() === \"no\" && parseFloat(val) === 0)\r\n              )\r\n          .filter(([key, val]) => key && val !== undefined && !isNaN(parseFloat(val)));\r\n\r\n        \/\/ \u0411\u043b\u043e\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\r\n        const group = document.createElement(\"div\");\r\n        group.className = \"parametro-group\";\r\n        group.style.display = \"flex\";\r\n        group.style.flexWrap = \"wrap\";\r\n        group.style.alignItems = \"center\";\r\n        group.style.marginBottom = \"10px\";\r\n        group.style.gap = \"8px\";\r\n\r\n        \/\/ \u0427\u0435\u043a\u0431\u043e\u043a\u0441 + \u0438\u043c\u044f\r\n        const baseCheckbox = document.createElement(\"input\");\r\n        baseCheckbox.type = \"checkbox\";\r\n        baseCheckbox.dataset.baseValue = base;\r\n        baseCheckbox.dataset.paramName = param.name;\r\n        baseCheckbox.addEventListener(\"change\", updatePrecio);\r\n\r\n        const nameSpan = document.createElement(\"span\");\r\n        nameSpan.textContent = ` ${param.name}`;\r\n        nameSpan.style.fontWeight = \"500\";\r\n\r\n        group.appendChild(baseCheckbox);\r\n        group.appendChild(nameSpan);\r\n\r\n        \/\/ \u041c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b\r\n        if (modArray.length > 0) {\r\n          const dash = document.createElement(\"span\");\r\n          dash.textContent = \"\u2014\";\r\n          group.appendChild(dash);\r\n\r\n          if (modArray.length > 2) {\r\n            const select = document.createElement(\"select\");\r\n            select.dataset.modType = \"select\";\r\n            select.dataset.paramId = param.id;\r\n            select.style.display = \"inline-block\";\r\n            select.style.maxWidth = \"200px\";\r\n            select.style.padding = \"4px\";\r\n            select.style.verticalAlign = \"middle\";\r\n                    select.addEventListener(\"change\", (e) => {\r\n          if (e.target.value) {\r\n            baseCheckbox.checked = true;\r\n          }\r\n          updatePrecio();\r\n        });\r\n\r\n\r\n            const optDefault = document.createElement(\"option\");\r\n            optDefault.value = \"\";\r\n            optDefault.textContent = \"-- Selecciona --\";\r\n            select.appendChild(optDefault);\r\n\r\n            modArray.forEach(([labelText, modValue]) => {\r\n              const opt = document.createElement(\"option\");\r\n              opt.value = modValue;\r\n              opt.text = `${labelText} (+${parseFloat(modValue).toFixed(2)} \u20ac)`;\r\n              select.appendChild(opt);\r\n            });\r\n\r\n            group.appendChild(select);\r\n          } else {\r\n            modArray.forEach(([labelText, modValue]) => {\r\n              const modLabel = document.createElement(\"label\");\r\n              modLabel.style.whiteSpace = \"nowrap\";\r\n\r\n              const modCheckbox = document.createElement(\"input\");\r\n              modCheckbox.type = \"checkbox\";\r\n              modCheckbox.dataset.modifierValue = parseFloat(modValue);\r\n              modCheckbox.dataset.paramId = param.id;\r\n              modCheckbox.addEventListener(\"change\", (e) => {\r\n                  baseCheckbox.checked = true;\r\n                  updatePrecio();\r\n                });\r\n\r\n\r\n              modLabel.appendChild(modCheckbox);\r\n              modLabel.append(` ${labelText} (+${parseFloat(modValue).toFixed(2)} \u20ac)`);\r\n              group.appendChild(modLabel);\r\n            });\r\n          }\r\n        }\r\n\r\n        \/\/ \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u0435\u043d \u0432\u0432\u043e\u0434 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430\r\n        if (!modifiers && pricePerUnit > 0) {\r\n          const dash = document.createElement(\"span\");\r\n          dash.textContent = \"\u2014\";\r\n          group.appendChild(dash);\r\n\r\n          const inputNum = document.createElement(\"input\");\r\n          inputNum.type = \"number\";\r\n          inputNum.min = \"0\";\r\n          inputNum.step = \"1\";\r\n          inputNum.placeholder = `Cantidad en ${unit}`;\r\n          inputNum.dataset.unit = unit;\r\n          inputNum.dataset.price = pricePerUnit;\r\n          inputNum.style.width = \"80px\";\r\n          inputNum.style.padding = \"4px\";\r\n          inputNum.style.verticalAlign = \"middle\";\r\ninputNum.addEventListener(\"input\", () => {\r\n  if (inputNum.value && parseFloat(inputNum.value) > 0) {\r\n    baseCheckbox.checked = true;\r\n  }\r\n  updatePrecio();\r\n});\r\ninputNum.addEventListener(\"change\", () => {\r\n  if (inputNum.value && parseFloat(inputNum.value) > 0) {\r\n    baseCheckbox.checked = true;\r\n  }\r\n  updatePrecio();\r\n});\r\n\r\n\r\n          group.appendChild(inputNum);\r\n        }\r\n\r\n        \/\/ \u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043f\u043e\u0434 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c\r\n        const info = [];\r\n        if (base > 0) info.push(`base: ${base.toFixed(2)} \u20ac`);\r\n        if (pricePerUnit > 0) info.push(`precio por ${unit}: ${pricePerUnit.toFixed(2)} \u20ac`);\r\n\r\n        if (info.length > 0) {\r\n          const hint = document.createElement(\"div\");\r\n          hint.style.fontSize = \"0.85em\";\r\n          hint.style.color = \"#888\";\r\n          hint.style.marginLeft = \"24px\";\r\n          hint.style.width = \"100%\";\r\n          hint.textContent = `(${info.join(\" | \")})`;\r\n          group.appendChild(hint);\r\n        }\r\n\r\n        dinamico.appendChild(group);\r\n      }\r\n\r\n      updatePrecio();\r\n    });\r\n}\r\n\r\nfunction updatePrecio() {\r\n  const resumen = document.getElementById(\"resumen-seleccionado\");\r\n  const precioField = document.getElementById(\"option_price\");\r\n\r\n  let total = 0;\r\n  let partes = [];\r\n  let detalles = [];\r\n\r\n  document.querySelectorAll(\"#form-field-dinamico .parametro-group\").forEach(group => {\r\n    const baseCheckbox = group.querySelector(\"input[type='checkbox'][data-base-value]\");\r\n    if (!baseCheckbox || !baseCheckbox.checked) return;\r\n\r\n    const nombre = baseCheckbox.dataset.paramName || \"Par\u00e1metro\";\r\n    const base = parseFloat(baseCheckbox.dataset.baseValue || 0);\r\n\r\n    if (base > 0) {\r\n      total += base;\r\n      partes.push(base.toFixed(2));\r\n      detalles.push(`${nombre}: base ${base.toFixed(2)} \u20ac`);\r\n    }\r\n\r\n    \/\/ \u041c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b: select\r\n    const select = group.querySelector(\"select[data-mod-type='select']\");\r\n    if (select && select.value) {\r\n      const mod = parseFloat(select.value);\r\n      total += mod;\r\n      partes.push(mod.toFixed(2));\r\n      detalles.push(`${nombre}: extra +${mod.toFixed(2)} \u20ac`);\r\n    }\r\n\r\n    \/\/ \u041c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b: \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u044b\r\n    const modCheckboxes = group.querySelectorAll(\"input[type='checkbox'][data-modifier-value]\");\r\n    modCheckboxes.forEach(cb => {\r\n      if (cb.checked) {\r\n        const mod = parseFloat(cb.dataset.modifierValue || 0);\r\n        total += mod;\r\n        partes.push(mod.toFixed(2));\r\n        detalles.push(`${nombre}: extra +${mod.toFixed(2)} \u20ac`);\r\n      }\r\n    });\r\n\r\n    \/\/ \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u00d7 \u0446\u0435\u043d\u0430\r\n    const numInput = group.querySelector(\"input[type='number']\");\r\n    if (numInput && parseFloat(numInput.value) > 0) {\r\n      const cantidad = parseFloat(numInput.value || 0);\r\n      const precioUnitario = parseFloat(numInput.dataset.price || 0);\r\n      const subtotal = cantidad * precioUnitario;\r\n      total += subtotal;\r\n      partes.push(subtotal.toFixed(2));\r\n      detalles.push(`${nombre}: ${cantidad} \u00d7 ${precioUnitario.toFixed(2)} \u20ac = ${subtotal.toFixed(2)} \u20ac`);\r\n    }\r\n  });\r\n\r\nconst soloTotal = total.toFixed(2) + \" \u20ac\";\r\nconst desglose = partes.length > 1 ? partes.join(\" + \") + \" = \" + soloTotal : soloTotal;\r\n\r\nresumen.innerHTML = `<div class=\"total\">\ud83d\udfe9 Total: ${desglose}<\/div>`;\r\n\r\n\/\/ \u0412 \"\u043b\u0435\u0442\u0430\u044e\u0449\u0435\u0439\" \u043a\u043d\u043e\u043f\u043a\u0435 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0442\u043e\u0433\r\nif (document.getElementById(\"option_price\")) {\r\n  document.getElementById(\"option_price\").textContent = `\ud83d\udfe9 Total: ${soloTotal}`;\r\n\r\n}\r\n}\r\n\r\n<\/script>\r\n<style>\r\n#form-field-dinamico {\r\n  position: relative;\r\n  padding: 20px;\r\n  background: rgba(255, 255, 255, 0.85);\r\n  border-radius: 10px;\r\n  box-shadow: 0 0 10px rgba(0,0,0,0.05);\r\n}\r\n\r\n\r\n#pedir-fixed-wrapper {\r\n  position: absolute;\r\n  bottom: 10px;\r\n  right: 10px;\r\n  z-index: 10;\r\n  background: #fff;\r\n  padding: 12px 16px;\r\n  border: 1px solid #ddd;\r\n  border-radius: 10px;\r\n  box-shadow: 0 4px 12px rgba(0,0,0,0.1);\r\n  display: flex;\r\n  align-items: center;\r\n  gap: 12px;\r\n}\r\n\r\n#option_price {\r\n  font-weight: bold;\r\n  font-size: 1em;\r\n  color: #3c763d;\r\n}\r\n\r\n.parametro-group {\r\n  margin-bottom: 8px;\r\n  display: flex;\r\n  align-items: center;\r\n  flex-wrap: wrap;\r\n}\r\n\r\n.parametro-group label {\r\n  margin-right: 8px;\r\n}\r\n\r\n.mod-container select,\r\n.mod-container input[type=\"number\"] {\r\n  display: inline-block;\r\n  max-width: 200px;\r\n  margin-left: 6px;\r\n  margin-right: 8px;\r\n  vertical-align: middle;\r\n  height: auto;\r\n  line-height: 1.2;\r\n  padding: 4px 6px;\r\n  font-size: 0.95em;\r\n}\r\n.parametro-group {\r\n  display: flex;\r\n  align-items: flex-start;\r\n  flex-wrap: wrap;\r\n  gap: 6px;\r\n  margin-bottom: 8px;\r\n}\r\n\r\n.parametro-group label {\r\n  margin-right: 8px;\r\n  vertical-align: middle;\r\n}\r\n\r\n.mi-header-icons {\r\n  display: flex;\r\n  gap: 20px;\r\n  align-items: center;\r\n  justify-content: center;\r\n  font-size: 18px;\r\n  background-color: #E9CC3A;\r\n  border-radius: 4px;\r\n  padding:6px 14px;\r\n  box-shadow: 0 4px 14px rgba(0, 0, 0, 0.5);\r\n}\r\n<\/style>\r\n\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\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Las zonas comunes son el rostro compartido de una comunidad. Mantenerlas limpias y cuidadas no solo mejora la imagen del edificio, sino tambi\u00e9n la convivencia y el bienestar de quienes lo habitan. Nuestro servicio de limpieza de zonas comunes est\u00e1 orientado a comunidades de vecinos, edificios residenciales y espacios compartidos. Nos encargamos de la limpieza [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_joinchat":[],"footnotes":""},"class_list":["post-2647","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/zabalimp.es\/eu\/wp-json\/wp\/v2\/pages\/2647","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zabalimp.es\/eu\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/zabalimp.es\/eu\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/zabalimp.es\/eu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zabalimp.es\/eu\/wp-json\/wp\/v2\/comments?post=2647"}],"version-history":[{"count":0,"href":"https:\/\/zabalimp.es\/eu\/wp-json\/wp\/v2\/pages\/2647\/revisions"}],"wp:attachment":[{"href":"https:\/\/zabalimp.es\/eu\/wp-json\/wp\/v2\/media?parent=2647"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}