{"id":71480,"date":"2025-08-27T17:48:44","date_gmt":"2025-08-27T16:48:44","guid":{"rendered":"https:\/\/colorhair.ru\/?page_id=71480"},"modified":"2025-08-27T19:08:23","modified_gmt":"2025-08-27T18:08:23","slug":"plug","status":"publish","type":"page","link":"https:\/\/colorhair.ru\/index.php\/plug\/","title":{"rendered":"plug"},"content":{"rendered":"<p>[et_pb_section fb_built=&#187;1&#8243; _builder_version=&#187;4.27.4&#8243; _module_preset=&#187;default&#187; global_colors_info=&#187;{}&#187;][\/et_pb_section][et_pb_section fb_built=&#187;1&#8243; fullwidth=&#187;on&#187; _builder_version=&#187;4.27.4&#8243; _module_preset=&#187;default&#187; global_colors_info=&#187;{}&#187;][et_pb_fullwidth_code _builder_version=&#187;4.27.4&#8243; _module_preset=&#187;default&#187; hover_enabled=&#187;0&#8243; global_colors_info=&#187;{}&#187; sticky_enabled=&#187;0&#8243;]<!-- KHP \u00b7 Hairy Neon \u00b7 Ultra-mobile \u00b7 True Blacks \u00b7 Divi-safe --><!-- [et_pb_line_break_holder] --><\/p>\n<div class=\"khp-fullscreen\"><!-- [et_pb_line_break_holder] -->  <canvas id=\"khpHairGL\"><\/canvas><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  <!-- \u0422\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0438 (\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0438 \u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439) --><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"khp-overlay\"><!-- [et_pb_line_break_holder] -->    <\/p>\n<h1>\u041c\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u044b<\/h1>\n<p><!-- [et_pb_line_break_holder] -->    <pee class=\"khp-sub\">\u041a\u0430\u043a \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u043d\u0438\u0435: \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u043e\u0442\u0442\u0435\u043d\u043a\u043e\u0432, \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u044f\u0434\u0438 \u0438 \u044f\u0440\u043a\u0438\u0439 \u0431\u043b\u0435\u0441\u043a.<\/pee><!-- [et_pb_line_break_holder] -->    <pee class=\"khp-note\">\u0421\u043a\u043e\u0440\u043e \u043e\u0442\u043a\u0440\u043e\u0435\u043c\u0441\u044f \u2014 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e \u00ab\u0442\u043e\u043d\u0438\u0440\u0443\u0435\u043c\u00bb \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u0434 \u0432\u0430\u0448 \u0431\u0435\u0437\u0443\u043f\u0440\u0435\u0447\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \ud83d\udc87\u200d\u2640\ufe0f\u2728<\/pee><!-- [et_pb_line_break_holder] -->  <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  <!-- CSS-\u0444\u043e\u043b\u0431\u044d\u043a (\u0435\u0441\u043b\u0438 WebGL \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f) --><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"khp-fallback\" aria-hidden=\"true\"><\/div>\n<p><!-- [et_pb_line_break_holder] --><\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><\/p>\n<style><!-- [et_pb_line_break_holder] -->\/* \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u043e\u0432\u0435\u0440\u0445 \u0432\u0441\u0435\u0433\u043e *\/<!-- [et_pb_line_break_holder] -->.khp-fullscreen{<!-- [et_pb_line_break_holder] -->  position:fixed; inset:0; z-index:999999; background:#000; overflow:hidden;<!-- [et_pb_line_break_holder] -->  display:flex; align-items:center; justify-content:center;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* Canvas \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0435\u0439 *\/<!-- [et_pb_line_break_holder] -->#khpHairGL{<!-- [et_pb_line_break_holder] -->  position:absolute; inset:0; width:100%; height:100%; display:block;<!-- [et_pb_line_break_holder] -->  touch-action:none; \/* \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u0435 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0441\u043a\u0440\u043e\u043b\u043b-\u0436\u0435\u0441\u0442\u043e\u0432 *\/<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u041e\u0432\u0435\u0440\u043b\u0435\u0439 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c *\/<!-- [et_pb_line_break_holder] -->.khp-overlay{<!-- [et_pb_line_break_holder] -->  position:relative; z-index:2; text-align:center; color:#fff; pointer-events:none;<!-- [et_pb_line_break_holder] -->  max-width:min(92vw, 920px); padding: 2rem 1.5rem;<!-- [et_pb_line_break_holder] -->  font-family: ui-sans-serif,-apple-system,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Noto Sans\",sans-serif;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.khp-overlay h1{<!-- [et_pb_line_break_holder] -->  margin:0 0 .35rem; line-height:1.08; letter-spacing:.3px;<!-- [et_pb_line_break_holder] -->  font-size: clamp(28px, 5vw, 60px);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.khp-overlay .khp-sub{<!-- [et_pb_line_break_holder] -->  margin:.1rem 0 .6rem; opacity:.95; font-size: clamp(16px, 2.6vw, 22px);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.khp-overlay .khp-note{<!-- [et_pb_line_break_holder] -->  margin:0; opacity:.85; font-size: clamp(14px, 2.3vw, 18px);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* CSS-\u0444\u043e\u043b\u0431\u044d\u043a (\u0435\u0441\u043b\u0438 WebGL \u043d\u0435\u0442) \u2014 \u043b\u0451\u0433\u043a\u0438\u0435 \u043d\u0435\u043e\u043d-\u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u044b, \u043e\u0447\u0435\u043d\u044c \u0434\u0451\u0448\u0435\u0432\u043e *\/<!-- [et_pb_line_break_holder] -->.khp-fallback{<!-- [et_pb_line_break_holder] -->  position:absolute; inset:0; z-index:1; display:none; \/* \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u043a\u0440\u044b\u0442 \u2014 \u0435\u0441\u043b\u0438 WebGL \u0435\u0441\u0442\u044c *\/<!-- [et_pb_line_break_holder] -->  background:<!-- [et_pb_line_break_holder] -->    radial-gradient(1200px 800px at 20% 30%, rgba(255,0,128,.65), transparent 60%),<!-- [et_pb_line_break_holder] -->    radial-gradient(900px 700px  at 80% 40%, rgba(0,200,255,.55), transparent 60%),<!-- [et_pb_line_break_holder] -->    radial-gradient(1000px 900px at 45% 75%, rgba(255,210,0,.55), transparent 60%),<!-- [et_pb_line_break_holder] -->    radial-gradient(900px 900px  at 80% 85%, rgba(255,90,0,.55), transparent 60%),<!-- [et_pb_line_break_holder] -->    #000;<!-- [et_pb_line_break_holder] -->  filter: blur(22px) saturate(120%);<!-- [et_pb_line_break_holder] -->  animation: khpFbMove 14s ease-in-out infinite alternate;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->@keyframes khpFbMove{<!-- [et_pb_line_break_holder] -->  0%   { transform: scale(1) translate(0,0); }<!-- [et_pb_line_break_holder] -->  50%  { transform: scale(1.1) translate(-2%, -2%); }<!-- [et_pb_line_break_holder] -->  100% { transform: scale(1) translate(2%, 2%); }<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* \u0443\u0432\u0430\u0436\u0435\u043d\u0438\u0435 \u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e *\/<!-- [et_pb_line_break_holder] -->@media (prefers-reduced-motion: reduce){<!-- [et_pb_line_break_holder] -->  .khp-overlay{ backdrop-filter:none; }<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><\/style>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><script><!-- [et_pb_line_break_holder] -->\/*<!-- [et_pb_line_break_holder] --> * Hairy Neon \u2014 ULTRA-MOBILE<!-- [et_pb_line_break_holder] --> * \u2014 WebGL \u0441 \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u043e\u0434 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u044b.<!-- [et_pb_line_break_holder] --> * \u2014 \u0410\u0432\u0442\u043e-\u0442\u044e\u043d\u0438\u043d\u0433: \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0435 \u0448\u0430\u0433\u0438, \u0434\u0430\u0443\u043d\u0441\u043a\u0435\u0439\u043b \u0440\u0435\u043d\u0434\u0435\u0440\u0430, \u043b\u0438\u043c\u0438\u0442 FPS.<!-- [et_pb_line_break_holder] --> * \u2014 \u00ab\u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0447\u0451\u0440\u043d\u044b\u0435\u00bb \u0437\u043e\u043d\u044b + \u044f\u0440\u043a\u0438\u0435 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u044b, \u0431\u0435\u0437 \u043b\u0430\u0433\u043e\u0432.<!-- [et_pb_line_break_holder] --> * \u2014 \u0415\u0441\u043b\u0438 WebGL \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u2014 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c CSS-\u0444\u043e\u043b\u0431\u044d\u043a (\u0441\u043c. .khp-fallback).<!-- [et_pb_line_break_holder] --> *\/<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->(function(){<!-- [et_pb_line_break_holder] -->  const container = document.querySelector('.khp-fullscreen');<!-- [et_pb_line_break_holder] -->  const canvas = document.getElementById('khpHairGL');<!-- [et_pb_line_break_holder] -->  const fb = document.querySelector('.khp-fallback');<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ \u0418\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u043c WebGL c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0435\u043c<!-- [et_pb_line_break_holder] -->  const gl = canvas.getContext('webgl', {<!-- [et_pb_line_break_holder] -->    alpha:false, antialias:false, depth:false, stencil:false,<!-- [et_pb_line_break_holder] -->    premultipliedAlpha:false, preserveDrawingBuffer:false,<!-- [et_pb_line_break_holder] -->    powerPreference:'high-performance', desynchronized:true<!-- [et_pb_line_break_holder] -->  });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ \u0415\u0441\u043b\u0438 WebGL \u043d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u2014 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c CSS-\u0444\u043e\u043d \u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u043c<!-- [et_pb_line_break_holder] -->  if(!gl){<!-- [et_pb_line_break_holder] -->    if(fb) fb.style.display = 'block';<!-- [et_pb_line_break_holder] -->    console.warn('WebGL unavailable \u2014 CSS fallback enabled.');<!-- [et_pb_line_break_holder] -->    return;<!-- [et_pb_line_break_holder] -->  } else {<!-- [et_pb_line_break_holder] -->    if(fb) fb.style.display = 'none';<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ ---------- Environment \/ Quality ----------<!-- [et_pb_line_break_holder] -->  const ua = navigator.userAgent;<!-- [et_pb_line_break_holder] -->  const isMobile = \/Android|iPhone|iPad|iPod|Mobile|iOS\/i.test(ua) || Math.max(window.innerWidth, window.innerHeight) < 900;<!-- [et_pb_line_break_holder] -->  const devMem = (navigator.deviceMemory || 4); \/\/ 1,2,4,8 ...<!-- [et_pb_line_break_holder] -->  const isLowEnd = isMobile && devMem <= 3;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ \u0416\u0451\u0441\u0442\u043a\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c DPR \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u043a\u0430\u0445<!-- [et_pb_line_break_holder] -->  let DPR_CAP = isLowEnd ? 1.0 : 1.1;       \/\/ \u0447\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u2014 \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435<!-- [et_pb_line_break_holder] -->  let RES_SCALE = isLowEnd ? 0.68 : 0.78;   \/\/ \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0434\u0430\u0443\u043d\u0441\u043a\u0435\u0439\u043b \u0440\u0435\u043d\u0434\u0435\u0440\u0430<!-- [et_pb_line_break_holder] -->  let STEPS_TARGET = isLowEnd ? 40 : 50;    \/\/ \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0448\u0430\u0433\u043e\u0432 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u0435\u043b\u044c \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043a\u0430\u0434\u0440\u043e\u0432 (\u043c\u0435\u043d\u044c\u0448\u0435 \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u0435 \u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438)<!-- [et_pb_line_break_holder] -->  const TARGET_FPS = isMobile ? 48 : 60;<!-- [et_pb_line_break_holder] -->  const FRAME_INTERVAL = 1000 \/ TARGET_FPS;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ \u0410\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (\u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435)<!-- [et_pb_line_break_holder] -->  let adaptiveSteps = STEPS_TARGET;<!-- [et_pb_line_break_holder] -->  let adaptiveScale = RES_SCALE;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ ---------- Resize \/ DPR ----------<!-- [et_pb_line_break_holder] -->  let DPR = 1, W = 0, H = 0;<!-- [et_pb_line_break_holder] -->  function resize(){<!-- [et_pb_line_break_holder] -->    DPR = Math.min(window.devicePixelRatio || 1, DPR_CAP);<!-- [et_pb_line_break_holder] -->    const cssW = canvas.clientWidth || window.innerWidth;<!-- [et_pb_line_break_holder] -->    const cssH = canvas.clientHeight || window.innerHeight;<!-- [et_pb_line_break_holder] -->    W = Math.max(1, Math.floor(cssW * DPR * adaptiveScale));<!-- [et_pb_line_break_holder] -->    H = Math.max(1, Math.floor(cssH * DPR * adaptiveScale));<!-- [et_pb_line_break_holder] -->    canvas.width = W; canvas.height = H;<!-- [et_pb_line_break_holder] -->    gl.viewport(0,0,W,H);<!-- [et_pb_line_break_holder] -->    gl.uniform2f(u_res, W, H);<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  window.addEventListener('resize', ()=>{ resize(); }, { passive:true });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ ---------- Shaders ----------<!-- [et_pb_line_break_holder] -->  const precision = isMobile ? 'mediump' : 'highp'; \/\/ \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u043f\u044b \u043b\u044e\u0431\u044f\u0442 mediump<!-- [et_pb_line_break_holder] -->  const vs = `<!-- [et_pb_line_break_holder] -->  attribute vec2 a_pos;<!-- [et_pb_line_break_holder] -->  void main(){ gl_Position = vec4(a_pos, 0.0, 1.0); }<!-- [et_pb_line_break_holder] -->  `;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  const fs = `<!-- [et_pb_line_break_holder] -->  precision ${precision} float;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  uniform vec2  u_res;<!-- [et_pb_line_break_holder] -->  uniform float u_time;<!-- [et_pb_line_break_holder] -->  uniform float u_steps;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  uniform float u_flowFreq;<!-- [et_pb_line_break_holder] -->  uniform float u_flowSpeed;<!-- [et_pb_line_break_holder] -->  uniform float u_stepLen;<!-- [et_pb_line_break_holder] -->  uniform float u_sharp;<!-- [et_pb_line_break_holder] -->  uniform float u_exposure;<!-- [et_pb_line_break_holder] -->  uniform float u_glow;<!-- [et_pb_line_break_holder] -->  uniform float u_gamma;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  uniform float u_blackStrength;<!-- [et_pb_line_break_holder] -->  uniform float u_blackThreshold;<!-- [et_pb_line_break_holder] -->  uniform float u_blackScale;<!-- [et_pb_line_break_holder] -->  uniform float u_blackStripe;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  float hash(vec2 p){ return fract(sin(dot(p, vec2(127.1,311.7))) * 43758.5453123); }<!-- [et_pb_line_break_holder] -->  float noise(vec2 p){<!-- [et_pb_line_break_holder] -->    vec2 i=floor(p), f=fract(p);<!-- [et_pb_line_break_holder] -->    float a=hash(i);<!-- [et_pb_line_break_holder] -->    float b=hash(i+vec2(1.0,0.0));<!-- [et_pb_line_break_holder] -->    float c=hash(i+vec2(0.0,1.0));<!-- [et_pb_line_break_holder] -->    float d=hash(i+vec2(1.0,1.0));<!-- [et_pb_line_break_holder] -->    vec2 u=f*f*(3.0-2.0*f);<!-- [et_pb_line_break_holder] -->    return mix(a,b,u.x) + (c-a)*u.y*(1.0-u.x) + (d-b)*u.x*u.y;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  float fbm(vec2 p){<!-- [et_pb_line_break_holder] -->    \/\/ \u0423\u043a\u043e\u0440\u043e\u0447\u0435\u043d\u043d\u044b\u0439 FBM: 3 \u043e\u043a\u0442\u0430\u0432\u044b (\u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u043f\u043b\u0430\u0432\u043d\u043e)<!-- [et_pb_line_break_holder] -->    float v=0.0, a=0.5;<!-- [et_pb_line_break_holder] -->    v += a*noise(p);      p*=2.0; a*=0.5;<!-- [et_pb_line_break_holder] -->    v += a*noise(p);      p*=2.0; a*=0.5;<!-- [et_pb_line_break_holder] -->    v += a*noise(p);<!-- [et_pb_line_break_holder] -->    return v;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  vec2 flow(vec2 p, float t){<!-- [et_pb_line_break_holder] -->    float n1 = fbm(p * u_flowFreq + vec2(0.0, t*u_flowSpeed));<!-- [et_pb_line_break_holder] -->    float n2 = fbm(p * (u_flowFreq*0.8) + vec2(t*u_flowSpeed, 0.0));<!-- [et_pb_line_break_holder] -->    float ang = 6.28318 * (0.6*n1 + 0.4*n2);<!-- [et_pb_line_break_holder] -->    vec2 d = vec2(cos(ang), sin(ang));<!-- [et_pb_line_break_holder] -->    float aniso = smoothstep(0.15, 0.95, n1);<!-- [et_pb_line_break_holder] -->    d = normalize(mix(d, vec2(d.x*1.7, d.y*0.55), aniso));<!-- [et_pb_line_break_holder] -->    return d;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  vec3 rainbow(float t){<!-- [et_pb_line_break_holder] -->    return 0.78 + 0.78*cos(6.28318*(vec3(0.0,0.33,0.67) + t));<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  float stripe(float x){ return smoothstep(0.4, 0.6, 0.5 + 0.5*sin(x)); }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  void main(){<!-- [et_pb_line_break_holder] -->    vec2 uv = gl_FragCoord.xy \/ u_res;<!-- [et_pb_line_break_holder] -->    vec2 p = (uv*2.0 - 1.0);<!-- [et_pb_line_break_holder] -->    p.x *= u_res.x \/ u_res.y;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ \u043b\u0451\u0433\u043a\u0430\u044f \u0437\u0430\u0432\u0438\u0432\u043a\u0430 \u043a \u0446\u0435\u043d\u0442\u0440\u0443<!-- [et_pb_line_break_holder] -->    float r = length(p);<!-- [et_pb_line_break_holder] -->    float tw = 0.22 * smoothstep(1.2, 0.0, r);<!-- [et_pb_line_break_holder] -->    float s = sin(tw), c = cos(tw);<!-- [et_pb_line_break_holder] -->    p = mat2(c, -s, s, c) * p;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ \u0447\u0451\u0440\u043d\u044b\u0435 \u043a\u0430\u0440\u043c\u0430\u043d\u044b \u0441\u0446\u0435\u043d\u044b \u2014 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043e\u0434\u0438\u043d \u0440\u0430\u0437<!-- [et_pb_line_break_holder] -->    float darkField = fbm(p * u_blackScale + vec2(0.0, u_time*0.30));<!-- [et_pb_line_break_holder] -->    float hardDark = 1.0 - smoothstep(u_blackThreshold, u_blackThreshold + 0.08, darkField);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    vec3 acc = vec3(0.0);<!-- [et_pb_line_break_holder] -->    float wsum = 0.0;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    vec2 qF = p;<!-- [et_pb_line_break_holder] -->    vec2 qB = p;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ \u0432\u0435\u0440\u0445\u043d\u044f\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 64, \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u043f\u043e u_steps<!-- [et_pb_line_break_holder] -->    for (int i=0; i<64; i++){<!-- [et_pb_line_break_holder] -->      if (float(i) >= u_steps) break;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      float fi = float(i);<!-- [et_pb_line_break_holder] -->      vec2 dF = flow(qF, u_time);<!-- [et_pb_line_break_holder] -->      vec2 dB = flow(qB, u_time);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      qF += dF * u_stepLen;<!-- [et_pb_line_break_holder] -->      qB -= dB * u_stepLen;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      float wF = exp(-length(qF - p) * u_sharp);<!-- [et_pb_line_break_holder] -->      float wB = exp(-length(qB - p) * u_sharp);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      float nF = fbm(qF*1.1 + vec2(0.0, u_time*0.08));<!-- [et_pb_line_break_holder] -->      float nB = fbm(qB*1.1 + vec2(0.0, u_time*0.08));<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      vec3 cF = rainbow(nF + u_time*0.10);<!-- [et_pb_line_break_holder] -->      vec3 cB = rainbow(nB + u_time*0.10);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      float sF = stripe(nF*15.0 + fi*u_blackStripe + u_time*3.0);<!-- [et_pb_line_break_holder] -->      float sB = stripe(nB*15.0 + fi*u_blackStripe + u_time*3.0);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      float localDarkF = clamp(u_blackStrength * max(hardDark, sF), 0.0, 1.0);<!-- [et_pb_line_break_holder] -->      float localDarkB = clamp(u_blackStrength * max(hardDark, sB), 0.0, 1.0);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      cF *= (1.0 - localDarkF);<!-- [et_pb_line_break_holder] -->      cB *= (1.0 - localDarkB);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      float pulse = 0.92 + 0.08*sin(u_time*2.2 + fi*0.07);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      acc += cF * wF * pulse;<!-- [et_pb_line_break_holder] -->      acc += cB * wB * pulse;<!-- [et_pb_line_break_holder] -->      wsum += (wF + wB) * pulse;<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    vec3 col = acc \/ max(wsum, 1e-4);<!-- [et_pb_line_break_holder] -->    col *= u_glow;<!-- [et_pb_line_break_holder] -->    col = vec3(1.0) - exp(-col * u_exposure);<!-- [et_pb_line_break_holder] -->    col = pow(col, vec3(1.0 \/ u_gamma));<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    gl_FragColor = vec4(col, 1.0);<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  `;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f\/\u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0430<!-- [et_pb_line_break_holder] -->  function compile(type, src){<!-- [et_pb_line_break_holder] -->    const s = gl.createShader(type); gl.shaderSource(s, src); gl.compileShader(s);<!-- [et_pb_line_break_holder] -->    if(!gl.getShaderParameter(s, gl.COMPLETE_STATUS) && !gl.getShaderParameter(s, gl.COMPILE_STATUS)){<!-- [et_pb_line_break_holder] -->      console.error(gl.getShaderInfoLog(s));<!-- [et_pb_line_break_holder] -->      throw new Error('Shader compile failed');<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] -->    return s;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  const prog = gl.createProgram();<!-- [et_pb_line_break_holder] -->  gl.attachShader(prog, compile(gl.VERTEX_SHADER, vs));<!-- [et_pb_line_break_holder] -->  gl.attachShader(prog, compile(gl.FRAGMENT_SHADER, fs));<!-- [et_pb_line_break_holder] -->  gl.linkProgram(prog);<!-- [et_pb_line_break_holder] -->  if(!gl.getProgramParameter(prog, gl.LINK_STATUS)){<!-- [et_pb_line_break_holder] -->    console.error(gl.getProgramInfoLog(prog));<!-- [et_pb_line_break_holder] -->    throw new Error('Program link failed');<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  gl.useProgram(prog);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ \u0424\u0443\u043b\u043b\u0441\u043a\u0440\u0438\u043d-\u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a<!-- [et_pb_line_break_holder] -->  const quad = gl.createBuffer();<!-- [et_pb_line_break_holder] -->  gl.bindBuffer(gl.ARRAY_BUFFER, quad);<!-- [et_pb_line_break_holder] -->  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ -1,-1, 3,-1, -1,3 ]), gl.STATIC_DRAW);<!-- [et_pb_line_break_holder] -->  const aPos = gl.getAttribLocation(prog, 'a_pos');<!-- [et_pb_line_break_holder] -->  gl.enableVertexAttribArray(aPos);<!-- [et_pb_line_break_holder] -->  gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 0, 0);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ Uniforms<!-- [et_pb_line_break_holder] -->  const u_res            = gl.getUniformLocation(prog, 'u_res');<!-- [et_pb_line_break_holder] -->  const u_time           = gl.getUniformLocation(prog, 'u_time');<!-- [et_pb_line_break_holder] -->  const u_steps          = gl.getUniformLocation(prog, 'u_steps');<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  const u_flowFreq       = gl.getUniformLocation(prog, 'u_flowFreq');<!-- [et_pb_line_break_holder] -->  const u_flowSpeed      = gl.getUniformLocation(prog, 'u_flowSpeed');<!-- [et_pb_line_break_holder] -->  const u_stepLen        = gl.getUniformLocation(prog, 'u_stepLen');<!-- [et_pb_line_break_holder] -->  const u_sharp          = gl.getUniformLocation(prog, 'u_sharp');<!-- [et_pb_line_break_holder] -->  const u_exposure       = gl.getUniformLocation(prog, 'u_exposure');<!-- [et_pb_line_break_holder] -->  const u_glow           = gl.getUniformLocation(prog, 'u_glow');<!-- [et_pb_line_break_holder] -->  const u_gamma          = gl.getUniformLocation(prog, 'u_gamma');<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  const u_blackStrength  = gl.getUniformLocation(prog, 'u_blackStrength');<!-- [et_pb_line_break_holder] -->  const u_blackThreshold = gl.getUniformLocation(prog, 'u_blackThreshold');<!-- [et_pb_line_break_holder] -->  const u_blackScale     = gl.getUniformLocation(prog, 'u_blackScale');<!-- [et_pb_line_break_holder] -->  const u_blackStripe    = gl.getUniformLocation(prog, 'u_blackStripe');<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (\u043f\u043e\u0434 \u043c\u043e\u0431\u0438\u043b\u043a\u0438 \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043e)<!-- [et_pb_line_break_holder] -->  const base = {<!-- [et_pb_line_break_holder] -->    flowFreq:     isLowEnd ? 1.5  : 1.6,<!-- [et_pb_line_break_holder] -->    flowSpeed:    isLowEnd ? 0.50 : 0.56, \/\/ \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u043e, \u043d\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e<!-- [et_pb_line_break_holder] -->    stepLen:      isLowEnd ? 0.015: 0.013,<!-- [et_pb_line_break_holder] -->    sharp:        isLowEnd ? 6.8  : 7.2,<!-- [et_pb_line_break_holder] -->    exposure:     1.85,<!-- [et_pb_line_break_holder] -->    glow:         1.75,<!-- [et_pb_line_break_holder] -->    gamma:        1.12,<!-- [et_pb_line_break_holder] -->    blackStrength: 1.0,     \/\/ \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0451\u0440\u043d\u044b\u0435<!-- [et_pb_line_break_holder] -->    blackThreshold: 0.40,    \/\/ \u2193 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0451\u0440\u043d\u044b\u0445 \u0437\u043e\u043d; \u2191 \u043c\u0435\u043d\u044c\u0448\u0435<!-- [et_pb_line_break_holder] -->    blackScale:     0.9,<!-- [et_pb_line_break_holder] -->    blackStripe:    0.46<!-- [et_pb_line_break_holder] -->  };<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  function applyUniforms(){<!-- [et_pb_line_break_holder] -->    gl.uniform2f(u_res, W, H);<!-- [et_pb_line_break_holder] -->    gl.uniform1f(u_flowFreq,    base.flowFreq);<!-- [et_pb_line_break_holder] -->    gl.uniform1f(u_flowSpeed,   base.flowSpeed);<!-- [et_pb_line_break_holder] -->    gl.uniform1f(u_stepLen,     base.stepLen);<!-- [et_pb_line_break_holder] -->    gl.uniform1f(u_sharp,       base.sharp);<!-- [et_pb_line_break_holder] -->    gl.uniform1f(u_exposure,    base.exposure);<!-- [et_pb_line_break_holder] -->    gl.uniform1f(u_glow,        base.glow);<!-- [et_pb_line_break_holder] -->    gl.uniform1f(u_gamma,       base.gamma);<!-- [et_pb_line_break_holder] -->    gl.uniform1f(u_blackStrength, base.blackStrength);<!-- [et_pb_line_break_holder] -->    gl.uniform1f(u_blackThreshold,base.blackThreshold);<!-- [et_pb_line_break_holder] -->    gl.uniform1f(u_blackScale,    base.blackScale);<!-- [et_pb_line_break_holder] -->    gl.uniform1f(u_blackStripe,   base.blackStripe);<!-- [et_pb_line_break_holder] -->    gl.uniform1f(u_steps, adaptiveSteps);<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  resize();<!-- [et_pb_line_break_holder] -->  applyUniforms();<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ \u0420\u0435\u043d\u0434\u0435\u0440-\u0446\u0438\u043a\u043b \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u0435\u043b\u0435\u043c FPS \u0438 \u0430\u0432\u0442\u043e-\u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0435\u0439 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430<!-- [et_pb_line_break_holder] -->  let start = performance.now();<!-- [et_pb_line_break_holder] -->  let lastFrame = start;<!-- [et_pb_line_break_holder] -->  let playing = true;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  function draw(now){<!-- [et_pb_line_break_holder] -->    if(!playing) return;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ \u041b\u0438\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u043c FPS (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f iOS Safari)<!-- [et_pb_line_break_holder] -->    const dt = now - lastFrame;<!-- [et_pb_line_break_holder] -->    if (dt < FRAME_INTERVAL) { requestAnimationFrame(draw); return; }<!-- [et_pb_line_break_holder] -->    lastFrame = now;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ \u0410\u0432\u0442\u043e-\u0442\u044e\u043d\u0438\u043d\u0433: \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c\/\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0448\u0430\u0433\u0438 \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435<!-- [et_pb_line_break_holder] -->    \/\/ \u0446\u0435\u043b\u0438\u043c\u0441\u044f < 23\u043c\u0441 \u043d\u0430 \u043a\u0430\u0434\u0440 \u0434\u043b\u044f \u0433\u043b\u0430\u0434\u043a\u043e\u0441\u0442\u0438<!-- [et_pb_line_break_holder] -->    if (dt > 26 && adaptiveSteps > 34){          \/\/ \u0434\u043e\u043b\u0433\u043e \u2014 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u0448\u0430\u0433\u0438<!-- [et_pb_line_break_holder] -->      adaptiveSteps -= 2; gl.uniform1f(u_steps, adaptiveSteps);<!-- [et_pb_line_break_holder] -->    } else if (dt < 18 &#038;&#038; adaptiveSteps < STEPS_TARGET){ \/\/ \u0431\u044b\u0441\u0442\u0440\u043e \u2014 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u043f\u043e\u043d\u0435\u043c\u043d\u043e\u0433\u0443<!-- [et_pb_line_break_holder] -->      adaptiveSteps += 1; gl.uniform1f(u_steps, adaptiveSteps);<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    if (dt > 30 && adaptiveScale > 0.60){        \/\/ \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u044f\u0436\u0435\u043b\u043e \u2014 \u0440\u0435\u0436\u0435\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431<!-- [et_pb_line_break_holder] -->      adaptiveScale = Math.max(0.60, adaptiveScale - 0.02);<!-- [et_pb_line_break_holder] -->      resize(); applyUniforms();<!-- [et_pb_line_break_holder] -->    } else if (dt < 17 &#038;&#038; adaptiveScale < RES_SCALE){ \/\/ \u0435\u0441\u0442\u044c \u0437\u0430\u043f\u0430\u0441 \u2014 \u0432\u0435\u0440\u043d\u0451\u043c \u043a\u0440\u0430\u0441\u043e\u0442\u0443<!-- [et_pb_line_break_holder] -->      adaptiveScale = Math.min(RES_SCALE, adaptiveScale + 0.01);<!-- [et_pb_line_break_holder] -->      resize(); applyUniforms();<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    gl.uniform1f(u_time, (now - start) * 0.001);<!-- [et_pb_line_break_holder] -->    gl.drawArrays(gl.TRIANGLES, 0, 3);<!-- [et_pb_line_break_holder] -->    requestAnimationFrame(draw);<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  requestAnimationFrame(draw);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ \u041f\u0430\u0443\u0437\u0430 \u043f\u0440\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u0438\/\u0443\u0445\u043e\u0434\u0435<!-- [et_pb_line_break_holder] -->  document.addEventListener('visibilitychange', ()=>{<!-- [et_pb_line_break_holder] -->    playing = !document.hidden;<!-- [et_pb_line_break_holder] -->    if(playing) requestAnimationFrame(draw);<!-- [et_pb_line_break_holder] -->  });<!-- [et_pb_line_break_holder] -->  window.addEventListener('pagehide', ()=>{ playing=false; });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  \/\/ \u041c\u044f\u0433\u043a\u0438\u0439 \u0431\u0443\u0441\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u043f\u0440\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 (\u043d\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u043e\u043a)<!-- [et_pb_line_break_holder] -->  let boostTO=null;<!-- [et_pb_line_break_holder] -->  function boost(){<!-- [et_pb_line_break_holder] -->    const baseSpeed = isLowEnd ? 0.50 : 0.56;<!-- [et_pb_line_break_holder] -->    base.flowSpeed = baseSpeed * 1.22;<!-- [et_pb_line_break_holder] -->    gl.uniform1f(u_flowSpeed, base.flowSpeed);<!-- [et_pb_line_break_holder] -->    clearTimeout(boostTO);<!-- [et_pb_line_break_holder] -->    boostTO = setTimeout(()=>{<!-- [et_pb_line_break_holder] -->      base.flowSpeed = baseSpeed;<!-- [et_pb_line_break_holder] -->      gl.uniform1f(u_flowSpeed, base.flowSpeed);<!-- [et_pb_line_break_holder] -->    }, 180);<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  window.addEventListener('mousemove', boost, { passive:true });<!-- [et_pb_line_break_holder] -->  window.addEventListener('touchmove', boost, { passive:true });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->})();<!-- [et_pb_line_break_holder] --><\/script><!-- [et_pb_line_break_holder] -->[\/et_pb_fullwidth_code][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"class_list":["post-71480","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/colorhair.ru\/index.php\/wp-json\/wp\/v2\/pages\/71480","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/colorhair.ru\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/colorhair.ru\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/colorhair.ru\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/colorhair.ru\/index.php\/wp-json\/wp\/v2\/comments?post=71480"}],"version-history":[{"count":0,"href":"https:\/\/colorhair.ru\/index.php\/wp-json\/wp\/v2\/pages\/71480\/revisions"}],"wp:attachment":[{"href":"https:\/\/colorhair.ru\/index.php\/wp-json\/wp\/v2\/media?parent=71480"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}